Files
M5PaperOS/src/frame/frame_factorytest.cpp

396 lines
12 KiB
C++

#include "frame_factorytest.h"
#include "WiFi.h"
#define POS_LX (15)
#define POS_RX (240 - 15)
const uint8_t kPins[6] = {32, 25, 33, 26, 19, 18};
void frame_factorytest_exit_cb(epdgui_args_vector_t &args) {
EPDGUI_PopFrame();
*((int *)(args[0])) = 0;
}
Frame_FactoryTest::Frame_FactoryTest(void) {
//TODO: Voltage WiFi Psram touch pos
_frame_name = "Frame_FactoryTest";
_canvas_base = new M5EPD_Canvas(&M5.EPD);
_canvas_data = new M5EPD_Canvas(&M5.EPD);
_canvas_pos = new M5EPD_Canvas(&M5.EPD);
_canvas_btn = new M5EPD_Canvas(&M5.EPD);
_canvas_pass = new M5EPD_Canvas(&M5.EPD);
_canvas_base->createCanvas(300, 600);
_canvas_data->createCanvas(240, 480);
_canvas_pos->createCanvas(240, 60);
_canvas_btn->createCanvas(240, 60);
_canvas_pass->createCanvas(150, 32);
_canvas_base->setTextSize(26);
_canvas_data->setTextSize(26);
_canvas_pos->setTextSize(26);
_canvas_btn->setTextSize(26);
_canvas_pass->setTextSize(26);
_canvas_base->setTextDatum(CL_DATUM);
_canvas_data->setTextDatum(CR_DATUM);
_canvas_pos->setTextDatum(CR_DATUM);
_canvas_btn->setTextDatum(CR_DATUM);
_canvas_pass->setTextDatum(CR_DATUM);
exitbtn("Home");
_canvas_title->drawString("Factory Test", 270, 34);
_key_exit->AddArgs(EPDGUI_Button::EVENT_RELEASED, 0, (void *)(&_is_run));
_key_exit->Bind(EPDGUI_Button::EVENT_RELEASED, &Frame_Base::exit_cb);
for (int i = 0; i < 6; i++) {
pinMode(kPins[i], OUTPUT);
digitalWrite(kPins[i], HIGH);
}
M5.SHT30.Begin();
M5.RTC.begin();
rtc_time_t time_struct;
rtc_date_t date_struct;
M5.RTC.getTime(&time_struct);
M5.RTC.getDate(&date_struct);
if ((isTimeSynced() == 0) || (date_struct.year < 2010)) {
rtc_time_t time_struct;
time_struct.hour = 23;
time_struct.min = 33;
time_struct.sec = 33;
M5.RTC.setTime(&time_struct);
rtc_date_t date_struct;
date_struct.week = 4;
date_struct.mon = 9;
date_struct.day = 24;
date_struct.year = 2020;
M5.RTC.setDate(&date_struct);
}
_time = 0;
_btn = 0;
_psram_success = false;
_isfirst = true;
_pass_flag = 0;
_pass_flag |= GetInitStatus(0) ? 0x0080 : 0;
}
Frame_FactoryTest::~Frame_FactoryTest(void) {
delete _canvas_base;
delete _canvas_data;
delete _canvas_pos;
delete _canvas_btn;
delete _canvas_pass;
}
void Frame_FactoryTest::drawItem(uint16_t flag, const char* str, int y) {
String prefix_pass("[PASS] ");
String prefix_none("");
if(_pass_flag & flag) {
_canvas_base->drawString(prefix_pass + str, POS_LX, y);
} else {
_canvas_base->drawString(str, POS_LX, y);
_canvas_base->ReversePartColor(0, y - 30, 300, 60);
}
}
void Frame_FactoryTest::drawItem(m5epd_update_mode_t mode) {
_canvas_base->fillCanvas(0);
drawItem(0x0001, "1.day", 30);
drawItem(0x0002, "2.Time", 90);
drawItem(0x0004, "3.Temperature", 150);
drawItem(0x0008, "4.Humidity", 210);
drawItem(0x0010, "5.Battery", 270);
drawItem(0x0020, "6.Wi-Fi", 330);
drawItem(0x0040, "7.PSRAM", 390);
drawItem(0x0080, "8.SD Card", 450);
drawItem(0x0100, "9.Button", 510);
drawItem(0x0200, "10.TouchPad", 570);
_canvas_base->pushCanvas(0, 100, mode);
}
void Frame_FactoryTest::drawGrove(m5epd_update_mode_t mode) {
M5.EPD.WritePartGram4bpp(428, 916, 100, 40, (_pass_flag & 0x0400) ? ImageResource_factory_pass_h_100x40 : ImageResource_factory_port_a_100x40);
M5.EPD.WritePartGram4bpp(4, 848, 40, 100, (_pass_flag & 0x0800) ? ImageResource_factory_pass_v_40x100 : ImageResource_factory_port_b_40x100);
M5.EPD.WritePartGram4bpp(4, 720, 40, 100, (_pass_flag & 0x1000) ? ImageResource_factory_pass_v_40x100 : ImageResource_factory_port_c_40x100);
M5.EPD.UpdateArea(0, 720, 540, 240, mode);
}
bool Frame_FactoryTest::checkGrove(int sda, int scl) {
Wire1.begin(sda, scl, 10000);
bool groveCheck = true;
Wire1.beginTransmission(0x76);
Wire1.write(0xD0);
if (Wire1.endTransmission() != 0) {
groveCheck = false;
} else {
Wire1.requestFrom(0x76, 1);
uint8_t chipID = Wire1.read();
if (chipID != 0x58) {
groveCheck = false;
}
}
return groveCheck;
}
void Frame_FactoryTest::drawPassCount(m5epd_update_mode_t mode) {
uint16_t x = _pass_flag, n = 0;
for (; x; x >>= 1)
n += x & 1;
char buf[20];
sprintf(buf, "PASS %d/13", n);
_canvas_pass->fillCanvas(0);
_canvas_pass->drawString(buf, 150, 14);
_canvas_pass->pushCanvas(375, 28, mode);
}
void Frame_FactoryTest::scan(String *ssid, int32_t *rssi) {
WiFi.mode(WIFI_STA);
WiFi.disconnect();
WiFi.scanNetworks(true);
int wifi_num;
while (1) {
wifi_num = WiFi.scanComplete();
if (wifi_num >= 0) {
break;
}
}
*ssid = WiFi.SSID(0);
*rssi = WiFi.RSSI(0);
WiFi.scanDelete();
}
int Frame_FactoryTest::run() {
uint16_t pass_flag = _pass_flag;
char buf[100];
// POS
if ((M5.TP.readFingerX(0) != _last_x) || (M5.TP.readFingerY(0) != _last_y)) {
pass_flag |= 0x0200;
_last_x = M5.TP.readFingerX(0);
_last_y = M5.TP.readFingerY(0);
sprintf(buf, "X %d, Y %d", _last_x, _last_y);
_canvas_pos->fillCanvas(0);
_canvas_pos->drawString(buf, POS_RX, 30);
_canvas_pos->pushCanvas(300, 640, UPDATE_MODE_A2);
}
// BTN
M5.update();
int ptr = 0;
bool ispressed = false;
if (_btn == 0x07) {
_btn |= 0x08;
pass_flag |= 0x0100;
}
if (M5.BtnL.isPressed()) {
_btn |= 0x01;
buf[ptr++] = 'L';
ispressed = true;
}
if (M5.BtnP.isPressed()) {
_btn |= 0x02;
buf[ptr++] = 'P';
ispressed = true;
}
if (M5.BtnR.isPressed()) {
_btn |= 0x04;
buf[ptr++] = 'R';
ispressed = true;
}
buf[ptr] = '\0';
if(ptr == 0) {
strcpy(buf, "Waiting...");
}
if (ispressed) {
_canvas_btn->fillCanvas(0);
_canvas_btn->drawString(buf, POS_RX, 30);
_canvas_btn->pushCanvas(300, 580, UPDATE_MODE_A2);
}
if (millis() - _time > 1000) {
_time = millis();
rtc_time_t time_struct;
rtc_date_t date_struct;
M5.RTC.getTime(&time_struct);
M5.RTC.getDate(&date_struct);
if ((date_struct.year > 2010) && (time_struct.hour <= 24) && (time_struct.min <= 60) && (time_struct.sec <= 60)) {
pass_flag |= 0x01;
}
if (_prev_sec == 255) {
_prev_sec = time_struct.sec;
}
if (time_struct.sec != _prev_sec) {
pass_flag |= 0x02;
}
_canvas_data->fillCanvas(0);
_canvas_data->setTextSize(26);
// RTC
sprintf(buf, "%04d - %02d - %02d", date_struct.year, date_struct.mon, date_struct.day);
_canvas_data->drawString(buf, POS_RX, 30);
sprintf(buf, "%02d : %02d : %02d", time_struct.hour, time_struct.min, time_struct.sec);
_canvas_data->drawString(buf, POS_RX, 90);
// SHT30
M5.SHT30.UpdateData();
if(M5.SHT30.GetError() == 0) {
float ctemp = M5.SHT30.GetTemperature();
float chumi = M5.SHT30.GetRelHumidity();
if (!(pass_flag & 0x04)) {
if (_prev_temp > 100) {
_prev_temp = ctemp;
}
if ((ctemp < 40) && (ctemp > 0) && (_prev_temp != ctemp)) {
pass_flag |= 0x04;
}
}
if (!(pass_flag & 0x08)) {
if (_prev_hum > 100) {
_prev_hum = chumi;
}
if ((chumi >= 0) && (chumi <= 100) && (_prev_hum != chumi)) {
pass_flag |= 0x08;
}
}
sprintf(buf, "%.2f ℃", ctemp);
_canvas_data->drawString(buf, POS_RX, 150);
sprintf(buf, "%d %%", (int)chumi);
_canvas_data->drawString(buf, POS_RX, 210);
} else {
_canvas_data->drawString("[FAILED]", POS_RX, 150);
_canvas_data->drawString("[FAILED]", POS_RX, 210);
}
// Battery
uint32_t vol = M5.getBatteryVoltage();
if (_prev_vol == 0) {
_prev_vol = vol;
}
if (_prev_vol != vol) {
pass_flag |= 0x10;
}
float vol_f = vol / 1000.0f;
sprintf(buf, "%.2f V", vol_f);
_canvas_data->drawString(buf, POS_RX, 270);
// WiFi
if (_isfirst) {
String ssid;
int32_t rssi;
scan(&ssid, &rssi);
sprintf(buf, "%s (%d db)", ssid.c_str(), rssi);
_wifistr = String(buf);
if (rssi > -55) {
pass_flag |= 0x20;
}
}
_canvas_data->drawString(_wifistr, POS_RX, 330);
// PSRAM
if (_isfirst) {
uint8_t *test_p = (uint8_t *)ps_malloc(16);
if (test_p != NULL) {
free(test_p);
_psram_success = true;
sprintf(buf, "Free %.2f KiB", ESP.getFreePsram() / 1024.0f);
_canvas_data->drawString(buf, POS_RX, 390);
pass_flag |= 0x40;
} else {
_psram_success = false;
sprintf(buf, "[FAILED]");
_canvas_data->drawString(buf, POS_RX, 390);
}
} else {
if (_psram_success) {
sprintf(buf, "Free %.2f KiB", ESP.getFreePsram() / 1024.0f);
_canvas_data->drawString(buf, POS_RX, 390);
} else {
_canvas_data->drawString("[FAILED]", POS_RX, 390);
}
}
// SD
if (GetInitStatus(0)) {
sprintf(buf, "%.2f MiB", SD.cardSize() / 1024.0f / 1024.0f);
_canvas_data->drawString(buf, POS_RX, 450);
} else {
_canvas_data->drawString("[FAILED]", POS_RX, 450);
}
_canvas_data->pushCanvas(300, 100, UPDATE_MODE_A2);
}
// grove
uint16_t temp = pass_flag;
if (!(pass_flag & 0x0400)) {
pass_flag |= checkGrove(M5EPD_PORTA_Y_PIN, M5EPD_PORTA_W_PIN) ? 0x0400 : 0x0000;
}
if (!(pass_flag & 0x0800)) {
pass_flag |= checkGrove(M5EPD_PORTB_Y_PIN, M5EPD_PORTB_W_PIN) ? 0x0800 : 0x0000;
}
if (!(pass_flag & 0x1000)) {
pass_flag |= checkGrove(M5EPD_PORTC_Y_PIN, M5EPD_PORTC_W_PIN) ? 0x1000 : 0x0000;
}
bool update_flag = false;
if(temp != pass_flag) {
if(pass_flag != _pass_flag) {
update_flag = true;
}
_pass_flag = pass_flag;
drawGrove(UPDATE_MODE_GL16);
update_flag = true;
} else if (update_flag || (pass_flag != _pass_flag)) {
_pass_flag = pass_flag;
drawItem(UPDATE_MODE_GL16);
update_flag = true;
}
if(update_flag) {
drawPassCount(UPDATE_MODE_GL16);
}
if (_isfirst) {
_isfirst = false;
}
return 1;
}
int Frame_FactoryTest::init(epdgui_args_vector_t &args) {
_is_run = 1;
M5.EPD.Clear();
_canvas_title->pushCanvas(0, 8, UPDATE_MODE_NONE);
_canvas_base->pushCanvas(0, 100, UPDATE_MODE_NONE);
drawItem(UPDATE_MODE_NONE);
drawGrove(UPDATE_MODE_NONE);
drawPassCount(UPDATE_MODE_NONE);
EPDGUI_AddObject(_key_exit);
_time = 0;
_btn = 0;
_psram_success = false;
_isfirst = true;
_last_x = 0;
_last_y = 0;
_prev_sec = 255;
_prev_temp = 255;
_prev_hum = 255;
_prev_vol = 0;
return 3;
}