Update to 0.2.0

This commit is contained in:
fvanroie 2020-10-19 22:10:35 +02:00
parent 9e2795600c
commit c1e497c3ad
12 changed files with 356 additions and 33 deletions

View File

@ -2,8 +2,8 @@
#define HASP_CONF_H #define HASP_CONF_H
#define HASP_VERSION_MAJOR 0 #define HASP_VERSION_MAJOR 0
#define HASP_VERSION_MINOR 1 #define HASP_VERSION_MINOR 2
#define HASP_VERSION_REVISION 0 #define HASP_VERSION_REVISION 1014
#define HASP_USE_APP 1 #define HASP_USE_APP 1
@ -35,7 +35,7 @@
#endif #endif
#ifndef HASP_USE_SYSLOG #ifndef HASP_USE_SYSLOG
#define HASP_USE_SYSLOG 0 #define HASP_USE_SYSLOG 1
#endif #endif
#ifndef HASP_USE_TELNET #ifndef HASP_USE_TELNET

View File

@ -157,8 +157,8 @@ build_flags =
[env:d1mini-lolintft24] [env:d1mini-lolintft24]
platform = espressif8266@^2.4.0 ;@2.3.2 platform = espressif8266@^2.4.0 ;@2.3.2
board = d1_mini board = d1_mini
upload_port = COM7 ; To change the port, use platform_override.ini ;upload_port = To change the port, use platform_override.ini
monitor_port = COM7 ; To change the port, use platform_override.ini ;monitor_port = To change the port, use platform_override.ini
board_build.f_flash = 40000000L board_build.f_flash = 40000000L
board_build.flash_mode = dout board_build.flash_mode = dout
board_build.ldscript = eagle.flash.4m2m.ld ; 2Mb Spiffs board_build.ldscript = eagle.flash.4m2m.ld ; 2Mb Spiffs

View File

@ -682,8 +682,8 @@ void haspClearPage(uint16_t pageid)
lv_obj_t * page = get_page(pageid); lv_obj_t * page = get_page(pageid);
if(!page) { if(!page) {
Log.warning(F("HASP: Page ID %u not defined"), pageid); Log.warning(F("HASP: Page ID %u not defined"), pageid);
} else if(page == lv_layer_sys() || page == lv_layer_top()) { } else if(page == lv_layer_sys() /*|| page == lv_layer_top()*/) {
Log.warning(F("HASP: Cannot clear a layer")); Log.warning(F("HASP: Cannot clear system layer"));
} else { } else {
Log.notice(F("HASP: Clearing page %u"), pageid); Log.notice(F("HASP: Clearing page %u"), pageid);
lv_obj_clean(pages[pageid]); lv_obj_clean(pages[pageid]);

View File

@ -19,6 +19,7 @@
#include "hasp_mqtt.h" #include "hasp_mqtt.h"
#endif #endif
#include "hasp_conf.h"
#include "hasp_debug.h" #include "hasp_debug.h"
#include "hasp_config.h" #include "hasp_config.h"
#include "hasp_dispatch.h" #include "hasp_dispatch.h"
@ -37,6 +38,7 @@
#if HASP_USE_SYSLOG > 0 #if HASP_USE_SYSLOG > 0
#include "Syslog.h" #include "Syslog.h"
#include <WiFiUdp.h>
#ifndef SYSLOG_SERVER #ifndef SYSLOG_SERVER
#define SYSLOG_SERVER "" #define SYSLOG_SERVER ""
@ -280,6 +282,9 @@ static void debugPrintLvglMemory(int level, Print * _logOutput)
static void debugPrintPriority(int level, Print * _logOutput) static void debugPrintPriority(int level, Print * _logOutput)
{ {
if(_logOutput == &syslogClient) {
}
switch(level) { switch(level) {
case LOG_LEVEL_FATAL: case LOG_LEVEL_FATAL:
case LOG_LEVEL_ERROR: case LOG_LEVEL_ERROR:

View File

@ -7,6 +7,7 @@
#include "hasp_config.h" #include "hasp_config.h"
#include "hasp_debug.h" #include "hasp_debug.h"
#include "hasp_gui.h" #include "hasp_gui.h"
#include "hasp_oobe.h"
#include "hasp_hal.h" #include "hasp_hal.h"
#include "hasp.h" #include "hasp.h"
@ -119,7 +120,7 @@ void dispatchAttribute(String strTopic, const char * payload)
dispatchWebUpdate(payload); dispatchWebUpdate(payload);
} else if(strTopic == F("setupap")) { } else if(strTopic == F("setupap")) {
// haspDisplayAP(String(F("HASP-ABC123")).c_str(), String(F("haspadmin")).c_str()); oobeFakeSetup();
} else if(strTopic.length() == 7 && strTopic.startsWith(F("output"))) { } else if(strTopic.length() == 7 && strTopic.startsWith(F("output"))) {
dispatchOutput(strTopic, payload); dispatchOutput(strTopic, payload);

View File

@ -375,10 +375,14 @@ void webHandleAbout()
F("<p><h3>ArduinoLog</h3>Copyright&copy; 2017,2018 Thijs Elenbaas, MrRobot62, rahuldeo2047, NOX73, " F("<p><h3>ArduinoLog</h3>Copyright&copy; 2017,2018 Thijs Elenbaas, MrRobot62, rahuldeo2047, NOX73, "
"dhylands, Josha blemasle, mfalkvidd"); "dhylands, Josha blemasle, mfalkvidd");
httpMessage += FPSTR(MIT_LICENSE); httpMessage += FPSTR(MIT_LICENSE);
#if HASP_USE_SYSLOG > 0
httpMessage += F("<p><h3>Syslog</h3>Copyright&copy; 2016 Martin Sloup"); httpMessage += F("<p><h3>Syslog</h3>Copyright&copy; 2016 Martin Sloup");
httpMessage += FPSTR(MIT_LICENSE); httpMessage += FPSTR(MIT_LICENSE);
#endif
#if HASP_USE_QRCODE > 0
httpMessage += F("<p><h3>QR Code generator</h3>Copyright&copy; Project Nayuki"); httpMessage += F("<p><h3>QR Code generator</h3>Copyright&copy; Project Nayuki");
httpMessage += FPSTR(MIT_LICENSE); httpMessage += FPSTR(MIT_LICENSE);
#endif
httpMessage += F("<p><h3>AceButton</h3>Copyright&copy; 2018 Brian T. Park"); httpMessage += F("<p><h3>AceButton</h3>Copyright&copy; 2018 Brian T. Park");
httpMessage += FPSTR(MIT_LICENSE); httpMessage += FPSTR(MIT_LICENSE);
@ -1220,6 +1224,7 @@ void webHandleDebugConfig()
httpMessage += settings[FPSTR(F_DEBUG_TELEPERIOD)].as<String>(); httpMessage += settings[FPSTR(F_DEBUG_TELEPERIOD)].as<String>();
httpMessage += F("'></p>"); httpMessage += F("'></p>");
#if HASP_USE_SYSLOG > 0
httpMessage += F("<b>Syslog Hostame</b> <i><small>(optional)</small></i><input id='host' " httpMessage += F("<b>Syslog Hostame</b> <i><small>(optional)</small></i><input id='host' "
"name='host' maxlength=31 placeholder='logserver' value='"); "name='host' maxlength=31 placeholder='logserver' value='");
httpMessage += settings[FPSTR(F_CONFIG_HOST)].as<String>(); httpMessage += settings[FPSTR(F_CONFIG_HOST)].as<String>();
@ -1238,6 +1243,7 @@ void webHandleDebugConfig()
httpMessage += F(">IETF (RFC 5424) &nbsp; <input id='proto' name='proto' type='radio' value='1'"); httpMessage += F(">IETF (RFC 5424) &nbsp; <input id='proto' name='proto' type='radio' value='1'");
if(settings[FPSTR(F_CONFIG_PROTOCOL)].as<uint8_t>() == 1) httpMessage += F(" checked"); if(settings[FPSTR(F_CONFIG_PROTOCOL)].as<uint8_t>() == 1) httpMessage += F(" checked");
httpMessage += F(">BSD (RFC 3164)"); httpMessage += F(">BSD (RFC 3164)");
#endif
httpMessage += F("</p><p><button type='submit' name='save' value='debug'>Save Settings</button></p></form>"); httpMessage += F("</p><p><button type='submit' name='save' value='debug'>Save Settings</button></p></form>");

View File

@ -33,6 +33,7 @@ void oobeSetAutoCalibrate(bool cal)
static inline void oobeSetPage(uint8_t pageid) static inline void oobeSetPage(uint8_t pageid)
{ {
lv_scr_load(oobepage[pageid]); lv_scr_load(oobepage[pageid]);
lv_obj_invalidate(lv_disp_get_layer_sys(NULL));
} }
void gotoPage1_cb(lv_obj_t * event_kb, lv_event_t event) void gotoPage1_cb(lv_obj_t * event_kb, lv_event_t event)
@ -293,13 +294,39 @@ static void oobe_calibrate_cb(lv_obj_t * ta, lv_event_t event)
} }
} }
void oobeSetup() bool oobeSetup()
{ {
#if HASP_USE_WIFI > 0
char ssid[32]; char ssid[32];
char pass[32]; char pass[32];
#if HASP_USE_WIFI>0
if(wifiShowAP(ssid, pass)) { if(wifiShowAP(ssid, pass)) {
guiSetDim(100);
oobeSetupQR(ssid, pass);
oobeSetupSsid();
if(oobeAutoCalibrate) {
lv_obj_set_click(lv_disp_get_layer_sys(NULL), true);
lv_obj_set_event_cb(lv_disp_get_layer_sys(NULL), oobe_calibrate_cb);
Log.verbose(F("OOBE: Enabled Auto Calibrate on touch"));
} else {
lv_obj_set_click(lv_disp_get_layer_sys(NULL), false);
lv_obj_set_event_cb(lv_disp_get_layer_sys(NULL), gotoPage1_cb);
Log.verbose(F("OOBE: Already calibrated"));
}
oobeSetPage(0);
return true;
} else {
return false;
}
#endif
}
void oobeFakeSetup()
{
char ssid[32] = "HASP-ABCDEF";
char pass[32] = "haspadmin";
guiSetDim(100); guiSetDim(100);
oobeSetupQR(ssid, pass); oobeSetupQR(ssid, pass);
oobeSetupSsid(); oobeSetupSsid();
@ -315,5 +342,3 @@ void oobeSetup()
Log.verbose(F("OOBE: Already calibrated")); Log.verbose(F("OOBE: Already calibrated"));
} }
} }
#endif
}

View File

@ -1,2 +1,3 @@
void oobeSetAutoCalibrate(bool cal); void oobeSetAutoCalibrate(bool cal);
void oobeSetup(); bool oobeSetup();
void oobeFakeSetup();

View File

@ -52,8 +52,9 @@ void setup()
#endif #endif
guiSetup(); guiSetup();
oobeSetup(); if(!oobeSetup()) {
haspSetup(); haspSetup();
}
#if HASP_USE_MDNS > 0 #if HASP_USE_MDNS > 0
mdnsSetup(); mdnsSetup();

28
test/connect.robot Normal file
View File

@ -0,0 +1,28 @@
*** Settings ***
| Library | String
| Library | MQTTLibrary
| Test Timeout | 30 seconds
*** Variables ***
| ${broker.uri} | 10.4.0.5
| ${broker.port} | 1883
| ${client.id} | test.client
| *Test Cases*
| Connect to a broker with default port and client id
| | ${mqttc} | Connect | ${broker.uri}
| | ${client_id} = | Decode Bytes To String | ${mqttc._client_id} | UTF-8
| | Should Be Empty | ${client_id} |
| | [Teardown] | Disconnect
| Connect to a broker with default port and specified client id
| | ${mqttc} | Connect | ${broker.uri} | client_id=${client.id}
| | Should be equal as strings | ${mqttc._client_id} | ${client.id}
| | [Teardown] | Disconnect
| Connect to a broker with specified port and client id
| | ${mqttc} | Connect | ${broker.uri} | ${broker.port} | ${client.id}
| | Should be equal as strings | ${mqttc._client_id} | ${client.id}
| | [Teardown] | Disconnect

165
test/hasp-lvgl.robot Normal file
View File

@ -0,0 +1,165 @@
| *Settings* | *Value*
| Resource | keywords.robot
| Test Timeout | 240 seconds
| *Keywords*
| Test Property
| | [Arguments] | ${broker.uri}=${broker.uri} | ${port}=${broker.port}
| | ... | ${client.id}=${client.id} | ${clean_session}=${true}
| | ... | ${property}=${property} | ${data}=${data}
| | ${time} | Get Time | epoch
| | ${client} | Catenate | SEPARATOR=. | robot.mqtt | ${time}
| | ${topic} | Set Variable | hasp/plate35/command
| | ${restopic} | Set Variable | hasp/plate35/state/json
| | ${qos} | Set Variable | 1
| | ${message} | Set Variable | ${property}=${data}
| | ${result} | Set Variable | {"${property}":"${data}"}
| | Sleep | .01s
| | Subscribe Async | client.id=${client} | topic=${restopic}
| | Connect | ${broker.uri} | ${port} | ${client.id} | ${clean_session}
| | Publish | ${topic} | ${message} | 1
| | Publish | ${topic} | ${property} | 1
| | log to console | ${result}
| | @{messages} | Listen and Get Messages | topic=${restopic} | limit=1 | timeout=1.5
| | LOG | ${messages}
| | Length Should Be | ${messages} | 1
| | Should Be Equal As Strings | ${messages}[0] | ${result}
| Test Page
| | [Arguments] | ${broker.uri}=${broker.uri} | ${port}=${broker.port}
| | ... | ${client.id}=${client.id} | ${clean_session}=${true}
| | ... | ${property}=${property} | ${data}=${data}
| | ${time} | Get Time | epoch
| | ${client} | Catenate | SEPARATOR=. | robot.mqtt | ${time}
| | ${topic} | Set Variable | hasp/plate35/command
| | ${restopic} | Set Variable | hasp/plate35/state/page
| | ${qos} | Set Variable | 1
| | ${message} | Set Variable | ${property}=${data}
| | Subscribe Async | client.id=${client} | topic=${restopic}
| | Connect | ${broker.uri} | ${port} | ${client.id} | ${clean_session}
| | Publish | ${topic} | ${message} | 1
| | Publish | ${topic} | ${property} | 1
| | @{messages} | Listen and Get Messages | topic=${restopic} | limit=1 | timeout=1
| | LOG | ${messages}
| | Length Should Be | ${messages} | 1
| | Should Be Equal As Strings | ${messages}[0] | ${data}
| *Test Cases*
| Test Color Picker\n
| | ${obj} | Set Variable | p[1].b[4]
| | Test Page | property=page | data=1
#| | Test Property | property=${obj}.txt | data=ABC
#| | Test Property | property=${obj}.txt | data=1234
| | Test Property | property=${obj}.x | data=50
| | Test Property | property=${obj}.x | data=60
| | Test Property | property=${obj}.y | data=70
| | Test Property | property=${obj}.y | data=80
| | Test Property | property=${obj}.w | data=80
| | Test Property | property=${obj}.w | data=100
| | Test Property | property=${obj}.h | data=80
| | Test Property | property=${obj}.h | data=100
| | Test Property | property=${obj}.hidden | data=1
| | Test Property | property=${obj}.hidden | data=0
| | Test Property | property=${obj}.vis | data=0
| | Test Property | property=${obj}.vis | data=1
| | Test Property | property=${obj}.enabled | data=0
| | Test Property | property=${obj}.enabled | data=1
| | Test Property | property=${obj}.opacity | data=0
| | Test Property | property=${obj}.opacity | data=64
| | Test Property | property=${obj}.opacity | data=192
| | Test Property | property=${obj}.opacity | data=255
#| | Test Property | property=${obj}.rect | data=1
#| | Test Property | property=${obj}.rect | data=0
| | Test Property | property=${obj}.val | data=50
| | Test Property | property=${obj}.val | data=60
| | Test Property | property=${obj}.val | data=70
| | Test Property | property=${obj}.val | data=80
| Test Text Field\n
| | ${obj} | Set Variable | p[1].b[1]
| | Test Page | property=page | data=1
| | Test Property | property=${obj}.txt | data=ABC
| | Test Property | property=${obj}.txt | data=123
| | Test Property | property=${obj}.x | data=20
| | Test Property | property=${obj}.x | data=10
| | Test Property | property=${obj}.y | data=20
| | Test Property | property=${obj}.y | data=10
#| | Test Property | property=${obj}.w | data=80
#| | Test Property | property=${obj}.w | data=75
#| | Test Property | property=${obj}.h | data=36
#| | Test Property | property=${obj}.h | data=18
| | Test Property | property=${obj}.hidden | data=1
| | Test Property | property=${obj}.hidden | data=0
| | Test Property | property=${obj}.vis | data=0
| | Test Property | property=${obj}.vis | data=1
| | Test Property | property=${obj}.enabled | data=0
| | Test Property | property=${obj}.enabled | data=1
| | Test Property | property=${obj}.opacity | data=0
| | Test Property | property=${obj}.opacity | data=64
| | Test Property | property=${obj}.opacity | data=192
| | Test Property | property=${obj}.opacity | data=255
| Test Button\n
| | ${obj} | Set Variable | p[0].b[1]
| | Test Page | property=page | data=0
#| | Test Property | property=${obj}.txt | data=ABC
#| | Test Property | property=${obj}.txt | data=1234
| | Test Property | property=${obj}.x | data=20
| | Test Property | property=${obj}.x | data=10
| | Test Property | property=${obj}.y | data=20
| | Test Property | property=${obj}.y | data=10
| | Test Property | property=${obj}.w | data=80
| | Test Property | property=${obj}.w | data=75
| | Test Property | property=${obj}.h | data=36
| | Test Property | property=${obj}.h | data=18
| | Test Property | property=${obj}.hidden | data=1
| | Test Property | property=${obj}.hidden | data=0
| | Test Property | property=${obj}.vis | data=0
| | Test Property | property=${obj}.vis | data=1
| | Test Property | property=${obj}.enabled | data=0
| | Test Property | property=${obj}.enabled | data=1
| | Test Property | property=${obj}.opacity | data=0
| | Test Property | property=${obj}.opacity | data=64
| | Test Property | property=${obj}.opacity | data=192
| | Test Property | property=${obj}.opacity | data=255
| | Test Property | property=${obj}.toggle | data=0
| | Test Property | property=${obj}.toggle | data=1
| | Test Property | property=${obj}.val | data=0
| | Test Property | property=${obj}.val | data=1
| | Test Property | property=${obj}.val | data=2
| | Test Property | property=${obj}.val | data=3
| Test Slider\n
| | ${obj} | Set Variable | p[1].b[3]
| | Test Page | property=page | data=1
#| | Test Property | property=${obj}.txt | data=ABC
#| | Test Property | property=${obj}.txt | data=1234
| | Test Property | property=${obj}.x | data=20
| | Test Property | property=${obj}.x | data=10
| | Test Property | property=${obj}.y | data=20
| | Test Property | property=${obj}.y | data=10
| | Test Property | property=${obj}.w | data=80
| | Test Property | property=${obj}.w | data=75
| | Test Property | property=${obj}.h | data=36
| | Test Property | property=${obj}.h | data=18
| | Test Property | property=${obj}.hidden | data=1
| | Test Property | property=${obj}.hidden | data=0
| | Test Property | property=${obj}.vis | data=0
| | Test Property | property=${obj}.vis | data=1
| | Test Property | property=${obj}.enabled | data=0
| | Test Property | property=${obj}.enabled | data=1
| | Test Property | property=${obj}.opacity | data=0
| | Test Property | property=${obj}.opacity | data=64
| | Test Property | property=${obj}.opacity | data=192
| | Test Property | property=${obj}.opacity | data=255
| | Test Property | property=${obj}.max | data=200
| | Test Property | property=${obj}.min | data=100
| | Test Property | property=${obj}.min | data=50
| | Test Property | property=${obj}.max | data=150
| | Test Property | property=${obj}.val | data=50
| | Test Property | property=${obj}.val | data=60
| | Test Property | property=${obj}.val | data=70
| | Test Property | property=${obj}.val | data=80

91
test/keywords.robot Normal file
View File

@ -0,0 +1,91 @@
| *Settings* | *Value*
| Library | MQTTLibrary
| Library | BuiltIn
| *Variables* | *Value*
#| ${broker.uri} | mqtt.eclipse.org
| ${broker.uri} | 10.4.0.5
| ${broker.port} | 1883
| ${client.id} | mqtt.test.client
| ${topic} | test/mqtt_test
| ${sub.topic} | test/mqtt_test_sub
| *Keywords* |
| Easy Connect
| | [Arguments] | ${broker.uri}=${broker.uri} | ${port}=${broker.port}
| | ... | ${client.id}=${client.id} | ${clean_session}=${true}
| | Connect | ${broker.uri} | ${port} | ${client.id} | ${clean_session}
| Publish to MQTT Broker
| | [Arguments] | ${broker.uri}=${broker.uri} | ${port}=${broker.port}
| | ... | ${client.id}=${client.id} | ${clean_session}=${true}
| | ... | ${topic}=${topic} | ${message}=${EMPTY}
| | ... | ${qos}=0 | ${retention}=${false}
| | Connect | ${broker.uri} | ${port} | ${client.id} | ${clean_session}
| | Publish | ${topic} | ${message} | ${qos} | ${retention}
| Publish to MQTT Broker and Disconnect
| | [Arguments] | ${broker.uri}=${broker.uri} | ${port}=${broker.port}
| | ... | ${client.id}=${client.id} | ${clean_session}=${true}
| | ... | ${topic}=${topic} | ${message}=${EMPTY}
| | ... | ${qos}=0 | ${retention}=${false}
| | Connect | ${broker.uri} | ${port} | ${client.id} | ${clean_session}
| | Publish | ${topic} | ${message} | ${qos} | ${retention}
| | [Teardown] | Disconnect
| Subscribe to MQTT Broker and Validate
| | [Arguments] | ${broker.uri}=${broker.uri} | ${port}=${broker.port}
| | ... | ${client.id}=${client.id} | ${topic}=${topic}
| | ... | ${message}=${EMPTY} | ${qos}=1
| | ... | ${timeout}=1s
| | Connect | ${broker.uri} | ${port} | ${client.id} | ${false}
| | Subscribe and Validate
| | ... | ${topic} | ${qos} | ${message} | ${timeout}
| | [Teardown] | Disconnect
| Subscribe and Get Messages
| | [Arguments] | ${broker.uri}=${broker.uri} | ${port}=${broker.port}
| | ... | ${client.id}=${client.id} | ${topic}=${topic}
| | ... | ${qos}=1 | ${timeout}=1s
| | ... | ${limit}=1
| | Connect | ${broker.uri} | ${port} | ${client.id} | ${false}
| | @{messages} | Subscribe | ${topic} | ${qos} | ${timeout} | ${limit}
| | [Teardown] | Disconnect
| | [Return] | @{messages}
| Subscribe Async
| | [Arguments] | ${broker.uri}=${broker.uri} | ${port}=${broker.port}
| | ... | ${client.id}=${client.id} | ${topic}=${topic}
| | ... | ${qos}=1 | ${timeout}=0s
| | ... | ${limit}=1
| | Connect | ${broker.uri} | ${port} | ${client.id} | ${false}
| | Subscribe | ${topic} | ${qos} | ${timeout} | ${limit}
| Unsubscribe and Disconnect
| | [Arguments] | ${topic}=${topic}
| | Unsubscribe | ${topic}
| | [Teardown] | Disconnect
| Unsubscribe Multiple and Disconnect
| | [Arguments] | @{topics}
| | FOR | ${topic} | IN | @{topics}
| | | Unsubscribe | ${topic}
| | END
| | [Teardown] | Disconnect
| Subscribe and Unsubscribe
| | [Arguments] | ${broker.uri}=${broker.uri} | ${port}=${broker.port}
| | ... | ${client.id}=${client.id} | ${topic}=${topic}
| | ... | ${qos}=1 | ${timeout}=1s
| | ... | ${limit}=1
| | Connect | ${broker.uri} | ${port} | ${client.id} | ${false}
| | @{messages} | Subscribe | ${topic} | ${qos} | ${timeout} | ${limit}
| | Unsubscribe | ${topic}
| | [Teardown] | Disconnect
| | [Return] | @{messages}
| Listen and Get Messages
| | [Arguments] | ${topic}=${topic} | ${timeout}=1s
| | ... | ${limit}=1
| | @{messages} | Listen | ${topic} | ${timeout} | ${limit}
| | [Return] | @{messages}