2261 lines
61 KiB
C++
2261 lines
61 KiB
C++
|
|
// The Start of the JawnWatch (JW)
|
|
#include <LilyGoLib.h>
|
|
#include <LV_Helper.h>
|
|
#include <time.h>
|
|
|
|
|
|
|
|
TFT_eSPI tft;
|
|
#include <UrlEncode.h>
|
|
#include <WiFi.h>
|
|
#include <WiFiClientSecure.h>
|
|
#include <WebServer.h>
|
|
#include <HTTPClient.h>
|
|
#include <Arduino_JSON.h>
|
|
#include <ESP32Time.h>
|
|
#include <WiFiAP.h>
|
|
|
|
#include "FS.h"
|
|
#include "FFat.h"
|
|
ESP32Time rtc;
|
|
|
|
// Flag used to indicate whether to use light sleep, currently unavailable
|
|
static bool lightSleep = true;
|
|
// Flag used for acceleration interrupt status
|
|
static bool sportsIrq = false;
|
|
// Flag used to indicate whether recording is enabled
|
|
static bool recordFlag = false;
|
|
// Flag used for PMU interrupt trigger status
|
|
static bool pmuIrq = false;
|
|
static bool webserver_enabled;// = true;
|
|
static bool wifi_ap_enabled = false;
|
|
static bool wifi_enabled = false;
|
|
char standby_en = 1;
|
|
#define DEFAULT_SCREEN_TIMEOUT 20*1000
|
|
String jw_room = "watch";
|
|
void settingSensor();
|
|
void settingPMU();
|
|
uint16_t t_x = 0, t_y = 0;
|
|
String authorization;
|
|
String authorization_json;
|
|
WebServer server(3000);
|
|
WiFiClientSecure *connexion = new WiFiClientSecure;
|
|
HTTPClient https;
|
|
String ssid = "jawn";
|
|
String base_ssid = ssid;
|
|
String password = "92ae2dd1414dff025e16775f1d";
|
|
String base_password = password;
|
|
String ap_ssid = "3";
|
|
String base_ap_ssid = ap_ssid;
|
|
String ap_password = "battlestargalactica";
|
|
String base_ap_password = ap_password;
|
|
int room = 1;
|
|
int room_count = 1;
|
|
int room_max = 6;
|
|
int b1_toggle, b2_toggle, b3_toggle, b4_toggle, b5_toggle, b6_toggle = 0;
|
|
String returner;
|
|
uint32_t lastMillis;
|
|
uint32_t buttonMillis = 0;
|
|
String before_me = "";
|
|
bool buttoned_before = false;
|
|
char bufsec[64];
|
|
char bufdate[64];
|
|
char buftime[64];
|
|
char *bufgwIP = new char[40]();
|
|
char *bufIP = new char[40]();
|
|
char *bufapIP = new char[40]();
|
|
char *bufapgwIP = new char[40]();
|
|
IPAddress apIP;
|
|
String homebase;
|
|
String homebaseIP;
|
|
String homebaseIPArray[10];
|
|
String wifi_update;
|
|
JSONVar wigi;
|
|
String computer_name;
|
|
static RTC_DATA_ATTR int brightnessLevel = 50;
|
|
int vibrateLevel = 50;
|
|
int volumeLevel = 50;
|
|
void lowPowerEnergyHandler();
|
|
String chat_room;
|
|
bool loraChatBroadcaster = false;
|
|
bool loraChatReceiver = false;
|
|
bool stepCounter = true;
|
|
uint32_t steps;
|
|
JSONVar stepped;
|
|
#include <driver/i2s.h>
|
|
#include <driver/gpio.h>
|
|
|
|
#include <AudioFileSourcePROGMEM.h>
|
|
#include <AudioFileSourceID3.h>
|
|
#include <AudioGeneratorMP3.h>
|
|
#include <AudioGeneratorWAV.h>
|
|
#include <AudioOutputI2S.h>
|
|
#include <AudioFileSourceFATFS.h>
|
|
|
|
AudioGeneratorMP3 *mp3;
|
|
AudioFileSourcePROGMEM *file;
|
|
AudioOutputI2S *out;
|
|
AudioFileSourceID3 *id3;
|
|
AudioGeneratorWAV *wav;
|
|
AudioFileSourceFATFS *file_fs;
|
|
|
|
|
|
#define FORMAT_FFAT true
|
|
|
|
SX1262 radio = newModule();
|
|
volatile bool operationDone = false;
|
|
bool transmitFlag = false;
|
|
void setFlag(void) {
|
|
// we sent or received a packet, set the flag
|
|
operationDone = true;
|
|
}
|
|
|
|
lv_obj_t * btn1;
|
|
lv_obj_t * btn2;
|
|
lv_obj_t * btn3;
|
|
lv_obj_t * btn4;
|
|
lv_obj_t * btn5;
|
|
lv_obj_t * btn6;
|
|
|
|
void setup() {
|
|
Serial.begin(921600);
|
|
Serial.println("setup started");
|
|
Serial.println("setup started time");
|
|
|
|
watch.begin();
|
|
setCpuFrequencyMhz(240);
|
|
Serial.println("setup started watch");
|
|
time_writer("now");
|
|
|
|
settingSensor();
|
|
Serial.println("setup started sensor");
|
|
|
|
//if (FORMAT_FFAT) FFat.format();
|
|
if (!FFat.begin()) {
|
|
Serial.println("FFat Mount Failed");
|
|
return;
|
|
}
|
|
else {
|
|
Serial.println("Mounted FFat partition");
|
|
Serial.printf("Total space: %10u\n", FFat.totalBytes());
|
|
Serial.printf("Free space: %10u\n", FFat.freeBytes());
|
|
}
|
|
|
|
// Serial.print(F("[SX1262] Initializing ... "));
|
|
// set output power to 10 dBm (accepted range is -17 - 22 dBm)
|
|
if (radio.setOutputPower(22) == RADIOLIB_ERR_INVALID_OUTPUT_POWER) {
|
|
// Serial.println(F("Selected output power is invalid for this module!"));
|
|
while (true);
|
|
}
|
|
// set over current protection limit to 80 mA (accepted range is 45 - 240 mA)
|
|
// NOTE: set value to 0 to disable overcurrent protection
|
|
if (radio.setCurrentLimit(80) == RADIOLIB_ERR_INVALID_CURRENT_LIMIT) {
|
|
// Serial.println(F("Selected current limit is invalid for this module!"));
|
|
while (true);
|
|
}
|
|
int state = radio.begin(433);
|
|
if (state == RADIOLIB_ERR_NONE) {
|
|
// Serial.println(F("success!"));
|
|
radio.setDio1Action(setFlag);
|
|
|
|
radio.startReceive();
|
|
} else {
|
|
// Serial.print(F("failed, code "));
|
|
// Serial.println(state);
|
|
while (true);
|
|
}
|
|
|
|
|
|
|
|
|
|
beginLvglHelper();
|
|
lv_obj_set_style_bg_color(lv_scr_act(), lv_color_hex(0x000000), LV_PART_MAIN);
|
|
|
|
|
|
// Set the interrupt handler of the PMU
|
|
watch.attachPMU(setPMUFlag);
|
|
watch.setSysPowerDownVoltage(2600);
|
|
setCpuFrequencyMhz(80);
|
|
button_writer();
|
|
|
|
settingPMU();
|
|
server.on("/", []() {
|
|
server.send(200, "text/plain", "<html><h1>JAWN WATCH!</h1><h4>Do you even know?</h4></html>");
|
|
});
|
|
server.on("/notification", []() {
|
|
notification_display(server.arg("title"), server.arg("notification"));;
|
|
server.send(200, "text/plain", "this works as well");
|
|
});
|
|
server.on("/wifi_update", []() {
|
|
String req = "https://" + homebaseIP + "/teletype/wifi_update?timestamp=" + rtc.getLocalEpoch();
|
|
// Serial.println(req);
|
|
wifi_update = https_request(req);
|
|
// Serial.println(wifi_update);
|
|
JSONVar info = JSON.parse(wifi_update);
|
|
if (ssid != (const char *)info["ssid"] || password != (const char *)info["password"]) {
|
|
ssid = (const char *)info["ssid"];
|
|
password = (const char *)info["password"];
|
|
WiFi.disconnect();
|
|
delay(400);
|
|
wifi_server();
|
|
}
|
|
if (ap_ssid != (const char *)info["ap_ssid"] && ap_password != (const char *)info["ap_password"]) {
|
|
ap_ssid = (const char *)info["ap_ssid"];
|
|
ap_password = (const char *)info["ap_password"];
|
|
// Serial.println(ssid);
|
|
// Serial.println(password);
|
|
// Serial.println(ap_ssid);
|
|
// Serial.println(ap_password);
|
|
accesspoint_stop();
|
|
delay(400);
|
|
accesspoint_start();
|
|
}
|
|
|
|
JSONVar pa;
|
|
pa["ap_ssid"] = ap_ssid;
|
|
pa["ap_password"] = ap_password;
|
|
String public_announcement = JSON.stringify(pa);
|
|
// radio.startTransmit(public_announcement);
|
|
// server.send(200, "text/plain", "done");
|
|
// delay(1000);
|
|
radio.startReceive();
|
|
server.send(200, "text/plain", "sent wifi info");
|
|
});
|
|
server.on("/send_telephone", []() {
|
|
Serial.println("send telephone");
|
|
String temp_authorization = server.arg("authorization");
|
|
Serial.println(temp_authorization);
|
|
Serial.println("in the temp auth");
|
|
JSONVar m;
|
|
m["msg"] = server.arg("msg");
|
|
m["app"] = server.arg("app");
|
|
String jsm = JSON.stringify(m);
|
|
Serial.println("Sending msg: " + jsm);
|
|
radio.startTransmit(jsm);
|
|
delay(1000);
|
|
radio.startReceive();
|
|
server.send(200, "text/plain", "transmission sent");
|
|
buttonMillis = millis();
|
|
lastMillis = millis();
|
|
pmuIrq = true;
|
|
});
|
|
|
|
server.on("/chat_received", []() {
|
|
if (buttoned_before) {
|
|
Serial.println(server.arg("s"));
|
|
String s = server.arg("s");
|
|
String uuid = server.arg("uuid");
|
|
chat_grabber(s,uuid);
|
|
server.send(200, "text/plain", "done");
|
|
}
|
|
else {
|
|
server.send(200, "text/plain", "unknown");
|
|
}
|
|
});
|
|
server.on("/device_query", []() {
|
|
JSONVar g;
|
|
String chip_id = chip_id_maker();
|
|
g["chip_id"] = chip_id;
|
|
g["name"] = "LilyGo T-Watch S3";
|
|
g["uptime"] = millis();
|
|
g["purpose"] = "watch";
|
|
String gs = JSON.stringify(g);
|
|
server.send(200, "text/plain", gs);
|
|
|
|
});
|
|
server.on("/wigi", []() {
|
|
String rauth = server.arg("authorization");
|
|
if (rauth == authorization) {
|
|
|
|
JSONVar wigi_s;
|
|
wigi_s["buttons"] = wigi;
|
|
wigi_s["measures"]["steps"] = stepped;
|
|
wigi_s["authorization"] = authorization;
|
|
long timestamp = rtc.getLocalEpoch() - rtc.offset;
|
|
|
|
wigi_s["timestamp"] = timestamp;
|
|
String wigis = JSON.stringify(wigi_s);
|
|
server.send(200,"text/plain", wigis);
|
|
String resetter = "[]";
|
|
wigi = JSON.parse(resetter);
|
|
stepped = JSON.parse(resetter);
|
|
watch.resetPedometer();
|
|
step_writer();
|
|
}
|
|
else {
|
|
server.send(200,"text/plain", "{}");
|
|
}
|
|
});
|
|
server.on("/now_me", []() {
|
|
homebaseIP = server.arg("homebase");
|
|
homebase = server.arg("ip");
|
|
authorization = server.arg("authorization");
|
|
long timestamp = server.arg("timestamp").toInt();
|
|
rtc.setTime(timestamp);
|
|
long offset = server.arg("offset").toInt();
|
|
rtc.offset = offset;
|
|
Serial.println("Homebase: " + homebase);
|
|
Serial.println("homebase ip:" + homebaseIP);
|
|
|
|
room_count = server.arg("room_count").toInt();
|
|
// room_max = server.arg("room_max").toInt();
|
|
|
|
pmuIrq = true;
|
|
buttoned_before = false;
|
|
// Serial.println("now me in room " + room);
|
|
b1_toggle, b2_toggle, b3_toggle, b4_toggle, b5_toggle, b6_toggle = 0;
|
|
Serial.println(authorization);
|
|
//call_the_president();
|
|
remote_room();
|
|
buttonMillis = millis();
|
|
lastMillis = millis();
|
|
|
|
Serial.println("Called President at " + homebaseIP);
|
|
server.send(200, "text/plain", "homebase ip is now " + homebaseIP);
|
|
});
|
|
// wifi_server();
|
|
watch.enableSystemVoltageMeasure();
|
|
readFile(FFat, "/bootreport.txt");
|
|
if (returner == "success") {
|
|
configRestore();
|
|
Serial.println("After the restore");
|
|
}
|
|
lv_task_handler();
|
|
|
|
}
|
|
|
|
|
|
void chat_grabber(String s, String uuid) {
|
|
Serial.println(s);
|
|
if (authorization) {
|
|
String request = "https://" + homebaseIP + "/watch/chat_grabber?s=" + s + "&uuid=" + uuid;
|
|
Serial.println(request);
|
|
String response = https_request(request);
|
|
Serial.println(response);
|
|
JSONVar mail = JSON.parse(response);
|
|
buttonMillis = millis();
|
|
String manager_file = mail["manager_file"];
|
|
String body = mail["body"];
|
|
long timestamp = mail["timestamp"];
|
|
loraChatBroadcast(manager_file, body, timestamp);
|
|
}
|
|
}
|
|
|
|
void loraChatBroadcast(String computer_name, String body, long timestamp) {
|
|
if (loraChatBroadcaster) {
|
|
|
|
JSONVar msg;
|
|
msg["u"] = computer_name;
|
|
msg["m"] = body;
|
|
|
|
String returns = JSON.stringify(msg);
|
|
Serial.println(returns);
|
|
radio.startTransmit(returns);
|
|
Serial.println("transmitted");
|
|
// delay(2000);
|
|
// radio.startReceive();
|
|
Serial.println("back to listening");
|
|
}
|
|
}
|
|
|
|
void step_writer() {
|
|
if (sportsIrq && stepCounter == true) {
|
|
uint16_t status = watch.readBMA();
|
|
Serial.println("activity " + status);
|
|
steps = watch.getPedometerCounter();
|
|
JSONVar last_step;
|
|
long timestamp = rtc.getLocalEpoch() - rtc.offset;
|
|
|
|
int l = stepped.length();
|
|
last_step["timestamp"] = timestamp;
|
|
last_step["steps"] = steps;
|
|
stepped[l] = last_step;
|
|
sportsIrq = false;
|
|
String stepper = JSON.stringify(stepped);
|
|
Serial.println(stepper);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
void loop() {
|
|
char count = 0;;
|
|
// watch.attachPMU(setPMUFlag);
|
|
|
|
if (jw_room == "watch") {
|
|
time_writer("loop");
|
|
step_writer();
|
|
}
|
|
else if (jw_room == "net") {
|
|
ip_writer();
|
|
}
|
|
else if (jw_room == "message") {
|
|
if (buttonMillis != 0 && millis() - buttonMillis > DEFAULT_SCREEN_TIMEOUT && count < 350) {
|
|
lowPowerEnergyHandler();
|
|
count = 0;
|
|
jw_room = "watch";
|
|
}
|
|
else {
|
|
count++;
|
|
}
|
|
delay(60);
|
|
}
|
|
watch.setTextFont(2);
|
|
int volts = watch.getBatteryPercent();
|
|
if (volts < 20) {
|
|
watch.setTextColor(TFT_RED, TFT_BLACK);
|
|
}
|
|
else if (volts < 40) {
|
|
watch.setTextColor(TFT_YELLOW, TFT_BLACK);
|
|
}
|
|
else {
|
|
watch.setTextColor(TFT_GREEN, TFT_BLACK);
|
|
}
|
|
watch.drawNumber(watch.getBattVoltage(), 214, 5 );
|
|
watch.drawNumber(watch.getBatteryPercent(), 15, 5);
|
|
watch.drawString("%", 29, 5);
|
|
if (computer_name != "") {
|
|
watch.drawString(computer_name, 120, 5);
|
|
}
|
|
else {
|
|
watch.drawString(homebaseIP, 120, 5);
|
|
}
|
|
touch_watch();
|
|
if (buttonMillis == 0 && sportsIrq == 0) {
|
|
setSportsFlag();
|
|
settingPMU();
|
|
pmuIrq = false;
|
|
buttonMillis = millis();
|
|
}
|
|
|
|
|
|
if (!pmuIrq) {
|
|
lv_task_handler();
|
|
if (webserver_enabled == true) {
|
|
server.handleClient();
|
|
}
|
|
delay(5);
|
|
}
|
|
else {
|
|
lowPowerEnergyHandler();
|
|
}
|
|
if (loraChatReceiver) {
|
|
readRadio();
|
|
}
|
|
if (buttonMillis != 0 && millis() - buttonMillis > DEFAULT_SCREEN_TIMEOUT) {
|
|
lowPowerEnergyHandler();
|
|
}
|
|
|
|
}
|
|
|
|
void readRadio() {
|
|
if (operationDone) {
|
|
operationDone = false;
|
|
String str;
|
|
int state = radio.readData(str);
|
|
if (state == RADIOLIB_ERR_NONE) {
|
|
// packet was successfully received
|
|
// Serial.println(F("[SX1262] Received packet!"));
|
|
|
|
// print data of the packet
|
|
// Serial.print(F("[SX1262] Data:\t\t"));
|
|
// Serial.println(str);
|
|
|
|
// print RSSI (Received Signal Strength Indicator)
|
|
// Serial.print(F("[SX1262] RSSI:\t\t"));
|
|
// Serial.print(radio.getRSSI());
|
|
// Serial.println(F(" dBm"));
|
|
|
|
// print SNR (Signal-to-Noise Ratio)
|
|
// Serial.print(F("[SX1262] SNR:\t\t"));
|
|
// Serial.print(radio.getSNR());
|
|
// Serial.println(F(" dB"));
|
|
radio.startReceive();
|
|
|
|
JSONVar js = JSON.parse(str);
|
|
String string = JSON.stringify(js);
|
|
Serial.println(str);
|
|
String ssid_check = (const char *)js["ap_ssid"];
|
|
String msg_check = (const char *)js["msg"];
|
|
String chat_check = (const char *)js["m"];
|
|
if (chat_check != "") {
|
|
String username = js["u"];
|
|
String message = js["m"];
|
|
Serial.println(str);
|
|
if (authorization != "") {
|
|
String request = "https://" + homebaseIP + "/watch/chat_received?message=" + urlEncode(message) + "&username=" + urlEncode(username);
|
|
Serial.println(request);
|
|
String information = https_request(request);
|
|
Serial.println(information);
|
|
}
|
|
}
|
|
else if (ssid_check != "") {
|
|
Serial.println("Got an ssid " + ssid_check);
|
|
ssid = (const char *)js["ap_ssid"];
|
|
password = (const char *)js["ap_password"];
|
|
|
|
webserver_enabled = true;
|
|
wifi_server();
|
|
delay(1000);
|
|
// Serial.print("Transmitting...");
|
|
|
|
JSONVar returner;
|
|
returner["time"] = rtc.getLocalEpoch();
|
|
String returns = JSON.stringify(returner);
|
|
// radio.startTransmit(returns);
|
|
// Serial.println(returns);
|
|
// delay(1000);
|
|
}
|
|
else if (msg_check != "") {
|
|
buttonMillis = millis();
|
|
lastMillis = millis();
|
|
pmuIrq = true;
|
|
String app = (const char *)js["app"];
|
|
|
|
Serial.println("Got a message: " + msg_check);
|
|
JSONVar result = JSON.parse(https_request(
|
|
"https://" + homebaseIP +
|
|
"/watch/telephone_msg?timestamp=" + rtc.getLocalEpoch() +
|
|
"&msg=" + msg_check + "&app=" + app
|
|
));
|
|
String rs = JSON.stringify(result);
|
|
Serial.println(rs);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
void wifi_server() {
|
|
if (ssid == "" && password == "") {
|
|
wifi_enabled = false;
|
|
return;
|
|
}
|
|
if (wifi_enabled == true) {
|
|
if (WiFi.status() != WL_CONNECTED) {
|
|
WiFi.begin(ssid, password);
|
|
}
|
|
int tryDelay = 420;
|
|
int numberOfTries = 12;
|
|
while (true) {
|
|
|
|
switch (WiFi.status()) {
|
|
case WL_NO_SSID_AVAIL:
|
|
// Serial.println("[WiFi] SSID not found");
|
|
break;
|
|
case WL_CONNECT_FAILED:
|
|
// Serial.print("[WiFi] Failed - WiFi not connected! Reason: ");
|
|
return;
|
|
break;
|
|
case WL_CONNECTION_LOST:
|
|
// Serial.println("[WiFi] Connection was lost");
|
|
break;
|
|
case WL_SCAN_COMPLETED:
|
|
// Serial.println("[WiFi] Scan is completed");
|
|
break;
|
|
case WL_DISCONNECTED:
|
|
// Serial.println("[WiFi] WiFi is disconnected");
|
|
break;
|
|
case WL_CONNECTED:
|
|
// Serial.println("[WiFi] WiFi is connected!");
|
|
// Serial.print("[WiFi] IP address: ");
|
|
// Serial.println(WiFi.localIP());
|
|
server.begin();
|
|
webserver_enabled = true;
|
|
wifi_enabled = true;
|
|
return;
|
|
break;
|
|
default:
|
|
// Serial.print("[WiFi] WiFi Status: ");
|
|
// Serial.println(WiFi.status());
|
|
break;
|
|
}
|
|
delay(tryDelay);
|
|
if (numberOfTries <= 0) {
|
|
Serial.print("Wifi failed to connect");
|
|
Serial.print(ssid + " " + password);
|
|
WiFi.disconnect();
|
|
wifi_enabled = false;
|
|
return;
|
|
}
|
|
else {
|
|
numberOfTries--;
|
|
}
|
|
}
|
|
while (WiFi.status() != WL_CONNECTED) {
|
|
delay(100);
|
|
// Serial.print(".");
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void notification_display(String title, String notification) {
|
|
jw_room = "message";
|
|
|
|
|
|
static const char *btns[] = {""};
|
|
|
|
int t_length = title.length() + 1;
|
|
int n_length = notification.length() + 1;
|
|
char t[t_length];
|
|
char n[n_length];
|
|
|
|
title.toCharArray(t, t_length);
|
|
notification.toCharArray(n, n_length);
|
|
|
|
lv_obj_t * mb = lv_msgbox_create(lv_scr_act(), t, n, btns, true);
|
|
|
|
|
|
// lv_obj_center(mb);
|
|
lv_obj_set_y(mb, 35);
|
|
|
|
lv_task_handler();
|
|
wakeup();
|
|
}
|
|
|
|
void wakeup() {
|
|
// Serial.println("Wakeup");
|
|
watch.configreFeatureInterrupt(
|
|
SensorBMA423::INT_STEP_CNTR | // Pedometer interrupt
|
|
SensorBMA423::INT_ACTIVITY | // Activity interruption
|
|
SensorBMA423::INT_TILT | // Tilt interrupt
|
|
// SensorBMA423::INT_WAKEUP | // DoubleTap interrupt
|
|
SensorBMA423::INT_ANY_NO_MOTION,// Any motion / no motion interrupt
|
|
true);
|
|
watch.incrementalBrightness(brightnessLevel);
|
|
//display_exit();
|
|
buttonMillis = millis();
|
|
lastMillis = millis();
|
|
pmuIrq = false;
|
|
watch.setWaveform(0, vibrateLevel); // play effect
|
|
// play the effect!
|
|
watch.run();
|
|
|
|
|
|
}
|
|
|
|
void display_exit( void ) {
|
|
lv_obj_clean ( lv_scr_act() ); // Clean objects from current screen.
|
|
lv_obj_invalidate( lv_scr_act() ); // Invalidate objects for redraw.
|
|
button_writer();
|
|
// time_writer("now");
|
|
}
|
|
|
|
void time_writer(char * situation) {
|
|
if (situation == "now") {
|
|
tft.fillScreen(TFT_BLACK);
|
|
}
|
|
if (millis() - lastMillis > 1000 || situation == "now") {
|
|
|
|
lastMillis = millis();
|
|
|
|
struct tm timeinfo;
|
|
// Get the time C library structure
|
|
watch.getDateTime(&timeinfo);
|
|
size_t written_date = strftime(bufdate, 64, "%a %b %d %Y", &timeinfo);
|
|
size_t written_time = strftime(buftime, 64, "%H:%M", &timeinfo);
|
|
size_t written_sec = strftime(bufsec, 64, "%S", &timeinfo);
|
|
watch.setTextFont(2);
|
|
watch.setTextColor(TFT_YELLOW, TFT_BLACK);
|
|
if (written_date != 0) {
|
|
|
|
watch.drawString(bufdate, 120, 20);
|
|
}
|
|
if (written_time != 0) {
|
|
watch.setTextFont(8);
|
|
watch.drawString(buftime, 120, 70);
|
|
}
|
|
if (written_sec != 0) {
|
|
watch.setTextFont(4);
|
|
watch.drawString(bufsec, 120, 130);
|
|
}
|
|
if (stepCounter == true) {
|
|
watch.setCursor(10,140);
|
|
watch.print(steps);
|
|
}
|
|
}
|
|
}
|
|
|
|
void ip_writer() {
|
|
watch.setTextFont(2);
|
|
IPAddress ip = WiFi.localIP();
|
|
sprintf(bufIP, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
|
|
watch.setTextColor(TFT_BLACK, TFT_WHITE);
|
|
IPAddress gw_ip = WiFi.gatewayIP();
|
|
sprintf(bufgwIP, "%d.%d.%d.%d", gw_ip[0], gw_ip[1], gw_ip[2], gw_ip[3]);
|
|
watch.drawString(bufIP, 50, 130);
|
|
watch.drawString(bufgwIP, 190, 130);
|
|
if (wifi_ap_enabled) {
|
|
apIP = WiFi.softAPIP();
|
|
sprintf(bufapIP, "%d.%d.%d.%d", apIP[0], apIP[1], apIP[2], apIP[3] );
|
|
watch.drawString(bufapIP, 50, 150);
|
|
watch.drawString(bufapgwIP, 190, 150);
|
|
}
|
|
}
|
|
|
|
void button_writer() {
|
|
btn1 = lv_btn_create(lv_scr_act());
|
|
lv_obj_add_event_cb(btn1, touch_button1, LV_EVENT_CLICKED, NULL);
|
|
lv_obj_set_pos(btn1, 65, 190 );
|
|
lv_obj_set_size(btn1, 50, 50 );
|
|
lv_obj_set_style_bg_color(btn1, lv_color_hex(0xde2716), LV_PART_MAIN);
|
|
|
|
lv_obj_t *l1;
|
|
lv_color_t t1;
|
|
t1 = lv_color_make(0,0,0);
|
|
lv_obj_set_style_text_color(btn1, t1, LV_PART_MAIN);
|
|
l1 = lv_label_create(btn1);
|
|
lv_label_set_text(l1, "Rom");
|
|
lv_obj_center(l1);
|
|
|
|
btn2 = lv_btn_create(lv_scr_act());
|
|
lv_obj_add_event_cb(btn2, touch_button2, LV_EVENT_CLICKED, NULL);
|
|
lv_obj_set_pos(btn2, 10, 190 );
|
|
lv_obj_set_size(btn2, 50, 50 );
|
|
lv_obj_set_style_bg_color(btn2, lv_color_hex(0xffca38), LV_PART_MAIN);
|
|
|
|
lv_obj_t *l2;
|
|
lv_color_t t2;
|
|
t2 = lv_color_make(0,0,0);
|
|
lv_obj_set_style_text_color(btn2, t2, LV_PART_MAIN);
|
|
l2 = lv_label_create(btn2);
|
|
lv_label_set_text(l2, "Clk");
|
|
lv_obj_center(l2);
|
|
|
|
btn3 = lv_btn_create(lv_scr_act());
|
|
lv_obj_add_event_cb(btn3, touch_button3, LV_EVENT_CLICKED, NULL);
|
|
lv_obj_set_pos(btn3, 120, 190 );
|
|
lv_obj_set_size(btn3, 50, 50 );
|
|
lv_obj_set_style_bg_color(btn3, lv_color_hex(0xfa3ced), LV_PART_MAIN);
|
|
|
|
lv_obj_t *l3;
|
|
lv_color_t t3;
|
|
t3 = lv_color_make(0,0,0);
|
|
lv_obj_set_style_text_color(btn3, t3, LV_PART_MAIN);
|
|
l3 = lv_label_create(btn3);
|
|
lv_label_set_text(l3, "Set");
|
|
lv_obj_center(l3);
|
|
|
|
btn6 = lv_btn_create(lv_scr_act());
|
|
lv_obj_add_event_cb(btn6, touch_button4, LV_EVENT_CLICKED, NULL);
|
|
lv_obj_set_pos(btn6, 175, 190 );
|
|
lv_obj_set_size(btn6, 50, 50 );
|
|
lv_obj_set_style_bg_color(btn6, lv_color_hex(0x1aacfd), LV_PART_MAIN);
|
|
|
|
lv_obj_t *l6;
|
|
lv_color_t t6;
|
|
t6 = lv_color_make(0,0,0);
|
|
lv_obj_set_style_text_color(btn6, t6, LV_PART_MAIN);
|
|
l6 = lv_label_create(btn6);
|
|
lv_label_set_text(l6, "Net");
|
|
lv_obj_center(l6);
|
|
|
|
lv_task_handler();
|
|
}
|
|
|
|
|
|
void https_download(fs::FS &fs, String url, String filename) {
|
|
url = url_maker(url);
|
|
Serial.println("In the https download");
|
|
Serial.println(url);
|
|
connexion -> setInsecure();
|
|
if (connexion) {
|
|
{
|
|
if (https.begin(*connexion, url)) {
|
|
|
|
int httpCode = https.GET();
|
|
Serial.println("Did a get");
|
|
Serial.println(httpCode);
|
|
if (httpCode > 0) {
|
|
|
|
if (httpCode == HTTP_CODE_OK) {
|
|
// writeFile(FFat, filename.c_str(), "");
|
|
|
|
int len = https.getSize();
|
|
Serial.println(len);
|
|
uint8_t buff[1048] = { 0 };
|
|
|
|
WiFiClient * stream = https.getStreamPtr();
|
|
while (https.connected() && (len > 0 || len == -1)) {
|
|
// read up to 128 byte
|
|
size_t size = stream->available();
|
|
Serial.println(size);
|
|
if (size) {
|
|
Serial.println("Got a size");
|
|
int c = stream->readBytes(buff, ((size > sizeof(buff)) ? sizeof(buff) : size));
|
|
|
|
// write it to Serial
|
|
// Serial.write(buff, c);
|
|
appendFile(FFat, filename.c_str(), (char *) buff);
|
|
if (len > 0) {
|
|
len -= c;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
https.end();
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
String chip_id_maker() {
|
|
uint32_t chipId = 0;
|
|
for(int i=0; i<17; i=i+8) {
|
|
chipId |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i;
|
|
}
|
|
String chip_id = String(chipId);
|
|
return chip_id;
|
|
}
|
|
|
|
String url_maker(String url) {
|
|
String chip_id = chip_id_maker();
|
|
long timestamp = rtc.getLocalEpoch() - rtc.offset;
|
|
url = url + "&edt=watch&chip_id=" + chip_id + "&authorization=" + authorization + "×tamp=" + timestamp;
|
|
return url;
|
|
}
|
|
|
|
String https_request(String url) {
|
|
url = url_maker(url);
|
|
Serial.println(url);
|
|
WiFiClientSecure *connexion = new WiFiClientSecure;
|
|
String https_returner = "failure";
|
|
connexion -> setInsecure();
|
|
if (connexion) {
|
|
// Serial.println ("there is a connection");
|
|
{
|
|
HTTPClient https;
|
|
if (https.begin(*connexion, url)) {
|
|
Serial.println("est connection");
|
|
int httpCode = https.GET();
|
|
|
|
if (httpCode > 0) {
|
|
Serial.printf("HTTPS GET code: %d\n", httpCode);
|
|
|
|
if (httpCode == HTTP_CODE_OK) {
|
|
String payload = https.getString();
|
|
Serial.print(payload);
|
|
Serial.println(payload);
|
|
return payload;
|
|
|
|
}
|
|
}
|
|
else {
|
|
// Serial.printf("HTTPS FAILED error: %s\n", https.errorToString(httpCode).c_str());
|
|
writeFile(FFat, "/bootreport.txt", "failure");
|
|
|
|
return "failure";
|
|
}
|
|
https.end();
|
|
}
|
|
}
|
|
}
|
|
return https_returner;
|
|
}
|
|
|
|
void call_the_president() {
|
|
// Serial.println("dans presidente");
|
|
// Serial.println(before_me);
|
|
// Serial.println("copy");
|
|
JSONVar result;
|
|
|
|
if (!buttoned_before) {
|
|
String req = "https://" + homebaseIP + "/watch?room=" + room;
|
|
Serial.println(req);
|
|
String watchRequest = https_request(req);
|
|
Serial.println(watchRequest);
|
|
if (watchRequest != "failure") {
|
|
Serial.println("President doesnt see it as a failure");
|
|
before_me = watchRequest;
|
|
buttoned_before = true;
|
|
result = JSON.parse(before_me);
|
|
|
|
// Serial.println(before_me);
|
|
int32_t year = result["__specs"]["time"]["year"];
|
|
int32_t month = result["__specs"]["time"]["month"];
|
|
int32_t day = result["__specs"]["time"]["day"];;
|
|
int32_t hour = result["__specs"]["time"]["hour"];
|
|
int32_t minute = result["__specs"]["time"]["min"];
|
|
int32_t second = result["__specs"]["time"]["sec"];
|
|
|
|
watch.setDateTime(year, month, day, hour, minute, second);
|
|
// Reading time synchronization from RTC to system time
|
|
watch.hwClockRead();
|
|
buttonMillis = millis();
|
|
lastMillis = millis();
|
|
|
|
}
|
|
else {
|
|
writeFile(FFat, "/bootreport.txt", "failure");
|
|
|
|
}
|
|
Serial.println("after watch request");
|
|
|
|
}
|
|
else {
|
|
Serial.println("Not buttoned before");
|
|
}
|
|
|
|
}
|
|
|
|
void presidents_buttons() {
|
|
JSONVar result;
|
|
Serial.println("in the buttons");
|
|
lv_obj_t * led1 = lv_led_create(lv_scr_act());
|
|
lv_obj_set_pos(led1, 10, 160 );
|
|
lv_led_set_color(led1, lv_palette_main(LV_PALETTE_RED));
|
|
lv_led_off(led1);
|
|
lv_obj_t * led2 = lv_label_create(lv_scr_act());
|
|
lv_obj_set_pos(led2, 45, 160);
|
|
lv_obj_set_style_text_color(led2, lv_palette_main(LV_PALETTE_GREEN), LV_PART_MAIN);
|
|
|
|
if (!buttoned_before) {
|
|
watch.drawString("Ne pas Presidente", 80, 80);
|
|
lv_led_off(led1);
|
|
return;
|
|
}
|
|
else {
|
|
result = JSON.parse(before_me);
|
|
}
|
|
if (wigi.length() > 0) {
|
|
lv_led_on(led1);
|
|
int wl = wigi.length();
|
|
char wil[4];
|
|
itoa( wl, wil, 10 );
|
|
lv_label_set_text(led2, wil);
|
|
}
|
|
else {
|
|
lv_label_set_text(led2, "0");
|
|
}
|
|
Serial.println("after before me parsing");
|
|
if (room > room_count) { room = 1; }
|
|
int sb = ((room - 1) * 6) + 1;
|
|
|
|
// Serial.println(room);
|
|
// Serial.println(sb);
|
|
lv_obj_t * b1 = lv_btn_create(lv_scr_act());
|
|
lv_obj_add_event_cb(b1, mb1, LV_EVENT_CLICKED, NULL);
|
|
lv_obj_set_pos(b1, 10, 10 );
|
|
lv_obj_set_size(b1, 60, 60 );
|
|
lv_color_t c1;
|
|
lv_color_t t1;
|
|
int tog1 = result["b" + String(sb)]["toggle"];
|
|
|
|
if (tog1 == 1) {
|
|
t1 = lv_color_make(0,0,0);
|
|
c1 = lv_color_make(255,255,0);
|
|
}
|
|
else {
|
|
c1 = lv_color_make(result["b" + String(sb)]["rgb"][0], result["b" + String(sb)]["rgb"][1], result["b" + String(sb)]["rgb"][2]);
|
|
t1 = lv_color_make(255,255,255);
|
|
}
|
|
lv_obj_set_style_text_color(b1, t1, LV_PART_MAIN);
|
|
lv_obj_set_style_bg_color(b1, c1, LV_PART_MAIN);
|
|
lv_obj_t *l1;
|
|
l1 = lv_label_create(b1);
|
|
lv_label_set_text(l1, result["b" + String(sb)]["shorthand_name"]);
|
|
lv_obj_center(l1);
|
|
|
|
sb = sb + 1;
|
|
// Serial.println(sb + ' toggle:' + b1_toggle);
|
|
lv_obj_t * b2 = lv_btn_create(lv_scr_act());
|
|
lv_obj_add_event_cb(b2, mb2, LV_EVENT_CLICKED, NULL);
|
|
lv_obj_set_pos(b2, 90, 10 );
|
|
lv_obj_set_size(b2, 60, 60 );
|
|
lv_color_t c2;
|
|
lv_color_t t2;
|
|
int tog2 = result["b" + String(sb)]["toggle"];
|
|
|
|
if (tog2 == 1) {
|
|
t2 = lv_color_make(0,0,0);
|
|
c2 = lv_color_make(255,255,0);
|
|
}
|
|
else {
|
|
c2 = lv_color_make(result["b" + String(sb)]["rgb"][0], result["b" + String(sb)]["rgb"][1], result["b" + String(sb)]["rgb"][2]);
|
|
t2 = lv_color_make(255,255,255);
|
|
}
|
|
lv_obj_set_style_bg_color(b2, c2, LV_PART_MAIN);
|
|
lv_obj_set_style_text_color(b2, t2, LV_PART_MAIN);
|
|
lv_obj_t *l2;
|
|
l2 = lv_label_create(b2);
|
|
lv_label_set_text(l2, result["b" + String(sb)]["shorthand_name"]);
|
|
lv_obj_center(l2);
|
|
|
|
sb = sb + 1;
|
|
// Serial.println(sb + ' toggle:' + b2_toggle);
|
|
lv_obj_t * b3 = lv_btn_create(lv_scr_act());
|
|
lv_obj_add_event_cb(b3, mb3, LV_EVENT_CLICKED, NULL);
|
|
lv_obj_set_pos(b3, 170, 10 );
|
|
lv_obj_set_size(b3, 60, 60 );
|
|
lv_color_t c3;
|
|
lv_color_t t3;
|
|
int tog3 = result["b" + String(sb)]["toggle"];
|
|
|
|
if (tog3 == 1) {
|
|
t3 = lv_color_make(0,0,0);
|
|
c3 = lv_color_make(255,255,0);
|
|
}
|
|
else {
|
|
c3 = lv_color_make(result["b" + String(sb)]["rgb"][0], result["b" + String(sb)]["rgb"][1], result["b" + String(sb)]["rgb"][2]);
|
|
t3 = lv_color_make(255,255,255);
|
|
}
|
|
lv_obj_set_style_text_color(b3, t3, LV_PART_MAIN);
|
|
lv_obj_set_style_bg_color(b3, c3, LV_PART_MAIN);
|
|
lv_obj_t *l3;
|
|
l3 = lv_label_create(b3);
|
|
lv_label_set_text(l3, result["b" + String(sb)]["shorthand_name"]);
|
|
lv_obj_center(l3);
|
|
|
|
sb = sb + 1;
|
|
// Serial.println(sb + ' toggle:' + b3_toggle);
|
|
lv_obj_t * b4 = lv_btn_create(lv_scr_act());
|
|
lv_obj_add_event_cb(b4, mb4, LV_EVENT_CLICKED, NULL);
|
|
lv_obj_set_pos(b4, 10, 90 );
|
|
lv_obj_set_size(b4, 60, 60 );
|
|
lv_color_t c4;
|
|
lv_color_t t4;
|
|
int tog4 = result["b" + String(sb)]["toggle"];
|
|
|
|
if (tog4 == 1) {
|
|
t4 = lv_color_make(0,0,0);
|
|
c4 = lv_color_make(255,255,0);
|
|
}
|
|
else {
|
|
c4 = lv_color_make(result["b" + String(sb)]["rgb"][0], result["b" + String(sb)]["rgb"][1], result["b" + String(sb)]["rgb"][2]);
|
|
t4 = lv_color_make(255,255,255);
|
|
}
|
|
lv_obj_set_style_text_color(b4, t4, LV_PART_MAIN);
|
|
lv_obj_set_style_bg_color(b4, c4, LV_PART_MAIN);
|
|
lv_obj_t *l4;
|
|
l4 = lv_label_create(b4);
|
|
lv_label_set_text(l4, result["b" + String(sb)]["shorthand_name"]);
|
|
lv_obj_center(l4);
|
|
|
|
sb = sb + 1;
|
|
// Serial.println(sb + ' toggle:' + b4_toggle);
|
|
lv_obj_t * b5 = lv_btn_create(lv_scr_act());
|
|
lv_obj_add_event_cb(b5, mb5, LV_EVENT_CLICKED, NULL);
|
|
lv_obj_set_pos(b5, 90, 90 );
|
|
lv_obj_set_size(b5, 60, 60 );
|
|
lv_color_t c5;
|
|
lv_color_t t5;
|
|
int tog5 = result["b" + String(sb)]["toggle"];
|
|
|
|
if (tog5 == 1) {
|
|
t5 = lv_color_make(0,0,0);
|
|
c5 = lv_color_make(255,255,0);
|
|
}
|
|
else {
|
|
t5 = lv_color_make(255,255,255);
|
|
c5 = lv_color_make(result["b" + String(sb)]["rgb"][0], result["b" + String(sb)]["rgb"][1], result["b" + String(sb)]["rgb"][2]);
|
|
}
|
|
lv_obj_set_style_text_color(b5, t5, LV_PART_MAIN);
|
|
lv_obj_set_style_bg_color(b5, c5, LV_PART_MAIN);
|
|
lv_obj_t *l5;
|
|
l5 = lv_label_create(b5);
|
|
lv_label_set_text(l5, result["b" + String(sb)]["shorthand_name"]);
|
|
lv_obj_center(l5);
|
|
|
|
sb = sb + 1;
|
|
// Serial.println(sb + ' toggle:' + b5_toggle);
|
|
// Serial.println("b" + String(sb));
|
|
lv_obj_t * b6 = lv_btn_create(lv_scr_act());
|
|
lv_obj_add_event_cb(b6, mb6, LV_EVENT_CLICKED, NULL);
|
|
lv_obj_set_pos(b6, 170, 90 );
|
|
lv_obj_set_size(b6, 60, 60 );
|
|
lv_color_t c6;
|
|
lv_color_t t6;
|
|
// Serial.println(result["b" + String(sb)]["toggle"]);
|
|
int tog6 = result["b" + String(sb)]["toggle"];
|
|
if (tog6 == 1) {
|
|
c6 = lv_color_make(255,255,0);
|
|
t6 = lv_color_make(0,0,0);
|
|
}
|
|
else {
|
|
c6 = lv_color_make(result["b" + String(sb)]["rgb"][0], result["b" + String(sb)]["rgb"][1], result["b" + String(sb)]["rgb"][2]);
|
|
t6 = lv_color_make(255,255,255);
|
|
}
|
|
lv_obj_set_style_bg_color(b6, c6, LV_PART_MAIN);
|
|
lv_obj_set_style_text_color(b6, t6, LV_PART_MAIN);
|
|
|
|
lv_obj_t *l6;
|
|
l6 = lv_label_create(b6);
|
|
lv_label_set_text(l6, result["b" + String(sb)]["shorthand_name"]);
|
|
lv_obj_center(l6);
|
|
buttonMillis = millis();
|
|
}
|
|
|
|
static void touch_button1(lv_event_t *e) {
|
|
if (jw_room == "room") {
|
|
if (room == room_count) {
|
|
room = 1;
|
|
|
|
}
|
|
else {
|
|
room++;
|
|
}
|
|
}
|
|
remote_room();
|
|
}
|
|
|
|
void remote_room() {
|
|
jw_room = "room";
|
|
display_exit();
|
|
watch.fillScreen(TFT_BLACK);
|
|
call_the_president();
|
|
presidents_buttons();
|
|
button_writer();
|
|
}
|
|
|
|
unsigned long getTime() {
|
|
time_t now;
|
|
struct tm timeinfo;
|
|
if (!getLocalTime(&timeinfo)) {
|
|
//Serial.println("Failed to obtain time");
|
|
return (0);
|
|
}
|
|
time(&now);
|
|
return now;
|
|
}
|
|
|
|
void when_i_get_in(JSONVar wigi_item) {
|
|
|
|
int l = wigi.length();
|
|
if (l < 0) {
|
|
l = 0;
|
|
}
|
|
long timestamp = rtc.getLocalEpoch() - rtc.offset;
|
|
wigi_item["timestamp"] = timestamp;
|
|
int room = wigi_item["room"];
|
|
int button = wigi_item["button"];
|
|
|
|
JSONVar bm = JSON.parse(before_me);
|
|
|
|
int rooming = (((room - 1 ) * room_max) + button);
|
|
String roomings = String(rooming);
|
|
JSONVar buttonski = bm["b" + roomings];
|
|
String bs = JSON.stringify(buttonski);
|
|
|
|
String movement = (const char *)buttonski["movement"];
|
|
int toggle = buttonski["toggle"];
|
|
|
|
if (movement == "start") {
|
|
if (toggle == 1) {
|
|
bm["b" + roomings]["toggle"] = 0;
|
|
}
|
|
else {
|
|
bm["b" + roomings]["toggle"] = 1;
|
|
}
|
|
before_me = JSON.stringify(bm);
|
|
presidents_buttons();
|
|
}
|
|
|
|
|
|
wigi[l] = wigi_item;
|
|
}
|
|
|
|
void mb1(lv_event_t *e) {
|
|
if (b1_toggle == 0) {
|
|
b1_toggle = 1;
|
|
} else {
|
|
b1_toggle = 0;
|
|
}
|
|
String https = https_request(
|
|
"https://" + homebaseIP +
|
|
"/watch/button?room=" + room +
|
|
"&button=1&toggle=" + b1_toggle
|
|
);
|
|
if (https == "failure") {
|
|
JSONVar updater;
|
|
updater["room"] = room;
|
|
updater["button"] = 1;
|
|
updater["toggle"] = b1_toggle;
|
|
when_i_get_in(updater);
|
|
return;
|
|
}
|
|
JSONVar result = JSON.parse(https);
|
|
|
|
b1_toggle = result["toggle"];
|
|
|
|
lv_obj_t * b = lv_event_get_target(e);
|
|
lv_color_t c;
|
|
lv_color_t t;
|
|
if (b1_toggle == 1) {
|
|
c = lv_color_make(255, 255, 0);
|
|
t = lv_color_make(0,0,0);
|
|
|
|
}
|
|
else {
|
|
c = lv_color_make(result["rgb"][0], result["rgb"][1], result["rgb"][2]);
|
|
t = lv_color_make(255,255,255);
|
|
}
|
|
lv_obj_set_style_text_color(b, t, LV_PART_MAIN);
|
|
lv_obj_set_style_bg_color(b, c, LV_PART_MAIN);
|
|
JSONVar bm = JSON.parse(before_me);
|
|
bm["b" + String(((room - 1 ) * room_max) + 1)] = result;
|
|
before_me = JSON.stringify(bm);
|
|
|
|
}
|
|
void mb2(lv_event_t *e) {
|
|
if (b2_toggle == 0) {
|
|
b2_toggle = 1;
|
|
} else {
|
|
b2_toggle = 0;
|
|
}
|
|
String https = https_request(
|
|
"https://" + homebaseIP +
|
|
"/watch/button?room=" + room +
|
|
"&button=2&toggle=" + b2_toggle
|
|
);
|
|
if (https == "failure") {
|
|
JSONVar updater;
|
|
updater["room"] = room;
|
|
updater["button"] = 2;
|
|
updater["toggle"] = b2_toggle;
|
|
when_i_get_in(updater);
|
|
return;
|
|
}
|
|
JSONVar result = JSON.parse(https);
|
|
b2_toggle = result["toggle"];
|
|
lv_color_t c;
|
|
lv_color_t t;
|
|
lv_obj_t * b = lv_event_get_target(e);
|
|
if (b2_toggle == 1) {
|
|
c = lv_color_make(255, 255, 0);
|
|
t = lv_color_make(0,0,0);
|
|
}
|
|
else {
|
|
c = lv_color_make(result["rgb"][0], result["rgb"][1], result["rgb"][2]);
|
|
t = lv_color_make(255,255,255);
|
|
}
|
|
lv_obj_set_style_text_color(b, t, LV_PART_MAIN);
|
|
lv_obj_set_style_bg_color(b, c, LV_PART_MAIN);
|
|
JSONVar bm = JSON.parse(before_me);
|
|
bm["b" + String(((room - 1 ) * room_max) + 2)] = result;
|
|
before_me = JSON.stringify(bm);
|
|
}
|
|
void mb3(lv_event_t *e) {
|
|
if (b3_toggle == 0) {
|
|
b3_toggle = 1;
|
|
} else {
|
|
b3_toggle = 0;
|
|
}
|
|
String https = https_request(
|
|
"https://" + homebaseIP +
|
|
"/watch/button?room=" + room +
|
|
"&button=3&toggle=" + b3_toggle
|
|
);
|
|
if (https == "failure") {
|
|
JSONVar updater;
|
|
updater["room"] = room;
|
|
updater["button"] = 3;
|
|
updater["toggle"] = b3_toggle;
|
|
when_i_get_in(updater);
|
|
return;
|
|
}
|
|
JSONVar result = JSON.parse(https);
|
|
b3_toggle = result["toggle"];
|
|
// Serial.println(b3_toggle);
|
|
lv_obj_t * b = lv_event_get_target(e);
|
|
lv_color_t c;
|
|
lv_color_t t;
|
|
if (b3_toggle == 1) {
|
|
c = lv_color_make(255, 255, 0);
|
|
t = lv_color_make(0,0,0);
|
|
|
|
}
|
|
else {
|
|
c = lv_color_make(result["rgb"][0], result["rgb"][1], result["rgb"][2]);
|
|
t = lv_color_make(255,255,255);
|
|
}
|
|
lv_obj_set_style_text_color(b, t, LV_PART_MAIN);
|
|
lv_obj_set_style_bg_color(b, c, LV_PART_MAIN);
|
|
JSONVar bm = JSON.parse(before_me);
|
|
bm["b" + String(((room - 1 ) * room_max) + 3)] = result;
|
|
before_me = JSON.stringify(bm);
|
|
}
|
|
void mb4(lv_event_t *e) {
|
|
if (b4_toggle = 0) {
|
|
b4_toggle = 1;
|
|
} else {
|
|
b4_toggle = 0;
|
|
}
|
|
String https = https_request(
|
|
"https://" + homebaseIP +
|
|
"/watch/button?room=" + room +
|
|
"&button=4&toggle=" + b4_toggle
|
|
);
|
|
if (https == "failure") {
|
|
JSONVar updater;
|
|
updater["room"] = room;
|
|
updater["button"] = 4;
|
|
updater["toggle"] = b4_toggle;
|
|
when_i_get_in(updater);
|
|
return;
|
|
}
|
|
JSONVar result = JSON.parse(https);
|
|
b4_toggle = result["toggle"];
|
|
lv_color_t c;
|
|
lv_color_t t;
|
|
lv_obj_t * b = lv_event_get_target(e);
|
|
if (b4_toggle == 1) {
|
|
c = lv_color_make(255, 255, 0);
|
|
t = lv_color_make(0,0,0);
|
|
}
|
|
else {
|
|
c = lv_color_make(result["rgb"][0], result["rgb"][1], result["rgb"][2]);
|
|
t = lv_color_make(255,255,255);
|
|
}
|
|
lv_obj_set_style_text_color(b, t, LV_PART_MAIN);
|
|
lv_obj_set_style_bg_color(b, c, LV_PART_MAIN);
|
|
JSONVar bm = JSON.parse(before_me);
|
|
bm["b" + String(((room - 1 ) * room_max) + 4)] = result;
|
|
before_me = JSON.stringify(bm);
|
|
|
|
}
|
|
void mb5(lv_event_t *e) {
|
|
if (b5_toggle == 0) {
|
|
b5_toggle = 1;
|
|
} else {
|
|
b5_toggle = 0;
|
|
}
|
|
String https = https_request(
|
|
"https://" + homebaseIP +
|
|
"/watch/button?room=" + room +
|
|
"&button=5&toggle=" + b5_toggle
|
|
);
|
|
if (https == "failure") {
|
|
JSONVar updater;
|
|
updater["room"] = room;
|
|
updater["button"] = 5;
|
|
updater["toggle"] = b5_toggle;
|
|
when_i_get_in(updater);
|
|
return;
|
|
}
|
|
JSONVar result = JSON.parse(https);
|
|
lv_obj_t * b = lv_event_get_target(e);
|
|
lv_color_t c;
|
|
lv_color_t t;
|
|
if (b5_toggle == 1) {
|
|
c = lv_color_make(255, 255, 0);
|
|
t = lv_color_make(0,0,0);
|
|
|
|
}
|
|
else {
|
|
c = lv_color_make(result["rgb"][0], result["rgb"][1], result["rgb"][2]);
|
|
t = lv_color_make(255,255,255);
|
|
}
|
|
lv_obj_set_style_text_color(b, t, LV_PART_MAIN);
|
|
lv_obj_set_style_bg_color(b, c, LV_PART_MAIN);
|
|
JSONVar bm = JSON.parse(before_me);
|
|
bm["b" + String(((room - 1 ) * room_max) + 5)] = result;
|
|
before_me = JSON.stringify(bm);
|
|
}
|
|
void mb6(lv_event_t *e) {
|
|
if (b6_toggle == 0) {
|
|
b6_toggle = 1;
|
|
} else {
|
|
b6_toggle = 0;
|
|
}
|
|
String https = https_request(
|
|
"https://" + homebaseIP +
|
|
"/watch/button?room=" + room +
|
|
"&button=6&toggle=" + b6_toggle
|
|
);
|
|
if (https == "failure") {
|
|
JSONVar updater;
|
|
updater["room"] = room;
|
|
updater["button"] = 6;
|
|
updater["toggle"] = b6_toggle;
|
|
when_i_get_in(updater);
|
|
return;
|
|
}
|
|
JSONVar result = JSON.parse(https);
|
|
b6_toggle = result["toggle"];
|
|
lv_obj_t * b = lv_event_get_target(e);
|
|
lv_color_t c;
|
|
lv_color_t t;
|
|
if (b6_toggle == 1) {
|
|
c = lv_color_make(255, 255, 0);
|
|
t = lv_color_make(0,0,0);
|
|
}
|
|
else {
|
|
c = lv_color_make(result["rgb"][0], result["rgb"][1], result["rgb"][2]);
|
|
t = lv_color_make(255,255,255);
|
|
}
|
|
lv_obj_set_style_text_color(b, t, LV_PART_MAIN);
|
|
lv_obj_set_style_bg_color(b, c, LV_PART_MAIN);
|
|
JSONVar bm = JSON.parse(before_me);
|
|
bm["b" + String(((room - 1 ) * room_max) + 6)] = result;
|
|
before_me = JSON.stringify(bm);
|
|
}
|
|
|
|
|
|
static void touch_button2(lv_event_t *e) {
|
|
clock_writer();
|
|
}
|
|
|
|
void clock_writer() {
|
|
|
|
display_exit();
|
|
|
|
delay(5);
|
|
if (jw_room != "watch") {
|
|
time_writer("now");
|
|
}
|
|
jw_room = "watch";
|
|
|
|
delay(5);
|
|
lastMillis = lastMillis - 1000;
|
|
lv_task_handler();
|
|
}
|
|
|
|
|
|
static void touch_button3(lv_event_t *e) {
|
|
setting_room();
|
|
}
|
|
void setting_room() {
|
|
display_exit();
|
|
jw_room = "configure";
|
|
lv_obj_t *slider = lv_slider_create(lv_scr_act());
|
|
lv_slider_set_value(slider, brightnessLevel, LV_ANIM_ON);
|
|
lv_obj_set_width(slider, 150);
|
|
lv_obj_set_pos(slider, 10, 20);
|
|
lv_obj_add_event_cb(slider, brightness_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
|
|
|
|
lv_obj_t *slider1 = lv_slider_create(lv_scr_act());
|
|
lv_slider_set_value(slider1, vibrateLevel, LV_ANIM_ON);
|
|
|
|
lv_obj_set_width(slider1, 150);
|
|
lv_obj_set_pos(slider1, 10, 45);
|
|
lv_obj_add_event_cb(slider1, vibrate_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
|
|
|
|
lv_obj_t *slider2 = lv_slider_create(lv_scr_act());
|
|
lv_obj_set_width(slider2, 150);
|
|
lv_obj_set_pos(slider2, 10, 70);
|
|
lv_obj_add_event_cb(slider2, volume_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
|
|
lv_slider_set_value(slider2, volumeLevel, LV_ANIM_ON);
|
|
lv_slider_set_range(slider2, 0, 100);
|
|
|
|
lv_obj_t * pd_button = lv_btn_create(lv_scr_act());
|
|
lv_obj_add_event_cb(pd_button, step_control, LV_EVENT_CLICKED, NULL);
|
|
lv_obj_set_pos(pd_button, 10, 100 );
|
|
lv_obj_set_size(pd_button, 40, 40 );
|
|
if (stepCounter == true) {
|
|
lv_obj_set_style_bg_color(pd_button, lv_color_hex(0x61b3ff), LV_PART_MAIN);
|
|
}
|
|
else {
|
|
lv_obj_set_style_bg_color(pd_button, lv_color_hex(0xb0b0b0), LV_PART_MAIN);
|
|
}
|
|
lv_obj_t *lwi1;
|
|
lv_color_t twi1;
|
|
twi1 = lv_color_make(0, 0, 0);
|
|
|
|
lv_obj_set_style_text_color(pd_button, twi1, LV_PART_MAIN);
|
|
lwi1 = lv_label_create(pd_button);
|
|
lv_label_set_text(lwi1, "PD");
|
|
lv_obj_center(lwi1);
|
|
|
|
|
|
lv_obj_t * btn1 = lv_btn_create(lv_scr_act());
|
|
lv_obj_add_event_cb(btn1, ap_lora_send, LV_EVENT_CLICKED, NULL);
|
|
lv_obj_set_pos(btn1, 190, 10 );
|
|
lv_obj_set_size(btn1, 40, 40 );
|
|
lv_obj_set_style_bg_color(btn1, lv_color_hex(0xdafc5d), LV_PART_MAIN);
|
|
lv_task_handler();
|
|
lv_obj_t *l1;
|
|
lv_color_t t1;
|
|
t1 = lv_color_make(0, 0, 0);
|
|
|
|
lv_obj_set_style_text_color(btn1, t1, LV_PART_MAIN);
|
|
l1 = lv_label_create(btn1);
|
|
lv_label_set_text(l1, "LAP");
|
|
lv_obj_center(l1);
|
|
|
|
lv_obj_t * btn2 = lv_btn_create(lv_scr_act());
|
|
lv_obj_add_event_cb(btn2, wifi_lora_send, LV_EVENT_CLICKED, NULL);
|
|
lv_obj_set_pos(btn2, 190, 50 );
|
|
lv_obj_set_size(btn2, 40, 40 );
|
|
lv_obj_set_style_bg_color(btn2, lv_color_hex(0xdafc5d), LV_PART_MAIN);
|
|
lv_obj_t *l2;
|
|
lv_color_t t2;
|
|
t2 = lv_color_make(0, 0, 0);
|
|
|
|
lv_obj_set_style_text_color(btn2, t2, LV_PART_MAIN);
|
|
l2 = lv_label_create(btn2);
|
|
lv_label_set_text(l2, "LWI");
|
|
lv_obj_center(l2);
|
|
|
|
|
|
lv_color_t t5;
|
|
t5 = lv_color_make(0,0,0);
|
|
lv_obj_t * btn5 = lv_btn_create(lv_scr_act());
|
|
lv_obj_add_event_cb(btn5, loraBroadcastToggle, LV_EVENT_CLICKED, NULL);
|
|
lv_obj_set_pos(btn5, 190, 100 );
|
|
lv_obj_set_size(btn5, 40, 40 );
|
|
if (loraChatBroadcaster == false) {
|
|
lv_obj_set_style_bg_color(btn5, lv_color_hex(0xb0b0b0), LV_PART_MAIN);
|
|
}
|
|
else {
|
|
lv_obj_set_style_bg_color(btn5, lv_color_hex(0x53ff24), LV_PART_MAIN);
|
|
}
|
|
lv_obj_t *l5;
|
|
lv_obj_set_style_text_color(btn5, t5, LV_PART_MAIN);
|
|
l5 = lv_label_create(btn5);
|
|
lv_label_set_text(l5, "LB");
|
|
lv_obj_center(l5);
|
|
|
|
|
|
lv_obj_t * btn6 = lv_btn_create(lv_scr_act());
|
|
lv_obj_add_event_cb(btn6, loraReceiveToggle, LV_EVENT_CLICKED, NULL);
|
|
lv_obj_set_pos(btn6, 140, 100 );
|
|
lv_obj_set_size(btn6, 40, 40 );
|
|
if (loraChatReceiver == true) {
|
|
lv_obj_set_style_bg_color(btn6, lv_color_hex(0x53ff24), LV_PART_MAIN);
|
|
}
|
|
else {
|
|
lv_obj_set_style_bg_color(btn6, lv_color_hex(0xb0b0b0), LV_PART_MAIN);
|
|
}
|
|
lv_obj_t *l6;
|
|
lv_obj_set_style_text_color(btn6, t5, LV_PART_MAIN);
|
|
l6 = lv_label_create(btn6);
|
|
lv_label_set_text(l6, "LR");
|
|
lv_obj_center(l6);
|
|
|
|
lv_color_t t50;
|
|
t50 = lv_color_make(0,0,0);
|
|
lv_obj_t * btn50 = lv_btn_create(lv_scr_act());
|
|
lv_obj_add_event_cb(btn50, configSaveButton, LV_EVENT_CLICKED, NULL);
|
|
lv_obj_set_pos(btn50, 190, 140 );
|
|
lv_obj_set_size(btn50, 40, 40 );
|
|
lv_obj_t *l50;
|
|
lv_obj_set_style_text_color(btn50, t50, LV_PART_MAIN);
|
|
l50 = lv_label_create(btn50);
|
|
lv_label_set_text(l50, "cS");
|
|
lv_obj_center(l50);
|
|
|
|
|
|
lv_obj_t * btn60 = lv_btn_create(lv_scr_act());
|
|
lv_obj_add_event_cb(btn60, configRestoreButton, LV_EVENT_CLICKED, NULL);
|
|
lv_obj_set_pos(btn60, 140, 140 );
|
|
lv_obj_set_size(btn60, 40, 40 );
|
|
lv_obj_t *l60;
|
|
lv_obj_set_style_bg_color(btn60, lv_color_hex(0xdafc5d), LV_PART_MAIN);
|
|
lv_obj_set_style_text_color(btn60, t50, LV_PART_MAIN);
|
|
l60 = lv_label_create(btn60);
|
|
lv_label_set_text(l60, "cR");
|
|
lv_obj_center(l60);
|
|
|
|
lv_obj_t * btn601 = lv_btn_create(lv_scr_act());
|
|
lv_obj_add_event_cb(btn601, configDeleteButton, LV_EVENT_CLICKED, NULL);
|
|
lv_obj_set_pos(btn601, 90, 140 );
|
|
lv_obj_set_size(btn601, 40, 40 );
|
|
lv_obj_t *l601;
|
|
lv_obj_set_style_bg_color(btn601, lv_color_hex(0xdafc5d), LV_PART_MAIN);
|
|
lv_obj_set_style_text_color(btn601, t50, LV_PART_MAIN);
|
|
l601 = lv_label_create(btn601);
|
|
lv_label_set_text(l601, "cD");
|
|
lv_obj_center(l601);
|
|
|
|
lv_obj_t * btn6012 = lv_btn_create(lv_scr_act());
|
|
lv_obj_add_event_cb(btn6012, lightSleep_toggle, LV_EVENT_CLICKED, NULL);
|
|
lv_obj_set_pos(btn6012, 10, 140 );
|
|
lv_obj_set_size(btn6012, 40, 40 );
|
|
lv_obj_t *l6012;
|
|
if (lightSleep == true) {
|
|
lv_obj_set_style_bg_color(btn6012, lv_color_hex(0x5afcdd), LV_PART_MAIN);
|
|
}
|
|
else {
|
|
lv_obj_set_style_bg_color(btn6012, lv_color_hex(0xb0b0b0), LV_PART_MAIN);
|
|
}
|
|
lv_obj_set_style_text_color(btn6012, t50, LV_PART_MAIN);
|
|
l6012 = lv_label_create(btn6012);
|
|
lv_label_set_text(l6012, "LS");
|
|
lv_obj_center(l6012);
|
|
|
|
lv_task_handler();
|
|
}
|
|
|
|
static void step_control(lv_event_t *e) {
|
|
lv_obj_t * pd_button = lv_event_get_target(e);
|
|
|
|
if (stepCounter == true) {
|
|
lv_obj_set_style_bg_color(pd_button, lv_color_hex(0xb0b0b0), LV_PART_MAIN);
|
|
stepCounter = false;
|
|
watch.disablePedometer();
|
|
watch.disablePedometerIRQ();
|
|
|
|
}
|
|
else {
|
|
lv_obj_set_style_bg_color(pd_button, lv_color_hex(0x5afcdd), LV_PART_MAIN);
|
|
stepCounter = true;
|
|
watch.enablePedometer();
|
|
watch.enablePedometerIRQ();
|
|
|
|
}
|
|
}
|
|
|
|
static void lightSleep_toggle(lv_event_t *e) {
|
|
lv_obj_t * sleep_button = lv_event_get_target(e);
|
|
|
|
if (lightSleep == true) {
|
|
lv_obj_set_style_bg_color(sleep_button, lv_color_hex(0xb0b0b0), LV_PART_MAIN);
|
|
lightSleep = false;
|
|
}
|
|
else {
|
|
lv_obj_set_style_bg_color(sleep_button, lv_color_hex(0x5afcdd), LV_PART_MAIN);
|
|
lightSleep = true;
|
|
}
|
|
}
|
|
|
|
static void configSaveButton(lv_event_t *e) {
|
|
configSave();
|
|
}
|
|
|
|
static void configRestoreButton(lv_event_t *e) {
|
|
configRestore();
|
|
setting_room();
|
|
|
|
}
|
|
|
|
static void configDeleteButton(lv_event_t *e) {
|
|
configDelete();
|
|
}
|
|
|
|
|
|
static void loraBroadcastToggle(lv_event_t *e) {
|
|
lv_obj_t * lora_button = lv_event_get_target(e);
|
|
if (loraChatBroadcaster == false) {
|
|
lv_obj_set_style_bg_color(lora_button, lv_color_hex(0x53ff24), LV_PART_MAIN);
|
|
loraChatBroadcaster = true;
|
|
|
|
}
|
|
else {
|
|
lv_obj_set_style_bg_color(lora_button, lv_color_hex(0xb0b0b0), LV_PART_MAIN);
|
|
loraChatBroadcaster = false;
|
|
|
|
}
|
|
}
|
|
|
|
static void loraReceiveToggle(lv_event_t *e) {
|
|
lv_obj_t * lora_button = lv_event_get_target(e);
|
|
if (loraChatReceiver == false) {
|
|
lv_obj_set_style_bg_color(lora_button, lv_color_hex(0x53ff24), LV_PART_MAIN);
|
|
loraChatReceiver = true;
|
|
}
|
|
else {
|
|
lv_obj_set_style_bg_color(lora_button, lv_color_hex(0xb0b0b0), LV_PART_MAIN);
|
|
loraChatReceiver = false;
|
|
}
|
|
}
|
|
|
|
static void ap_lora_send(lv_event_t *e) {
|
|
|
|
JSONVar pa;
|
|
pa["ap_ssid"] = ap_ssid;
|
|
pa["ap_password"] = ap_password;
|
|
String public_announcement = JSON.stringify(pa);
|
|
radio.startTransmit(public_announcement);
|
|
//Serial.print(public_announcement);
|
|
}
|
|
|
|
|
|
static void wifi_lora_send(lv_event_t *e) {
|
|
|
|
JSONVar pa;
|
|
pa["ap_ssid"] = ssid;
|
|
pa["ap_password"] = password;
|
|
String public_announcement = JSON.stringify(pa);
|
|
radio.startTransmit(public_announcement);
|
|
//Serial.print(public_announcement);
|
|
}
|
|
|
|
|
|
static void wifi_ap_control(lv_event_t *e) {
|
|
lv_obj_t * wifi_ap_button = lv_event_get_target(e);
|
|
if (wifi_ap_enabled == true) {
|
|
wifi_ap_enabled = false;
|
|
accesspoint_stop();
|
|
lv_obj_set_style_bg_color(wifi_ap_button, lv_color_hex(0xb0b0b0), LV_PART_MAIN);
|
|
|
|
}
|
|
else {
|
|
wifi_ap_enabled = true;
|
|
accesspoint_start();
|
|
lv_obj_set_style_bg_color(wifi_ap_button, lv_color_hex(0x61b3ff), LV_PART_MAIN);
|
|
}
|
|
}
|
|
|
|
void accesspoint_start() {
|
|
if (wifi_ap_enabled == true) {
|
|
IPAddress gw_ip(192, 168, 3, 1);
|
|
IPAddress ip(192, 168, 3, 1);
|
|
IPAddress subnet(255, 255, 255, 0);
|
|
if (wifi_update != "") {
|
|
JSONVar wifi = JSON.parse(wifi_update);
|
|
ap_ssid = (const char *)wifi["ap_ssid"];
|
|
ap_password = (const char *)wifi["ap_password"];
|
|
}
|
|
if (WiFi.softAP(ap_ssid, ap_password)) {
|
|
WiFi.softAPConfig(ip, gw_ip, subnet); //, IPAddress dhcp_lease_start = (uint32_t)0, IPAddress dns = (uint32_t)0);
|
|
server.begin();
|
|
webserver_enabled = true;
|
|
wifi_ap_enabled = true;
|
|
apIP = WiFi.softAPIP();
|
|
}
|
|
}
|
|
}
|
|
|
|
void accesspoint_stop() {
|
|
WiFi.softAPdisconnect();
|
|
server.stop();
|
|
wifi_ap_enabled = false;
|
|
if (wifi_enabled == false) {
|
|
webserver_enabled = false;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void wifi_control(lv_event_t *e) {
|
|
lv_obj_t * wifi_button = lv_event_get_target(e);
|
|
if (wifi_enabled == true) {
|
|
lv_obj_set_style_bg_color(wifi_button, lv_color_hex(0xb0b0b0), LV_PART_MAIN);
|
|
WiFi.disconnect();
|
|
if (wifi_ap_enabled == false) {
|
|
webserver_enabled = false;
|
|
server.stop();
|
|
}
|
|
wifi_enabled = false;
|
|
}
|
|
else {
|
|
wifi_enabled = true;
|
|
wifi_server();
|
|
if (WiFi.status() == WL_CONNECTED) {
|
|
server.begin();
|
|
server.handleClient();
|
|
lv_obj_set_style_bg_color(wifi_button, lv_color_hex(0x61b3ff), LV_PART_MAIN);
|
|
webserver_enabled = true;
|
|
}
|
|
else {
|
|
lv_obj_set_style_bg_color(wifi_button, lv_color_hex(0xb0b0b0), LV_PART_MAIN);
|
|
server.stop();
|
|
wifi_enabled = false;
|
|
if (wifi_ap_enabled == false) {
|
|
webserver_enabled = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
static void brightness_event_cb(lv_event_t *e)
|
|
{
|
|
lv_obj_t *slider = lv_event_get_target(e);
|
|
char buf[8];
|
|
lv_snprintf(buf, sizeof(buf), "%d%%", (int)lv_slider_get_value(slider));
|
|
uint8_t level = (uint8_t)lv_slider_get_value(slider);
|
|
brightnessLevel = level;
|
|
watch.setBrightness(brightnessLevel);
|
|
|
|
}
|
|
|
|
static void vibrate_event_cb(lv_event_t *e)
|
|
{
|
|
lv_obj_t *slider = lv_event_get_target(e);
|
|
char buf[8];
|
|
lv_snprintf(buf, sizeof(buf), "%d%%", (int)lv_slider_get_value(slider));
|
|
uint8_t level = (uint8_t)lv_slider_get_value(slider);
|
|
vibrateLevel = level;
|
|
watch.setWaveform(0, vibrateLevel); // play effect
|
|
// play the effect!
|
|
watch.run();
|
|
}
|
|
|
|
static void volume_event_cb(lv_event_t *e)
|
|
{
|
|
lv_obj_t *slider = lv_event_get_target(e);
|
|
char buf[8];
|
|
lv_snprintf(buf, sizeof(buf), "%d%%", (int)lv_slider_get_value(slider));
|
|
uint8_t level = (uint8_t)lv_slider_get_value(slider);
|
|
volumeLevel = level;
|
|
}
|
|
|
|
|
|
void touch_watch() {
|
|
if (watch.getTouched()) {
|
|
buttonMillis = millis();
|
|
// lv_point_t point;
|
|
// lv_indev_t *indev = lv_indev_get_next(NULL);
|
|
// lv_indev_get_point(indev, &point);
|
|
// Serial.print(point.x); Serial.print(" "); Serial.println(point.y);
|
|
|
|
}
|
|
}
|
|
|
|
void lowPowerEnergyHandler()
|
|
{
|
|
Serial.println("Enter light sleep mode!");
|
|
|
|
buttonMillis = 0;
|
|
brightnessLevel = watch.getBrightness();
|
|
watch.decrementBrightness(0);
|
|
|
|
watch.clearPMU();
|
|
|
|
watch.configreFeatureInterrupt(
|
|
SensorBMA423::INT_STEP_CNTR | // Pedometer interrupt
|
|
SensorBMA423::INT_ACTIVITY | // Activity interruption
|
|
SensorBMA423::INT_TILT | // Tilt interrupt
|
|
SensorBMA423::INT_WAKEUP | // DoubleTap interrupt
|
|
SensorBMA423::INT_ANY_NO_MOTION,// Any motion / no motion interrupt
|
|
false);
|
|
|
|
sportsIrq = false;
|
|
pmuIrq = false;
|
|
|
|
//TODO: Low power consumption not debugged
|
|
if (lightSleep) {
|
|
// esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
|
|
// esp_sleep_enable_ext1_wakeup(1ULL << BOARD_BMA423_INT1, ESP_EXT1_WAKEUP_ANY_HIGH);
|
|
// esp_sleep_enable_ext1_wakeup(1ULL << BOARD_PMU_INT, ESP_EXT1_WAKEUP_ALL_LOW);
|
|
|
|
// gpio_wakeup_enable ((gpio_num_t)BOARD_PMU_INT, GPIO_INTR_LOW_LEVEL);
|
|
|
|
|
|
gpio_wakeup_enable ((gpio_num_t)BOARD_BMA423_INT1, GPIO_INTR_HIGH_LEVEL);
|
|
configSave();
|
|
|
|
esp_sleep_enable_gpio_wakeup();
|
|
esp_light_sleep_start();
|
|
|
|
Serial.println("right after sleep");
|
|
wifi_server();
|
|
|
|
} else {
|
|
configSave();
|
|
setCpuFrequencyMhz(80);
|
|
//my_print("=========esp_light_sleep_start=========\n");
|
|
char count = 0;;
|
|
|
|
while (!pmuIrq && !sportsIrq) {// && !watch.getTouched()) {
|
|
if (jw_room == "message") {
|
|
if (buttonMillis != 0 && millis() - buttonMillis > DEFAULT_SCREEN_TIMEOUT && count > 58) {
|
|
lowPowerEnergyHandler();
|
|
count = 0;
|
|
}
|
|
|
|
else {
|
|
count++;
|
|
}
|
|
}
|
|
if (webserver_enabled == true) {
|
|
server.handleClient();
|
|
}
|
|
readRadio();
|
|
delay(500);
|
|
// gpio_wakeup_enable ((gpio_num_t)BOARD_TOUCH_INT, GPIO_INTR_LOW_LEVEL);
|
|
// esp_sleep_enable_timer_wakeup(3 * 1000);
|
|
// esp_light_sleep_start();
|
|
}
|
|
//my_print("=========esp_light_sleep_end=========\n");
|
|
|
|
}
|
|
Serial.println("just before frequency");
|
|
setCpuFrequencyMhz(240);
|
|
step_writer();
|
|
// Clear Interrupts in Loop
|
|
// watch.readBMA();
|
|
// watch.clearPMU();
|
|
|
|
watch.configreFeatureInterrupt(
|
|
// SensorBMA423::INT_STEP_CNTR | // Pedometer interrupt
|
|
SensorBMA423::INT_ACTIVITY, // Activity interruption
|
|
/// SensorBMA423::INT_TILT | // Tilt interrupt
|
|
// SensorBMA423::INT_WAKEUP, // DoubleTap interrupt
|
|
// SensorBMA423::INT_ANY_NO_MOTION,// Any motion / no motion interrupt
|
|
true);
|
|
if (brightnessLevel <= 1) {
|
|
brightnessLevel = 2;
|
|
}
|
|
watch.incrementalBrightness(brightnessLevel);
|
|
|
|
}
|
|
|
|
void settingSensor()
|
|
{
|
|
//Default 4G ,200HZ
|
|
watch.configAccelerometer();
|
|
|
|
watch.enableAccelerometer();
|
|
|
|
watch.enablePedometer();
|
|
|
|
watch.configInterrupt();
|
|
|
|
watch.enableFeature(
|
|
SensorBMA423::FEATURE_STEP_CNTR |
|
|
SensorBMA423::FEATURE_ANY_MOTION |
|
|
SensorBMA423::FEATURE_NO_MOTION |
|
|
SensorBMA423::FEATURE_ACTIVITY |
|
|
SensorBMA423::FEATURE_TILT |
|
|
SensorBMA423::FEATURE_WAKEUP,
|
|
true);
|
|
|
|
watch.enablePedometerIRQ();
|
|
watch.enableTiltIRQ();
|
|
watch.enableWakeupIRQ();
|
|
watch.enableAnyNoMotionIRQ();
|
|
watch.enableActivityIRQ();
|
|
|
|
watch.attachBMA(setSportsFlag);
|
|
}
|
|
|
|
void setSportsFlag()
|
|
{
|
|
sportsIrq = true;
|
|
}
|
|
|
|
void setPMUFlag()
|
|
{
|
|
pmuIrq = true;
|
|
}
|
|
|
|
void settingPMU()
|
|
{
|
|
watch.clearPMU();
|
|
|
|
watch.disableIRQ(XPOWERS_AXP2101_ALL_IRQ);
|
|
// Enable the required interrupt function
|
|
watch.enableIRQ(
|
|
// XPOWERS_AXP2101_BAT_INSERT_IRQ | XPOWERS_AXP2101_BAT_REMOVE_IRQ | //BATTERY
|
|
XPOWERS_AXP2101_VBUS_INSERT_IRQ | XPOWERS_AXP2101_VBUS_REMOVE_IRQ | //VBUS
|
|
XPOWERS_AXP2101_PKEY_SHORT_IRQ | XPOWERS_AXP2101_PKEY_LONG_IRQ | //POWER KEY
|
|
XPOWERS_AXP2101_BAT_CHG_DONE_IRQ | XPOWERS_AXP2101_BAT_CHG_START_IRQ //CHARGE
|
|
// XPOWERS_AXP2101_PKEY_NEGATIVE_IRQ | XPOWERS_AXP2101_PKEY_POSITIVE_IRQ | //POWER KEY
|
|
);
|
|
watch.attachPMU(setPMUFlag);
|
|
}
|
|
|
|
|
|
static void touch_button4(lv_event_t *e) {
|
|
net_room();
|
|
|
|
}
|
|
|
|
void net_room() {
|
|
jw_room = "net";
|
|
|
|
display_exit();
|
|
ip_writer();
|
|
lv_obj_t * wifi_button = lv_btn_create(lv_scr_act());
|
|
lv_obj_add_event_cb(wifi_button, wifi_control, LV_EVENT_CLICKED, NULL);
|
|
lv_obj_set_pos(wifi_button, 10, 20 );
|
|
lv_obj_set_size(wifi_button, 40, 40 );
|
|
if (wifi_enabled == true) {
|
|
lv_obj_set_style_bg_color(wifi_button, lv_color_hex(0x61b3ff), LV_PART_MAIN);
|
|
}
|
|
else {
|
|
lv_obj_set_style_bg_color(wifi_button, lv_color_hex(0xb0b0b0), LV_PART_MAIN);
|
|
}
|
|
lv_obj_t *lwi1;
|
|
lv_color_t twi1;
|
|
twi1 = lv_color_make(0, 0, 0);
|
|
|
|
lv_obj_set_style_text_color(wifi_button, twi1, LV_PART_MAIN);
|
|
lwi1 = lv_label_create(wifi_button);
|
|
lv_label_set_text(lwi1, "WI");
|
|
lv_obj_center(lwi1);
|
|
|
|
lv_obj_t * wifi_ap_button = lv_btn_create(lv_scr_act());
|
|
lv_obj_add_event_cb(wifi_ap_button, wifi_ap_control, LV_EVENT_CLICKED, NULL);
|
|
lv_obj_set_pos(wifi_ap_button, 60, 20 );
|
|
lv_obj_set_size(wifi_ap_button, 40, 40 );
|
|
if (wifi_ap_enabled == true) {
|
|
lv_obj_set_style_bg_color(wifi_ap_button, lv_color_hex(0x61b3ff), LV_PART_MAIN);
|
|
}
|
|
else {
|
|
lv_obj_set_style_bg_color(wifi_ap_button, lv_color_hex(0xb0b0b0), LV_PART_MAIN);
|
|
}
|
|
lv_obj_t *lwi2;
|
|
lv_color_t twi2;
|
|
twi2 = lv_color_make(0, 0, 0);
|
|
|
|
lv_obj_set_style_text_color(wifi_ap_button, twi2, LV_PART_MAIN);
|
|
lwi2 = lv_label_create(wifi_ap_button);
|
|
lv_label_set_text(lwi2, "AP");
|
|
lv_obj_center(lwi2);
|
|
|
|
}
|
|
|
|
void configSave() {
|
|
JSONVar conf;
|
|
writeFile(FFat, "/bootreport.txt", "success");
|
|
if (lightSleep == true) {
|
|
conf["lightsleep"] = "on";
|
|
}
|
|
else {
|
|
lightSleep == false;
|
|
}
|
|
if (wifi_ap_enabled == true) {
|
|
conf["wifi_ap_enabled"] = "on";
|
|
}
|
|
else {
|
|
conf["wifi_ap_enabled"] = "off";
|
|
}
|
|
if (wifi_enabled == true) {
|
|
conf["wifi_enabled"] = "on";
|
|
}
|
|
else {
|
|
conf["wifi_enabled"] = "off";
|
|
}
|
|
if (loraChatBroadcaster == true) {
|
|
conf["loraChatBroadcaster"] = "on";
|
|
}
|
|
else {
|
|
conf["loraChatBroadcaster"] = "off";
|
|
}
|
|
if (loraChatReceiver == true) {
|
|
conf["loraChatReceiver"] = "on";
|
|
}
|
|
else {
|
|
conf["loraChatReceiver"] = "off";
|
|
}
|
|
if (buttoned_before == true) {
|
|
conf["buttoned_before"] = "on";
|
|
}
|
|
else {
|
|
conf["buttoned_before"] = "off";
|
|
}
|
|
if (stepCounter == true) {
|
|
conf["step_counter"] = "on";
|
|
}
|
|
else {
|
|
conf["step_counter"] = "off";
|
|
}
|
|
conf["before_me"] = before_me;
|
|
conf["jw_room"] = jw_room;
|
|
String wigi_wah = JSON.stringify(wigi);
|
|
conf["wigi"] = wigi_wah; conf["authorization"] = authorization;
|
|
conf["ssid"] = ssid;
|
|
conf["password"] = password;
|
|
conf["ap_ssid"] = ap_ssid;
|
|
conf["ap_password"] = ap_password;
|
|
String aj = JSON.stringify(authorization_json);
|
|
conf["aj"] = aj;
|
|
conf["before_me"] = before_me;
|
|
conf["homebase"] = homebase;
|
|
conf["homebaseIP"] = homebaseIP;
|
|
conf["computer_name"] = computer_name;
|
|
conf["brightness"] = brightnessLevel;
|
|
conf["vibrate"] = vibrateLevel;
|
|
conf["volume"] = volumeLevel;
|
|
conf["room_count"] = room_count;
|
|
returner = JSON.stringify(conf);
|
|
writeFile(FFat, "/config.json", returner.c_str());
|
|
}
|
|
|
|
void configDelete() {
|
|
FFat.format();
|
|
|
|
writeFile(FFat, "/bootreport.txt", "deleting");
|
|
//deleteFile(FFat, "/config.json");
|
|
before_me = "";
|
|
jw_room = "watch";
|
|
homebase = "";
|
|
homebaseIP = "";
|
|
computer_name = "";
|
|
authorization = "";
|
|
ssid = "";
|
|
brightnessLevel = 5;
|
|
password = "";
|
|
ap_ssid = "3";
|
|
room_count = 6;
|
|
ap_password = "battlestargalactica";
|
|
buttoned_before = false;
|
|
wifi_ap_enabled = false;
|
|
wifi_enabled = false;
|
|
loraChatBroadcaster = false;
|
|
loraChatReceiver = false;
|
|
lightSleep = true;
|
|
stepCounter = true;
|
|
wigi = JSON.parse("[]");
|
|
}
|
|
void configRestore() {
|
|
returner = "";
|
|
Serial.println(returner);
|
|
writeFile(FFat, "/bootreport.txt", "saving");
|
|
|
|
readFile(FFat, "/config.json");
|
|
Serial.println(returner);
|
|
Serial.println("ok");
|
|
if (returner != "failure") {
|
|
JSONVar conf = JSON.parse(returner);
|
|
before_me = (const char *)conf["before_me"];
|
|
|
|
homebase = (const char *)conf["homebase"];
|
|
homebaseIP = (const char *)conf["homebaseIP"];
|
|
computer_name = (const char *)conf["computer_name"];
|
|
authorization = (const char *)conf["authorization"];
|
|
String wigi_wah = conf["wigi"];
|
|
wigi = JSON.parse(wigi_wah); brightnessLevel = conf["brightness"];
|
|
watch.setBrightness(brightnessLevel);
|
|
|
|
vibrateLevel = conf["vibrate"];
|
|
volumeLevel = conf["volume"];
|
|
room_count = conf["room_count"];
|
|
if (conf["password"] && conf["ssid"]) {
|
|
password = (const char *)conf["password"];
|
|
ssid = (const char *)conf["ssid"];
|
|
}
|
|
else {
|
|
ssid = base_ssid;
|
|
password = base_password;
|
|
}
|
|
ap_ssid =(const char *)conf["ap_ssid"];
|
|
ap_password = (const char *)conf["ap_password"];
|
|
|
|
String bb = (const char *)conf["buttoned_before"];
|
|
if (bb == "on") {
|
|
buttoned_before = true;
|
|
}
|
|
else {
|
|
buttoned_before = false;
|
|
}
|
|
String wpae = (const char *)conf["wifi_ap_enabled"];
|
|
if (wpae == "on") {
|
|
wifi_ap_enabled = true;
|
|
}
|
|
else {
|
|
wifi_ap_enabled = false;
|
|
}
|
|
|
|
accesspoint_start();
|
|
String we = (const char *)conf["wifi_enabled"];
|
|
if (we == "on") {
|
|
wifi_enabled = true;
|
|
}
|
|
else {
|
|
wifi_enabled = false;
|
|
}
|
|
wifi_server();
|
|
String lcb = (const char *)conf["loraChatBroadcaster"];
|
|
if (lcb == "on") {
|
|
loraChatBroadcaster = true;
|
|
}
|
|
else {
|
|
loraChatBroadcaster = false;
|
|
}
|
|
String lcr = (const char *)conf["loraChatReceiver"];
|
|
if (lcr == "on") {
|
|
loraChatReceiver = true;
|
|
}
|
|
else {
|
|
loraChatReceiver = false;
|
|
}
|
|
String ls = (const char *)conf["lightsleep"];
|
|
if (ls == "on") {
|
|
lightSleep = true;
|
|
}
|
|
else {
|
|
lightSleep = false;
|
|
}
|
|
|
|
String pd = (const char *)conf["step_counter"];
|
|
if (pd == "on") {
|
|
stepCounter = true;
|
|
}
|
|
else {
|
|
stepCounter = false;
|
|
}
|
|
// call_the_president();
|
|
jw_room = (const char *)conf["jw_room"];
|
|
Serial.print(jw_room);
|
|
Serial.println(" is the room");
|
|
if (jw_room == "room") {
|
|
remote_room();
|
|
}
|
|
else if (jw_room == "watch") {
|
|
clock_writer();
|
|
}
|
|
else if (jw_room == "configure") {
|
|
setting_room();
|
|
}
|
|
else if (jw_room == "net") {
|
|
net_room();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void writeFile(fs::FS &fs, const char * path, const char * message){
|
|
Serial.printf("Writing file: %s\r\n", path);
|
|
File file = fs.open(path, FILE_WRITE);
|
|
if(!file){
|
|
Serial.println("- failed to open file for writing");
|
|
return;
|
|
}
|
|
if(file.print(message)){
|
|
Serial.println("- file written");
|
|
} else {
|
|
Serial.println("- write failed");
|
|
}
|
|
file.close();
|
|
}
|
|
|
|
String readFile(fs::FS &fs, const char * path) {
|
|
// Serial.printf("Reading file: %s\r\n", path);
|
|
|
|
File file = fs.open(path);
|
|
if (!file || file.isDirectory()) {
|
|
// Serial.println("- failed to open file for reading");
|
|
return "failure";
|
|
}
|
|
|
|
// Serial.println("- read from file:");
|
|
while (file.available()) {
|
|
char fString = (char)file.read();
|
|
returner += fString;
|
|
|
|
}
|
|
file.close();
|
|
Serial.println(returner);
|
|
return returner;
|
|
}
|
|
|
|
void appendFile(fs::FS &fs, const char * path, const char * message) {
|
|
// Serial.printf("Appending to file: %s\r\n", path);
|
|
|
|
File file = fs.open(path, FILE_APPEND);
|
|
if (!file) {
|
|
// Serial.println("- failed to open file for appending");
|
|
return;
|
|
}
|
|
if (file.print(message)) {
|
|
// Serial.println("- message appended");
|
|
} else {
|
|
// Serial.println("- append failed");
|
|
}
|
|
|
|
file.close();
|
|
}
|
|
|
|
void createDir(fs::FS &fs, const char * path){
|
|
Serial.printf("Creating Dir: %s\n", path);
|
|
if(fs.mkdir(path)){
|
|
Serial.println("Dir created");
|
|
} else {
|
|
Serial.println("mkdir failed");
|
|
}
|
|
}
|
|
|
|
void deleteFile(fs::FS &fs, const char * path) {
|
|
// Serial.printf("Deleting file: %s\r\n", path);
|
|
if (fs.remove(path)) {
|
|
// Serial.println("- file deleted");
|
|
} else {
|
|
// Serial.println("- delete failed");
|
|
}
|
|
}
|