diff --git a/lastEnumTemplate.txt b/lastEnumTemplate.txt deleted file mode 100644 index f2e93ae21..000000000 --- a/lastEnumTemplate.txt +++ /dev/null @@ -1,7 +0,0 @@ -{ 17822728f value == '1' } - Ok -{ 2.121830e-304lif value == '0' } - Bad -{-9.255963e+61lse } - Unknown -{-9.255963e+61ndif } \ No newline at end of file diff --git a/openBeken_win32_mvsc2017.vcxproj b/openBeken_win32_mvsc2017.vcxproj index 9f0837080..ff2475da9 100644 --- a/openBeken_win32_mvsc2017.vcxproj +++ b/openBeken_win32_mvsc2017.vcxproj @@ -242,6 +242,7 @@ + @@ -791,8 +792,10 @@ + + diff --git a/openBeken_win32_mvsc2017.vcxproj.filters b/openBeken_win32_mvsc2017.vcxproj.filters index c81b78911..f676e065d 100644 --- a/openBeken_win32_mvsc2017.vcxproj.filters +++ b/openBeken_win32_mvsc2017.vcxproj.filters @@ -414,6 +414,9 @@ + + + diff --git a/platforms/obk_main.cmake b/platforms/obk_main.cmake index 6a5092a2f..fc7e7cca4 100644 --- a/platforms/obk_main.cmake +++ b/platforms/obk_main.cmake @@ -97,6 +97,7 @@ set(OBKM_SRC ${OBK_SRCS}driver/drv_max72xx_internal.c ${OBK_SRCS}driver/drv_max72xx_single.c ${OBK_SRCS}driver/drv_mcp9808.c + ${OBK_SRCS}driver/drv_multiPinI2CScanner.c ${OBK_SRCS}driver/drv_ntp.c ${OBK_SRCS}driver/drv_ntp_events.c ${OBK_SRCS}driver/drv_openWeatherMap.c diff --git a/platforms/obk_main.mk b/platforms/obk_main.mk index 2df02333d..9a39903bd 100644 --- a/platforms/obk_main.mk +++ b/platforms/obk_main.mk @@ -117,6 +117,7 @@ OBKM_SRC += $(OBK_SRCS)driver/drv_max72xx_clock.c OBKM_SRC += $(OBK_SRCS)driver/drv_max72xx_internal.c OBKM_SRC += $(OBK_SRCS)driver/drv_max72xx_single.c OBKM_SRC += $(OBK_SRCS)driver/drv_mcp9808.c +OBKM_SRC += $(OBK_SRCS)driver/drv_multiPinI2CScanner.c OBKM_SRC += $(OBK_SRCS)driver/drv_ntp.c OBKM_SRC += $(OBK_SRCS)driver/drv_ntp_events.c OBKM_SRC += $(OBK_SRCS)driver/drv_openWeatherMap.c diff --git a/src/driver/drv_ddpSend.c b/src/driver/drv_ddpSend.c index 7fb64d1bc..833524681 100644 --- a/src/driver/drv_ddpSend.c +++ b/src/driver/drv_ddpSend.c @@ -132,7 +132,7 @@ void DRV_DDPSend_Shutdown() } g_queue = 0; } -void DRV_DDPSend_AppendInformationToHTTPIndexPage(http_request_t* request) +void DRV_DDPSend_AppendInformationToHTTPIndexPage(http_request_t* request, int bPreState) { hprintf255(request, "

DDP sent: %i packets, %i bytes, errored packets: %i

", stat_sendPackets, stat_sendBytes, stat_failedPackets); diff --git a/src/driver/drv_local.h b/src/driver/drv_local.h index 6c3496ae9..5fe40936b 100644 --- a/src/driver/drv_local.h +++ b/src/driver/drv_local.h @@ -61,6 +61,9 @@ void DRV_GosundSW2_RunFrame(); void DRV_PinMutex_Init(); void DRV_PinMutex_RunFrame(); +void MultiPinI2CScanner_Init(); +void MultiPinI2CScanner_RunFrame(); +void MultiPinI2CScanner_AppendInformationToHTTPIndexPage(http_request_t *request, int bPreState); void SM16703P_Init(); void SM16703P_Shutdown(); @@ -167,6 +170,9 @@ void PIR_AppendInformationToHTTPIndexPage(http_request_t *request, int bPreState void TMGN_RunQuickTick(); void DRV_MAX72XX_Init(); +void DRV_MAX72XX_Shutdown(); +int MAX72XXSingle_CountPixels(bool bOn); +int MAX72XXSingle_GetScrollCount(); void apply_smart_light(); @@ -234,7 +240,7 @@ void TCL_DoDiscovery(const char *topic); void DRV_DDPSend_Init(); void DRV_DDPSend_Shutdown(); void DRV_DDPSend_RunFrame(); -void DRV_DDPSend_AppendInformationToHTTPIndexPage(http_request_t* request); +void DRV_DDPSend_AppendInformationToHTTPIndexPage(http_request_t* request, int bPreState); void TXW_Cam_Init(void); void TXW_Cam_RunEverySecond(void); diff --git a/src/driver/drv_main.c b/src/driver/drv_main.c index 0294cbf5f..e2d986ca2 100644 --- a/src/driver/drv_main.c +++ b/src/driver/drv_main.c @@ -195,6 +195,13 @@ static driver_t g_drivers[] = { //drvdetail:"requires":""} { "Test", Test_Init, NULL, Test_AppendInformationToHTTPIndexPage, Test_RunQuickTick, NULL, NULL, NULL, false }, #endif +#if ENABLE_MULTIPINI2CSCANNER + //drvdetail:{"name":"MultiPinI2CScanner", + //drvdetail:"title":"TODO", + //drvdetail:"descr":"qq.", + //drvdetail:"requires":""} + { "MultiPinI2CScanner", MultiPinI2CScanner_Init, NULL, MultiPinI2CScanner_AppendInformationToHTTPIndexPage, MultiPinI2CScanner_RunFrame, NULL, NULL, NULL, false }, +#endif #if ENABLE_I2C //drvdetail:{"name":"I2C", //drvdetail:"title":"TODO", @@ -431,7 +438,7 @@ static driver_t g_drivers[] = { //drvdetail:"title":"TODO", //drvdetail:"descr":"MAX72XX LED matrix display driver with font and simple script interface. See [protocol explanation](https://www.elektroda.pl/rtvforum/viewtopic.php?p=18040628#18040628)", //drvdetail:"requires":""} - { "MAX72XX", DRV_MAX72XX_Init, NULL, NULL, NULL, NULL, NULL, NULL, false }, + { "MAX72XX", DRV_MAX72XX_Init, NULL, NULL, NULL, DRV_MAX72XX_Shutdown, NULL, NULL, false }, #endif #if ENABLE_DRIVER_BMPI2C //drvdetail:{"name":"BMPI2C", diff --git a/src/driver/drv_max72xx_clock.c b/src/driver/drv_max72xx_clock.c index 00b528c4b..fa040a1e2 100644 --- a/src/driver/drv_max72xx_clock.c +++ b/src/driver/drv_max72xx_clock.c @@ -29,40 +29,6 @@ enum { CLOCK_HUMIDITY, CLOCK_TEMPERATURE, }; -bool CHANNEL_IsHumidity(int type) { - if (type == ChType_Humidity) - return true; - if (type == ChType_Humidity_div10) - return true; - return false; -} -bool CHANNEL_IsTemperature(int type) { - if (type == ChType_Temperature) - return true; - if (type == ChType_Temperature_div10) - return true; - if (type == ChType_Temperature_div100) - return true; - return false; -} -bool CHANNEL_GetGenericOfType(float *out, bool (*checker)(int type)) { - int i, t; - - for (i = 0; i < CHANNEL_MAX; i++) { - t = g_cfg.pins.channelTypes[i]; - if (checker(t)) { - *out = CHANNEL_GetFinalValue(i); - return true; - } - } - return false; -} -bool CHANNEL_GetGenericHumidity(float *out) { - return CHANNEL_GetGenericOfType(out, CHANNEL_IsHumidity); -} -bool CHANNEL_GetGenericTemperature(float *out) { - return CHANNEL_GetGenericOfType(out, CHANNEL_IsTemperature); -} void Clock_Send(int type) { char time[64]; struct tm *ltm; @@ -94,11 +60,17 @@ void Clock_Send(int type) { strcat(p, " "); } else if (type == CLOCK_HUMIDITY) { - CHANNEL_GetGenericHumidity(&val); + if (false==CHANNEL_GetGenericHumidity(&val)) { + // failed - exit early, do not change string + return; + } sprintf(time, "H: %i%% ", (int)val); } else if (type == CLOCK_TEMPERATURE) { - CHANNEL_GetGenericTemperature(&val); + if (false == CHANNEL_GetGenericTemperature(&val)) { + // failed - exit early, do not change string + return; + } sprintf(time, "T: %iC ", (int)val); } @@ -116,12 +88,9 @@ void Clock_SendHumidity() { void Clock_SendTemperature() { Clock_Send(CLOCK_TEMPERATURE); } -static int cycle = 0; +static unsigned int cycle = 0; void Run_NoAnimation() { - //int max_cycle; - //bool bHasDHT; - cycle+=4; if (cycle < 10) { Clock_SendDate(); @@ -135,9 +104,15 @@ void Run_NoAnimation() { else { Clock_SendTemperature(); } + CMD_ExecuteCommandArgs("MAX72XX_Show", "", 0); cycle %= 40; } void Run_Animated() { + cycle++; + if (cycle < 4) { + return; + } + cycle = 0; char time[64]; struct tm *ltm; char *p; @@ -148,10 +123,12 @@ void Run_Animated() { if (ltm == 0) { return; } + int scroll = MAX72XXSingle_GetScrollCount(); //scroll_cycle = 0; - if (ltm->tm_sec == 0) { + if (scroll == 0) { time[0] = 0; p = time; + p = my_strcat(p, " "); p = add_padded(p, ltm->tm_hour); p = my_strcat(p, ":"); @@ -159,29 +136,33 @@ void Run_Animated() { strcat(p, " "); p = my_strcat(p, " "); - p = add_padded(p, ltm->tm_year); + p = add_padded(p, ltm->tm_year+1900); p = my_strcat(p, "."); p = add_padded(p, ltm->tm_mon + 1); p = my_strcat(p, "."); p = add_padded(p, ltm->tm_mday); - strcat(p, ""); + strcat(p, " "); + CMD_ExecuteCommandArgs("MAX72XX_Clear", NULL, 0); CMD_ExecuteCommandArgs("MAX72XX_Print", time, 0); } - else { - CMD_ExecuteCommandArgs("MAX72XX_Scroll", "1", 0); + CMD_ExecuteCommandArgs("MAX72XX_Scroll", "-1", 0); + CMD_ExecuteCommandArgs("MAX72XX_Show", "", 0); +} +bool g_animated = false; +void DRV_MAX72XX_Clock_OnEverySecond() { + if (g_animated == false) { + Run_NoAnimation(); } } -void DRV_MAX72XX_Clock_OnEverySecond() { - Run_NoAnimation(); -} void DRV_MAX72XX_Clock_RunFrame() { - + if (g_animated) { + Run_Animated(); + } } /* Config for my clock with IR - startDriver MAX72XX MAX72XX_Setup 0 1 26 startDriver NTP @@ -243,9 +224,19 @@ if $CH10==4 then my_send_style_blue */ +static commandResult_t DRV_MAX72XX_Clock_Animate(const void *context, const char *cmd, const char *args, int flags) { + + + Tokenizer_TokenizeString(args, 0); + + g_animated = Tokenizer_GetArgInteger(0); + + + return CMD_RES_OK; +} void DRV_MAX72XX_Clock_Init() { - + CMD_RegisterCommand("MAX72XXClock_Animate", DRV_MAX72XX_Clock_Animate, NULL); } diff --git a/src/driver/drv_max72xx_internal.c b/src/driver/drv_max72xx_internal.c index 255cdd441..873cc41aa 100644 --- a/src/driver/drv_max72xx_internal.c +++ b/src/driver/drv_max72xx_internal.c @@ -32,6 +32,16 @@ #define MAX72XX_DELAY // #define MAX72XX_DELAY usleep(123); +byte *max_buffer = 0; +int max_buffer_size = 0; + +void MAX_FreeBuffer() { + if (max_buffer) { + free(max_buffer); + max_buffer = 0; + } + max_buffer_size = 0; +} void PORT_shiftOut(int dataPin, int clockPin, int bitOrder, int val, int totalBytes) { int i; @@ -51,6 +61,9 @@ void PORT_shiftOut(int dataPin, int clockPin, int bitOrder, int val, int totalBy } void MAX72XX_spiTransfer(max72XX_t *led, int adddr, unsigned char opcode, byte datta) { + if (led == 0) { + return; + } int offset, maxbytes; int i; @@ -70,6 +83,9 @@ void MAX72XX_spiTransfer(max72XX_t *led, int adddr, unsigned char opcode, byte d HAL_PIN_SetOutputValue(led->port_cs, HIGH); } void MAX72XX_shutdown(max72XX_t *led, int addr, bool b) { + if (led == 0) { + return; + } if (addr < 0 || addr >= led->maxDevices) return; if (b) @@ -78,12 +94,30 @@ void MAX72XX_shutdown(max72XX_t *led, int addr, bool b) { MAX72XX_spiTransfer(led, addr, OP_SHUTDOWN, 1); } void MAX72XX_setScanLimit(max72XX_t *led, int addr, int limit) { + if (led == 0) { + return; + } if (addr < 0 || addr >= led->maxDevices) return; if (limit >= 0 && limit < 8) MAX72XX_spiTransfer(led, addr, OP_SCANLIMIT, limit); } -void MAX72XX_clearDisplay(max72XX_t *led, int addr) { +void MAX72XX_clearDisplayFullNoSend(max72XX_t *led) { + if (led == 0) { + return; + } + for (int dev = 0; dev < led->maxDevices; dev++) { + int base = dev * 8; + for (int row = 0; row < 8; row++) { + led->led_status[base + row] = 0; + } + } +} + +void MAX72XX_clearDisplayAndSend(max72XX_t *led, int addr) { + if (led == 0) { + return; + } int offset; int i; @@ -97,12 +131,49 @@ void MAX72XX_clearDisplay(max72XX_t *led, int addr) { } void MAX72XX_setIntensity(max72XX_t *led, int addr, int intensity) { + if (led == 0) { + return; + } if (addr < 0 || addr >= led->maxDevices) return; if (intensity >= 0 && intensity < 16) MAX72XX_spiTransfer(led, addr, OP_INTENSITY, intensity); } +void MAX72XX_free(max72XX_t *led) { + if (led == 0) { + return; + } + free(led->spidata); + free(led->led_status); + free(led); +} +int MAX72XX_countPixels(max72XX_t *led, bool bOn) { + if (led == 0) + return 0; + + int count = 0; + int total = led->maxDevices * 8; + + if (bOn) { + for (int i = 0; i < total; i++) { + byte v = led->led_status[i]; + while (v) { + count += v & 1; + v >>= 1; + } + } + } + else { + count = led->maxDevices * 8 * 8; + } + + return count; +} + void MAX72XX_refresh(max72XX_t *led) { + if (led == 0) { + return; + } int i; //int mx; //byte tmp; @@ -129,6 +200,9 @@ byte Byte_ReverseBits(byte num) } void MAX72XX_displayArray(max72XX_t* led, byte *p, int devs, int ofs) { + if (led == 0) { + return; + } byte *tg; int i, mx; int targetIndex; @@ -160,25 +234,44 @@ void MAX72XX_displayArray(max72XX_t* led, byte *p, int devs, int ofs) } void MAX72XX_shift(max72XX_t *led, int d) { + if (led == 0) { + return; + } int i; int mx; + + led->scrollCount = (led->scrollCount + d + (led->maxDevices * 8)) % (led->maxDevices * 8); + // byte tmp; //int offset; //int row; - byte na[64]; mx = led->maxDevices * 8; + if (mx > max_buffer_size) { + byte *nb; + if (max_buffer) { + nb = (byte*)realloc(max_buffer, mx); + } + else { + nb = (byte*)malloc(mx); + } + if (nb == 0) { + return; + } + max_buffer_size = mx; + max_buffer = nb; + } for (i = 0; i < mx; i++) { - na[i] = 0; + max_buffer[i] = 0; } if (d == 1) { for (i = 0; i < mx; i++) { - na[i] |= led->led_status[i] << 1; + max_buffer[i] |= led->led_status[i] << 1; if (led->led_status[i] & 0b10000000 && i > 0) { - na[(i + 8) % mx] |= 0b00000001; + max_buffer[(i + 8) % mx] |= 0b00000001; } } } @@ -186,16 +279,16 @@ void MAX72XX_shift(max72XX_t *led, int d) { { for (i = 0; i < mx; i++) { - na[i] |= led->led_status[i] >> 1; + max_buffer[i] |= led->led_status[i] >> 1; if (led->led_status[i] & 0b00000001 && i > 0) { - na[(i - 8 + mx) % mx] |= 0b10000000; + max_buffer[(i - 8 + mx) % mx] |= 0b10000000; } } } for (i = 0; i < mx; i++) { - led->led_status[i] = na[i]; + led->led_status[i] = max_buffer[i]; } // for(i = 0; i < mx; i++) // { @@ -208,6 +301,9 @@ void MAX72XX_shift(max72XX_t *led, int d) { } void MAX72XX_setLed(max72XX_t *led, int addr, int row, int column, bool state) { + if (led == 0) { + return; + } int offset; byte val = 0x00; @@ -241,6 +337,9 @@ void MAX72XX_rotate90CW(max72XX_t *led) { } void MAX72XX_init(max72XX_t *led) { + if (led == 0) { + return; + } int i; HAL_PIN_SetOutputValue(led->port_cs, HIGH); @@ -252,7 +351,7 @@ void MAX72XX_init(max72XX_t *led) { MAX72XX_setScanLimit(led, i, 7); //decode is done in source MAX72XX_spiTransfer(led, i, OP_DECODEMODE, 0); - MAX72XX_clearDisplay(led, i); + MAX72XX_clearDisplayAndSend(led, i); //we go into shutdown-mode on startup MAX72XX_shutdown(led, i, 1); } @@ -262,12 +361,17 @@ void MAX72XX_init(max72XX_t *led) { /* Set the brightness to a medium values */ MAX72XX_setIntensity(led, i, 8); /* and clear the display */ - MAX72XX_clearDisplay(led, i); + MAX72XX_clearDisplayAndSend(led, i); } } void MAX72XX_setupPins(max72XX_t *led, int csi, int clki, int mosii, int maxDevices) { + if (led == 0) { + return; + } led->maxDevices = maxDevices; + led->spidata = (byte*)malloc(maxDevices * 2); + led->led_status = (byte*)malloc(maxDevices * 8); led->port_cs = csi; led->port_clk = clki; led->port_mosi = mosii; diff --git a/src/driver/drv_max72xx_internal.h b/src/driver/drv_max72xx_internal.h index ad321a629..a64d59512 100644 --- a/src/driver/drv_max72xx_internal.h +++ b/src/driver/drv_max72xx_internal.h @@ -5,14 +5,18 @@ typedef struct max72XX_s { byte port_clk, port_cs, port_mosi; byte maxDevices; - unsigned char spidata[16]; - byte led_status[8*8]; + unsigned char *spidata; + byte *led_status; + int scrollCount; } max72XX_t; +int MAX72XX_countPixels(max72XX_t *led, bool bOn); void MAX72XX_refresh(max72XX_t *led); +void MAX72XX_free(max72XX_t *led); void MAX72XX_shutdown(max72XX_t *led, int addr, bool b); void MAX72XX_setScanLimit(max72XX_t *led, int addr, int limit); -void MAX72XX_clearDisplay(max72XX_t *led,int addr) ; +void MAX72XX_clearDisplayAndSend(max72XX_t *led,int addr) ; +void MAX72XX_clearDisplayFullNoSend(max72XX_t *led); void MAX72XX_rotate90CW(max72XX_t *led); void MAX72XX_setIntensity(max72XX_t *led,int addr, int intensity) ; void MAX72XX_displayArray(max72XX_t* led, byte *p, int devs, int ofs) ; @@ -20,4 +24,5 @@ void MAX72XX_shift(max72XX_t *led,int d); void MAX72XX_setLed(max72XX_t *led,int addr, int row, int column, bool state) ; void MAX72XX_init(max72XX_t *led); void MAX72XX_setupPins(max72XX_t *led, int csi, int clki, int mosii, int maxD); -max72XX_t *MAX72XX_alloc(); \ No newline at end of file +max72XX_t *MAX72XX_alloc(); +void MAX_FreeBuffer(); diff --git a/src/driver/drv_max72xx_single.c b/src/driver/drv_max72xx_single.c index d6a094eda..deb2e6555 100644 --- a/src/driver/drv_max72xx_single.c +++ b/src/driver/drv_max72xx_single.c @@ -358,14 +358,11 @@ static commandResult_t DRV_MAX72XX_Setup(const void *context, const char *cmd, c int devices; Tokenizer_TokenizeString(args, 0); - + clk = Tokenizer_GetArgInteger(0); cs = Tokenizer_GetArgInteger(1); din = Tokenizer_GetArgInteger(2); devices = Tokenizer_GetArgInteger(3); - //clk = 9; - //cs = 14; - //din = 8; if (devices == 0) { devices = 4; @@ -383,9 +380,36 @@ static commandResult_t DRV_MAX72XX_Setup(const void *context, const char *cmd, c static commandResult_t DRV_MAX72XX_Scroll(const void *context, const char *cmd, const char *args, int flags) { if (g_max == 0) return CMD_RES_ERROR; - MAX72XX_shift(g_max,1); - MAX72XX_refresh(g_max); + int ofs = atoi(args); + if (ofs == 0) + ofs = 1; + MAX72XX_shift(g_max, ofs); + if (0) { + MAX72XX_refresh(g_max); + } + return CMD_RES_OK; +} +int MAX72XXSingle_CountPixels(bool bOn) { + return MAX72XX_countPixels(g_max, bOn); +} +int MAX72XXSingle_GetScrollCount() { + if (g_max == 0) + return 0; + return g_max->scrollCount; +} +static commandResult_t DRV_MAX72XX_Show(const void *context, const char *cmd, const char *args, int flags) { + + MAX72XX_refresh(g_max); + return CMD_RES_OK; +} +static commandResult_t DRV_MAX72XX_Clear(const void *context, const char *cmd, const char *args, int flags) { + + + MAX72XX_clearDisplayFullNoSend(g_max); + if (0) { + MAX72XX_refresh(g_max); + } return CMD_RES_OK; } static commandResult_t DRV_MAX72XX_Print(const void *context, const char *cmd, const char *args, int flags) { @@ -403,7 +427,9 @@ static commandResult_t DRV_MAX72XX_Print(const void *context, const char *cmd, c MAX72XX_print(g_max, ofs, args); MAX72XX_rotate90CW(g_max); - MAX72XX_refresh(g_max); + if (0) { + MAX72XX_refresh(g_max); + } return CMD_RES_OK; } @@ -425,12 +451,17 @@ goto again */ +void DRV_MAX72XX_Shutdown() { + MAX72XX_free(g_max); + g_max = 0; + MAX_FreeBuffer(); +} // backlog startDriver MAX72XX; MAX72XX_Setup // MAX72XX_Print 0 1234567 // backlog startDriver MAX72XX; MAX72XX_Setup; MAX72XX_Print 0 1234567 void DRV_MAX72XX_Init() { - //cmddetail:{"name":"MAX72XX_Setup","args":"[Value]", + //cmddetail:{"name":"MAX72XX_Setup","args":"[clk][cs][din][segments]", //cmddetail:"descr":"Sets the maximum current for LED driver.", //cmddetail:"fn":"DRV_MAX72XX_Setup","file":"driver/drv_max72xx_single.c","requires":"", //cmddetail:"examples":""} @@ -445,6 +476,14 @@ void DRV_MAX72XX_Init() { //cmddetail:"fn":"DRV_MAX72XX_Print","file":"driver/drv_max72xx_single.c","requires":"", //cmddetail:"examples":""} CMD_RegisterCommand("MAX72XX_Print", DRV_MAX72XX_Print, NULL); + + CMD_RegisterCommand("MAX72XX_refresh", DRV_MAX72XX_Show, NULL); + + //cmddetail:{"name":"DRV_MAX72XX_Clear","args":"DRV_MAX72XX_Clear", + //cmddetail:"descr":"", + //cmddetail:"fn":"DRV_DRV_MAX72XX_Clear","file":"driver/drv_max72xx_single.c","requires":"", + //cmddetail:"examples":""} + CMD_RegisterCommand("MAX72XX_Clear", DRV_MAX72XX_Clear, NULL); } diff --git a/src/driver/drv_multiPinI2CScanner.c b/src/driver/drv_multiPinI2CScanner.c new file mode 100644 index 000000000..4fd8cf67e --- /dev/null +++ b/src/driver/drv_multiPinI2CScanner.c @@ -0,0 +1,78 @@ + +#include "../obk_config.h" + +#include "drv_local.h" +#include "../logging/logging.h" +#include "../new_cfg.h" +#include "../new_pins.h" +#include "../cmnds/cmd_public.h" + +int g_adr = 1; +int g_scl = 0; +int g_sda = 1; +softI2C_t g_scanI2C; + +bool canUsePin(int pin) { +#if PLATFORM_ESP8266 + if (pin == 6) { + return false; + } + if (pin == 7) { + return false; + } +#endif + return true; +} +static int nextValidPin(int pin) { + do { + pin++; + if (pin >= PLATFORM_GPIO_MAX) + pin = 0; + } while (!canUsePin(pin)); + return pin; +} +// startDriver MultiPinI2CScanner +void MultiPinI2CScanner_AppendInformationToHTTPIndexPage(http_request_t *request, int bPreState) +{ + hprintf255(request, "Scan pins: %i %i, adr %i", g_scl, g_sda, g_adr); + +} +void MultiPinI2CScanner_RunFrame() { + + g_scanI2C.pin_clk = g_scl; + g_scanI2C.pin_data = g_sda; + Soft_I2C_PreInit(&g_scanI2C); + bool bOk = Soft_I2C_Start(&g_scanI2C, (g_adr << 1) + 0); + Soft_I2C_Stop(&g_scanI2C); + if (bOk) { + addLogAdv(LOG_INFO, LOG_FEATURE_I2C, "Pins SDA = %i, SCL =%i, adr 0x%x (dec %i)\n", + g_sda, g_scl, g_adr); + } + g_adr++; + if (g_adr >= 128) { + g_adr = 0; + + // advance SCL + g_scl = nextValidPin(g_scl); + + // avoid SDA == SCL + if (g_scl == g_sda) + g_scl = nextValidPin(g_scl); + + // if SCL wrapped back to start, move SDA + if (g_scl == 0) { + g_sda = nextValidPin(g_sda); + + // avoid SDA == SCL after moving SDA + if (g_scl == g_sda) + g_sda = nextValidPin(g_sda); + } + + addLogAdv(LOG_INFO, LOG_FEATURE_I2C, "Next SDA = %i, SCL =%i", g_sda, g_scl); + } +} + +void MultiPinI2CScanner_Init() { + +} + diff --git a/src/driver/drv_openWeatherMap.c b/src/driver/drv_openWeatherMap.c index c18734600..e84bf0312 100644 --- a/src/driver/drv_openWeatherMap.c +++ b/src/driver/drv_openWeatherMap.c @@ -31,29 +31,37 @@ xTaskHandle g_weather_thread = NULL; static char g_request[512]; static char g_reply[1024]; -typedef struct weatherData_s { - double lon; - double lat; - char main_weather[32]; - char description[32]; - double temp; - int pressure; - int humidity; - int timezone; - int sunrise; - int sunset; -} weatherData_t; - -typedef struct weatherChannels_s { - byte bInitialized; - char temperature; - char humidity; - char pressure; -} weatherChannels_t; +#include "drv_openWeatherMap.h" weatherData_t g_weather; weatherChannels_t g_channels; +weatherData_t *Weather_GetData() { + return &g_weather; +} +static double json_get_double(cJSON *parent, const char *name, double def) { + cJSON *n = cJSON_GetObjectItem(parent, name); + if (n && cJSON_IsNumber(n)) { + return n->valuedouble; + } + return def; +} + +static int json_get_int(cJSON *parent, const char *name, int def) { + cJSON *n = cJSON_GetObjectItem(parent, name); + if (n && cJSON_IsNumber(n)) { + return n->valueint; + } + return def; +} + +static void json_get_string(cJSON *parent, const char *name, char *dst, int dstSize, const char *def) { + cJSON *n = cJSON_GetObjectItem(parent, name); + const char *src = (n && cJSON_IsString(n)) ? n->valuestring : def; + strncpy(dst, src, dstSize - 1); + dst[dstSize - 1] = '\0'; +} + void Weather_SetReply(const char *s) { const char *json_start = strstr(s, "\r\n\r\n"); if (json_start) { @@ -62,31 +70,36 @@ void Weather_SetReply(const char *s) { cJSON *json = cJSON_Parse(json_start); if (json) { + cJSON *coord = cJSON_GetObjectItem(json, "coord"); if (coord) { - g_weather.lon = cJSON_GetObjectItem(coord, "lon") ? cJSON_GetObjectItem(coord, "lon")->valuedouble : 0.0; - g_weather.lat = cJSON_GetObjectItem(coord, "lat") ? cJSON_GetObjectItem(coord, "lat")->valuedouble : 0.0; + g_weather.lon = json_get_double(coord, "lon", 0.0); + g_weather.lat = json_get_double(coord, "lat", 0.0); } cJSON *weather_array = cJSON_GetObjectItem(json, "weather"); if (weather_array && cJSON_IsArray(weather_array)) { cJSON *weather = cJSON_GetArrayItem(weather_array, 0); if (weather) { - strncpy(g_weather.main_weather, cJSON_GetObjectItem(weather, "main") ? cJSON_GetObjectItem(weather, "main")->valuestring : "Unknown", sizeof(g_weather.main_weather) - 1); - strncpy(g_weather.description, cJSON_GetObjectItem(weather, "description") ? cJSON_GetObjectItem(weather, "description")->valuestring : "Unknown", sizeof(g_weather.description) - 1); + json_get_string(weather, "main", g_weather.main_weather, sizeof(g_weather.main_weather), "Unknown"); + json_get_string(weather, "description", g_weather.description, sizeof(g_weather.description), "Unknown"); } } cJSON *main = cJSON_GetObjectItem(json, "main"); if (main) { - g_weather.temp = cJSON_GetObjectItem(main, "temp") ? cJSON_GetObjectItem(main, "temp")->valuedouble : 0.0; - g_weather.pressure = cJSON_GetObjectItem(main, "pressure") ? cJSON_GetObjectItem(main, "pressure")->valueint : 0; - g_weather.humidity = cJSON_GetObjectItem(main, "humidity") ? cJSON_GetObjectItem(main, "humidity")->valueint : 0; + g_weather.temp = json_get_double(main, "temp", 0.0); + g_weather.pressure = json_get_int(main, "pressure", 0); + g_weather.humidity = json_get_int(main, "humidity", 0); } - g_weather.timezone = cJSON_GetObjectItem(json, "timezone") ? cJSON_GetObjectItem(json, "timezone")->valueint : 0; - g_weather.sunrise = cJSON_GetObjectItem(json, "sys") ? cJSON_GetObjectItem(cJSON_GetObjectItem(json, "sys"), "sunrise")->valueint : 0; - g_weather.sunset = cJSON_GetObjectItem(json, "sys") ? cJSON_GetObjectItem(cJSON_GetObjectItem(json, "sys"), "sunset")->valueint : 0; + g_weather.timezone = json_get_int(json, "timezone", 0); + + cJSON *sys = cJSON_GetObjectItem(json, "sys"); + if (sys) { + g_weather.sunrise = json_get_int(sys, "sunrise", 0); + g_weather.sunset = json_get_int(sys, "sunset", 0); + } cJSON_Delete(json); } @@ -98,6 +111,7 @@ void Weather_SetReply(const char *s) { g_reply[0] = '\0'; ADDLOG_ERROR(LOG_FEATURE_HTTP, "No JSON found in reply"); } + if (g_channels.bInitialized) { if (g_channels.temperature != -1) { CHANNEL_SetSmart(g_channels.temperature, g_weather.temp, 0); @@ -110,6 +124,7 @@ void Weather_SetReply(const char *s) { } } } + #if 0 static void sendQueryThreadInternal() { diff --git a/src/driver/drv_openWeatherMap.h b/src/driver/drv_openWeatherMap.h new file mode 100644 index 000000000..72dc6c40d --- /dev/null +++ b/src/driver/drv_openWeatherMap.h @@ -0,0 +1,26 @@ +#ifndef __DRV_OPENWEATHERMAP_H__ +#define __DRV_OPENWEATHERMAP_H__ + +typedef struct weatherData_s { + double lon; + double lat; + char main_weather[32]; + char description[32]; + double temp; + int pressure; + int humidity; + int timezone; + int sunrise; + int sunset; +} weatherData_t; + +typedef struct weatherChannels_s { + byte bInitialized; + char temperature; + char humidity; + char pressure; +} weatherChannels_t; + +weatherData_t *Weather_GetData(); + +#endif // __DRV_OPENWEATHERMAP_H__ diff --git a/src/hal/espidf/hal_pins_espidf.c b/src/hal/espidf/hal_pins_espidf.c index 028f440d3..482652aca 100644 --- a/src/hal/espidf/hal_pins_espidf.c +++ b/src/hal/espidf/hal_pins_espidf.c @@ -313,21 +313,22 @@ espPinMapping_t g_pins[] = { #elif PLATFORM_ESP8266 espPinMapping_t g_pins[] = { - { "IO0", GPIO_NUM_0, false }, - { "IO1", GPIO_NUM_1, false }, - { "IO2", GPIO_NUM_2, false }, - { "IO3", GPIO_NUM_3, false }, - { "IO4", GPIO_NUM_4, false }, - { "IO5", GPIO_NUM_5, false }, - { "IO9", GPIO_NUM_9, false }, - { "IO10", GPIO_NUM_10, false }, - { "IO12", GPIO_NUM_12, false }, - { "IO13", GPIO_NUM_13, false }, - { "IO14", GPIO_NUM_14, false }, - { "IO15", GPIO_NUM_15, false }, - { "IO16", GPIO_NUM_15, false }, + { "IO0", GPIO_NUM_0, false }, // 0 + { "IO1", GPIO_NUM_1, false }, // 1 + { "IO2", GPIO_NUM_2, false }, // 2 + { "IO3", GPIO_NUM_3, false }, // 3 + { "IO4", GPIO_NUM_4, false }, // 4 + { "IO5", GPIO_NUM_5, false }, // 5 + { "IO9", GPIO_NUM_9, false }, // 6 + { "IO10", GPIO_NUM_10, false }, // 7 + { "IO12", GPIO_NUM_12, false }, // 8 + { "IO13", GPIO_NUM_13, false }, // 9 + { "IO14", GPIO_NUM_14, false }, // 10 + { "IO15", GPIO_NUM_15, false }, // 11 + { "IO16", GPIO_NUM_15, false }, // 12 }; + #else espPinMapping_t g_pins[] = { }; diff --git a/src/new_cfg.c b/src/new_cfg.c index 3672bcb7f..389c93a7c 100644 --- a/src/new_cfg.c +++ b/src/new_cfg.c @@ -439,6 +439,50 @@ const char *CFG_GetMQTTPass() { return g_cfg.mqtt_pass; } +bool CHANNEL_IsHumidity(int type) { + if (type == ChType_Humidity) + return true; + if (type == ChType_Humidity_div10) + return true; + return false; +} +bool CHANNEL_IsTemperature(int type) { + if (type == ChType_Temperature) + return true; + if (type == ChType_Temperature_div10) + return true; + if (type == ChType_Temperature_div100) + return true; + if (type == ChType_Temperature_div2) + return true; + return false; +} +bool CHANNEL_IsPressure(int type) { + if (type == ChType_Pressure_div100) + return true; + return false; +} +bool CHANNEL_GetGenericOfType(float *out, bool(*checker)(int type)) { + int i, t; + + for (i = 0; i < CHANNEL_MAX; i++) { + t = g_cfg.pins.channelTypes[i]; + if (checker(t)) { + *out = CHANNEL_GetFinalValue(i); + return true; + } + } + return false; +} +bool CHANNEL_GetGenericHumidity(float *out) { + return CHANNEL_GetGenericOfType(out, CHANNEL_IsHumidity); +} +bool CHANNEL_GetGenericTemperature(float *out) { + return CHANNEL_GetGenericOfType(out, CHANNEL_IsTemperature); +} +bool CHANNEL_GetGenericPressure(float *out) { + return CHANNEL_GetGenericOfType(out, CHANNEL_IsPressure); +} void CHANNEL_SetType(int ch, int type) { if (g_cfg.pins.channelTypes[ch] != type) { g_cfg.pins.channelTypes[ch] = type; diff --git a/src/new_pins.h b/src/new_pins.h index 9be693a45..bf9705438 100644 --- a/src/new_pins.h +++ b/src/new_pins.h @@ -1584,6 +1584,13 @@ bool CHANNEL_IsPowerRelayChannel(int ch); // See: enum channelType_t void CHANNEL_SetType(int ch, int type); int CHANNEL_GetType(int ch); +bool CHANNEL_IsHumidity(int type); +bool CHANNEL_IsTemperature(int type); +bool CHANNEL_IsPressure(int type); +bool CHANNEL_GetGenericOfType(float *out, bool(*checker)(int type)); +bool CHANNEL_GetGenericHumidity(float *out); +bool CHANNEL_GetGenericTemperature(float *out); +bool CHANNEL_GetGenericPressure(float *out); void CHANNEL_SetFirstChannelByTypeEx(int requiredType, int newVal, int ausemovingaverage); void CHANNEL_SetFirstChannelByType(int requiredType, int newVal); // CHANNEL_SET_FLAG_* diff --git a/src/obk_config.h b/src/obk_config.h index 447274aa9..88b7e1fc8 100644 --- a/src/obk_config.h +++ b/src/obk_config.h @@ -519,6 +519,9 @@ #elif PLATFORM_ESP8266 +//#define ENABLE_MULTIPINI2CSCANNER 1 +//#define ENABLE_DRIVER_MAX72XX 1 + #define ENABLE_SEND_POSTANDGET 1 #define NO_CHIP_TEMPERATURE 1 #define ENABLE_HA_DISCOVERY 1 diff --git a/src/selftest/selftest_cmd_channels.c b/src/selftest/selftest_cmd_channels.c index 9b9b92fac..6bb340f7a 100644 --- a/src/selftest/selftest_cmd_channels.c +++ b/src/selftest/selftest_cmd_channels.c @@ -360,6 +360,27 @@ void Test_Commands_Channels() { // cause error //SELFTEST_ASSERT_CHANNEL(3, 666); + + + // reset whole device + SIM_ClearOBK(0); + + float hum, temp; + SELFTEST_ASSERT(false == CHANNEL_GetGenericHumidity(&hum)); + + CMD_ExecuteCommand("setChannelType 5 Humidity", 0); + CMD_ExecuteCommand("setChannel 5 88", 0); + SELFTEST_ASSERT(true == CHANNEL_GetGenericHumidity(&hum)); + SELFTEST_ASSERT_FLOATCOMPARE(hum, 88.0f); + SELFTEST_ASSERT(false == CHANNEL_GetGenericTemperature(&temp)); + CMD_ExecuteCommand("setChannelType 5 Temperature_div10", 0); + SELFTEST_ASSERT(false == CHANNEL_GetGenericHumidity(&hum)); + SELFTEST_ASSERT(true == CHANNEL_GetGenericTemperature(&temp)); + SELFTEST_ASSERT_FLOATCOMPARE(temp, 8.80f); + CMD_ExecuteCommand("setChannelType 5 Temperature", 0); + SELFTEST_ASSERT(true == CHANNEL_GetGenericTemperature(&temp)); + SELFTEST_ASSERT_FLOATCOMPARE(temp, 88.0f); + } diff --git a/src/selftest/selftest_local.h b/src/selftest/selftest_local.h index 29b6125d5..cfc039e9d 100644 --- a/src/selftest/selftest_local.h +++ b/src/selftest/selftest_local.h @@ -151,6 +151,8 @@ void Test_Http(); void Test_Demo_ConditionalRelay(); void Test_PIR(); void Test_Driver_TCL_AC(); +void Test_MAX72XX(); +void Test_OpenWeatherMap(); void Test_GetJSONValue_Setup(const char *text); void Test_FakeHTTPClientPacket_GET(const char *tg); diff --git a/src/selftest/selftest_max72xx.c b/src/selftest/selftest_max72xx.c new file mode 100644 index 000000000..07327dd28 --- /dev/null +++ b/src/selftest/selftest_max72xx.c @@ -0,0 +1,107 @@ +#ifdef WINDOWS + +#include "selftest_local.h" + +void Test_MAX72XX() { + // reset whole device + SIM_ClearOBK(0); + + CMD_ExecuteCommand("startDriver MAX72XX", 0); + CMD_ExecuteCommand("MAX72XX_Setup 10 8 9 16", 0); + CMD_ExecuteCommand("MAX72XX_Print 1232132131212", 0); + CMD_ExecuteCommand("MAX72XX_Scroll 1", 0); + CMD_ExecuteCommand("stopDriver MAX72XX", 0); + + + CMD_ExecuteCommand("startDriver MAX72XX", 0); + CMD_ExecuteCommand("MAX72XX_Setup 10 8 9 16", 0); + CMD_ExecuteCommand("MAX72XX_Clear", 0); + SELFTEST_ASSERT(MAX72XXSingle_GetScrollCount() == 0); + SELFTEST_ASSERT(MAX72XXSingle_CountPixels(true) == 0); + CMD_ExecuteCommand("MAX72XX_Print 1", 0); + SELFTEST_ASSERT(MAX72XXSingle_GetScrollCount() == 0); + SELFTEST_ASSERT(MAX72XXSingle_CountPixels(true) == 10); + CMD_ExecuteCommand("MAX72XX_Scroll 1", 0); + SELFTEST_ASSERT(MAX72XXSingle_GetScrollCount() == 1); + SELFTEST_ASSERT(MAX72XXSingle_CountPixels(true) == 10); + CMD_ExecuteCommand("MAX72XX_Scroll 1", 0); + SELFTEST_ASSERT(MAX72XXSingle_GetScrollCount() == 2); + SELFTEST_ASSERT(MAX72XXSingle_CountPixels(true) == 10); + CMD_ExecuteCommand("MAX72XX_Print 11", 0); + SELFTEST_ASSERT(MAX72XXSingle_CountPixels(true) == 2*10); + CMD_ExecuteCommand("MAX72XX_Scroll 1", 0); + SELFTEST_ASSERT(MAX72XXSingle_GetScrollCount() == 3); + SELFTEST_ASSERT(MAX72XXSingle_CountPixels(true) == 2*10); + CMD_ExecuteCommand("MAX72XX_Scroll -1", 0); + SELFTEST_ASSERT(MAX72XXSingle_CountPixels(true) == 2*10); + SELFTEST_ASSERT(MAX72XXSingle_GetScrollCount() == 2); + CMD_ExecuteCommand("MAX72XX_Scroll -3", 0); + SELFTEST_ASSERT(MAX72XXSingle_CountPixels(true) == 2 * 10); + SELFTEST_ASSERT(MAX72XXSingle_GetScrollCount() == 127); + CMD_ExecuteCommand("MAX72XX_Scroll -10", 0); + SELFTEST_ASSERT(MAX72XXSingle_CountPixels(true) == 2 * 10); + SELFTEST_ASSERT(MAX72XXSingle_GetScrollCount() == 117); + CMD_ExecuteCommand("MAX72XX_Scroll -20", 0); + SELFTEST_ASSERT(MAX72XXSingle_CountPixels(true) == 2 * 10); + SELFTEST_ASSERT(MAX72XXSingle_GetScrollCount() == 97); + CMD_ExecuteCommand("MAX72XX_Scroll 20", 0); + SELFTEST_ASSERT(MAX72XXSingle_CountPixels(true) == 2 * 10); + SELFTEST_ASSERT(MAX72XXSingle_GetScrollCount() == 117); + CMD_ExecuteCommand("MAX72XX_Scroll 10", 0); + SELFTEST_ASSERT(MAX72XXSingle_GetScrollCount() == 127); + CMD_ExecuteCommand("MAX72XX_Scroll 1", 0); + SELFTEST_ASSERT(MAX72XXSingle_GetScrollCount() == 0); + + for (int i = 0; i < 128; i++) { + CMD_ExecuteCommand("MAX72XX_Scroll -1", 0); + SELFTEST_ASSERT(MAX72XXSingle_CountPixels(true) == 2 * 10); + } + for (int i = 0; i < 128; i++) { + CMD_ExecuteCommand("MAX72XX_Scroll 2", 0); + SELFTEST_ASSERT(MAX72XXSingle_CountPixels(true) == 2 * 10); + } + CMD_ExecuteCommand("stopDriver MAX72XX", 0); + + CMD_ExecuteCommand("startDriver MAX72XX", 0); + CMD_ExecuteCommand("MAX72XX_Setup 10 8 9 64", 0); + CMD_ExecuteCommand("MAX72XX_Print 1232132131212", 0); + CMD_ExecuteCommand("MAX72XX_Scroll 1", 0); + CMD_ExecuteCommand("stopDriver MAX72XX", 0); + + CMD_ExecuteCommand("startDriver MAX72XX", 0); + CMD_ExecuteCommand("startDriver MAX72XX_Clock", 0); + Sim_RunSeconds(1, false); + CMD_ExecuteCommand("MAX72XXClock_Animate 1", 0); + Sim_RunSeconds(1, false); + CMD_ExecuteCommand("stopDriver MAX72XX", 0); + + + + CMD_ExecuteCommand("startDriver MAX72XX", 0); + CMD_ExecuteCommand("MAX72XX_Setup 10 8 9 64", 0); + CMD_ExecuteCommand("MAX72XX_Clear", 0); + CMD_ExecuteCommand("MAX72XX_Print 1", 0); + SELFTEST_ASSERT(MAX72XXSingle_CountPixels(true) == 1 * 10); + for (int i = 1; i < 64; i+=23) { + char buff[512]; + char buff2[512]; + int j; + for ( j = 0; j < i; j++) { + buff[j] = '1'; + } + buff[j] = 0; + CMD_ExecuteCommand("MAX72XX_Clear", 0); + strcpy(buff2, "MAX72XX_Print "); + strcat(buff2, buff); + CMD_ExecuteCommand(buff2, 0); + for ( j = 0; j < 3; j++) { + CMD_ExecuteCommand("MAX72XX_Scroll 8", 0); + int act = MAX72XXSingle_CountPixels(true); + SELFTEST_ASSERT(act == i * 10); + } + } + CMD_ExecuteCommand("stopDriver MAX72XX", 0); +} + + +#endif diff --git a/src/selftest/selftest_openWeatherMap.c b/src/selftest/selftest_openWeatherMap.c new file mode 100644 index 000000000..7f3158a45 --- /dev/null +++ b/src/selftest/selftest_openWeatherMap.c @@ -0,0 +1,59 @@ +#ifdef WINDOWS + +#include "selftest_local.h" +#include "../driver/drv_openWeatherMap.h" + +const char *sample_reply = +"HTTP/1.1 200 OK\r\n" +"Date: Sat, 09 Nov 2025 12:00:00 GMT\r\n" +"Server: openweathermap.org\r\n" +"Content-Type: application/json; charset=utf-8\r\n" +"Content-Length: 123\r\n" +"Connection: close\r\n" +"\r\n" +"{" +" \"coord\": {\"lon\": 10.0, \"lat\": 50.0}," +" \"weather\": [{\"id\":800,\"main\":\"Clear\",\"description\":\"clear sky\",\"icon\":\"01d\"}]," +" \"base\": \"stations\"," +" \"main\": {" +" \"temp\": 23.0," +" \"pressure\": 998," +" \"humidity\": 85," +" \"temp_min\": 20.0," +" \"temp_max\": 25.0" +" }," +" \"visibility\": 10000," +" \"wind\": {\"speed\": 3.6,\"deg\": 180}," +" \"clouds\": {\"all\": 0}," +" \"dt\": 1604995200," +" \"sys\": {\"type\":1,\"id\":1234,\"country\":\"US\",\"sunrise\":1604965200,\"sunset\":1605001200}," +" \"timezone\": -18000," +" \"id\": 123456," +" \"name\": \"Test City\"," +" \"cod\": 200" +"}"; + +const char *reply_no_weather = +"HTTP/1.1 200 OK\r\n\r\n" +"{\"coord\":{\"lon\":10,\"lat\":50},\"main\":{\"temp\":20,\"pressure\":900,\"humidity\":60}}"; + +void Test_OpenWeatherMap() { + + // HTTP header + json + Weather_SetReply(sample_reply); + + weatherData_t *w = Weather_GetData(); + SELFTEST_ASSERT_FLOATCOMPARE(w->humidity, 85); + SELFTEST_ASSERT_FLOATCOMPARE(w->pressure, 998); + SELFTEST_ASSERT_FLOATCOMPARE(w->temp, 23); + SELFTEST_ASSERT_STRING(w->main_weather, "Clear"); + SELFTEST_ASSERT_STRING(w->description, "clear sky"); + SELFTEST_ASSERT_FLOATCOMPARE(w->lat, 50); + SELFTEST_ASSERT_FLOATCOMPARE(w->lon, 10); + + +} + + + +#endif diff --git a/src/win_main.c b/src/win_main.c index ca5490ffd..f382df847 100644 --- a/src/win_main.c +++ b/src/win_main.c @@ -40,13 +40,12 @@ #include "selftest/selftest_local.h" #include "new_pins.h" - #define OFFSETOF(TYPE, ELEMENT) ((size_t)&(((TYPE *)0)->ELEMENT)) // Need to link with Ws2_32.lib -#pragma comment (lib, "Ws2_32.lib") +#pragma comment(lib, "Ws2_32.lib") // #pragma comment (lib, "Mswsock.lib") -#pragma comment (lib, "Winmm.lib") +#pragma comment(lib, "Winmm.lib") int accum_time = 0; int win_frameNum = 0; @@ -60,45 +59,46 @@ extern int g_httpPort; #include #include -uint32_t timeGetTime() { +uint32_t timeGetTime() +{ struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); return (uint32_t)((ts.tv_sec * 1000) + (ts.tv_nsec / 1000000)); } -void vTaskDelay(int x) { - +void vTaskDelay(int x) +{ } #endif -void strcat_safe_test(){ +void strcat_safe_test() +{ char tmpA[16]; char tmpB[16]; char buff[128]; int res0, res1, res2, res3, res4, res5; tmpA[0] = 0; - res0 = strcat_safe(tmpA,"Test1",sizeof(tmpA)); - res1 = strcat_safe(tmpA," ",sizeof(tmpA)); - res2 = strcat_safe(tmpA,"is now processing",sizeof(tmpA)); - res3 = strcat_safe(tmpA," very long string",sizeof(tmpA)); - res4 = strcat_safe(tmpA," and it",sizeof(tmpA)); - res5 = strcat_safe(tmpA," and it",sizeof(tmpA)); + res0 = strcat_safe(tmpA, "Test1", sizeof(tmpA)); + res1 = strcat_safe(tmpA, " ", sizeof(tmpA)); + res2 = strcat_safe(tmpA, "is now processing", sizeof(tmpA)); + res3 = strcat_safe(tmpA, " very long string", sizeof(tmpA)); + res4 = strcat_safe(tmpA, " and it", sizeof(tmpA)); + res5 = strcat_safe(tmpA, " and it", sizeof(tmpA)); tmpB[0] = 0; - res0 = strcat_safe(tmpB,"Test1",sizeof(tmpB)); - res1 = strcat_safe(tmpB," ",sizeof(tmpB)); - res2 = strcat_safe(tmpB,"is now processing",sizeof(tmpB)); - res3 = strcat_safe(tmpB," very long string",sizeof(tmpB)); - res4 = strcat_safe(tmpB," and it",sizeof(tmpB)); - res5 = strcat_safe(tmpB," and it",sizeof(tmpB)); - - urldecode2_safe(buff,"qqqqqq%40qqqq",sizeof(buff)); - urldecode2_safe(buff,"qqqqqq%40qqqq",sizeof(buff)); - + res0 = strcat_safe(tmpB, "Test1", sizeof(tmpB)); + res1 = strcat_safe(tmpB, " ", sizeof(tmpB)); + res2 = strcat_safe(tmpB, "is now processing", sizeof(tmpB)); + res3 = strcat_safe(tmpB, " very long string", sizeof(tmpB)); + res4 = strcat_safe(tmpB, " and it", sizeof(tmpB)); + res5 = strcat_safe(tmpB, " and it", sizeof(tmpB)); + urldecode2_safe(buff, "qqqqqq%40qqqq", sizeof(buff)); + urldecode2_safe(buff, "qqqqqq%40qqqq", sizeof(buff)); } -void Sim_RunFrame(int frameTime) { - //printf("Sim_RunFrame: frametime %i\n", frameTime); +void Sim_RunFrame(int frameTime) +{ + // printf("Sim_RunFrame: frametime %i\n", frameTime); win_frameNum++; // this time counter is simulated, I need this for unit tests to work g_simulatedTimeNow += frameTime; @@ -106,29 +106,37 @@ void Sim_RunFrame(int frameTime) { QuickTick(0); WIN_RunMQTTFrame(); HTTPServer_RunQuickTick(); - if (accum_time > 1000) { + if (accum_time > 1000) + { accum_time -= 1000; Main_OnEverySecond(); } } -void Sim_RunMiliseconds(int ms, bool bApplyRealtimeWait) { - while (ms > 0) { - if (bApplyRealtimeWait) { +void Sim_RunMiliseconds(int ms, bool bApplyRealtimeWait) +{ + while (ms > 0) + { + if (bApplyRealtimeWait) + { Sleep(DEFAULT_FRAME_TIME); } Sim_RunFrame(DEFAULT_FRAME_TIME); ms -= DEFAULT_FRAME_TIME; } } -void Sim_RunSeconds(float f, bool bApplyRealtimeWait) { +void Sim_RunSeconds(float f, bool bApplyRealtimeWait) +{ int ms = (int)(f * 1000); Sim_RunMiliseconds(ms, bApplyRealtimeWait); } -void Sim_RunFrames(int n, bool bApplyRealtimeWait) { +void Sim_RunFrames(int n, bool bApplyRealtimeWait) +{ int i; - for (i = 0; i < n; i++) { - if (bApplyRealtimeWait) { + for (i = 0; i < n; i++) + { + if (bApplyRealtimeWait) + { Sleep(DEFAULT_FRAME_TIME); } Sim_RunFrame(DEFAULT_FRAME_TIME); @@ -140,8 +148,10 @@ void SIM_Hack_ClearSimulatedPinRoles(); void CHANNEL_FreeLabels(); -void SIM_ShutdownOBK() { - if (bObkStarted) { +void SIM_ShutdownOBK() +{ + if (bObkStarted) + { DRV_ShutdownAllDrivers(); #if ENABLE_LITTLEFS release_lfs(); @@ -162,34 +172,41 @@ void SIM_ShutdownOBK() { LOG_DeInit(); } } -void SIM_StartOBK(const char *flashPath) { +void SIM_StartOBK(const char *flashPath) +{ - if (flashPath) { + if (flashPath) + { SIM_SetupFlashFileReading(flashPath); } bObkStarted = true; Main_Init(); } -void SIM_ClearOBK(const char *flashPath) { +void SIM_ClearOBK(const char *flashPath) +{ SIM_ShutdownOBK(); SIM_StartOBK(flashPath); } -void Test_PartitionSearch() { +void Test_PartitionSearch() +{ SIM_ClearOBK(0); - //SIM_SetupFlashFileReading("W:/GIT/FlashDumps/IoT/BK7231N/BK7231N_Milfra_3g_TB11_QIO_2024-20-8-15-32-47.bin"); + // SIM_SetupFlashFileReading("W:/GIT/FlashDumps/IoT/BK7231N/BK7231N_Milfra_3g_TB11_QIO_2024-20-8-15-32-47.bin"); SIM_SetupFlashFileReading("W:/GIT/FlashDumps/IoT/BK7231N/BK7231N_QIO_Adelid_Curtains_MPD-Z_2024-23-10-18-21-33.bin"); - //SIM_SetupFlashFileReading("W:/GIT/FlashDumps/IoT/BK7231M/SparkleIoT_XH-CB2S_Mini_Switch.bin"); - //SIM_SetupFlashFileReading("W:/GIT/FlashDumps/IoT/BK7231M/VeSync_Aubess_BSD33_BSDOG02_Plug_1.0.01.bin"); + // SIM_SetupFlashFileReading("W:/GIT/FlashDumps/IoT/BK7231M/SparkleIoT_XH-CB2S_Mini_Switch.bin"); + // SIM_SetupFlashFileReading("W:/GIT/FlashDumps/IoT/BK7231M/VeSync_Aubess_BSD33_BSDOG02_Plug_1.0.01.bin"); CMD_ExecuteCommand("startDriver BKPartitions", 0); Sim_RunFrames(500000, false); - } -void Win_DoUnitTests() { - //SELFTEST_ASSERT_EXPRESSION("sqrt(4)", 2) +void Win_DoUnitTests() +{ + // SELFTEST_ASSERT_EXPRESSION("sqrt(4)", 2) + + // Test_PartitionSearch(); + Test_OpenWeatherMap(); + Test_MAX72XX(); - //Test_PartitionSearch(); Test_LEDstrips(); Test_Commands_Channels(); @@ -203,7 +220,6 @@ void Win_DoUnitTests() { Test_TuyaMCU_Boolean(); Test_TuyaMCU_DP22(); - Test_Demo_ConditionalRelay(); Test_Expressions_RunTests_Braces(); Test_Expressions_RunTests_Basic(); @@ -253,7 +269,7 @@ void Win_DoUnitTests() { Test_MultiplePinsOnChannel(); Test_Flags(); #ifndef LINUX - // TODO: fix on Linux + // TODO: fix on Linux Test_DHT(); #endif Test_Tasmota(); @@ -279,31 +295,31 @@ void Win_DoUnitTests() { Test_Http_LED(); Test_DeviceGroups(); - - - - // Just to be sure // Must be last step // reset whole device SIM_ClearOBK(0); } long g_delta; -float SIM_GetDeltaTimeSeconds() { +float SIM_GetDeltaTimeSeconds() +{ return g_delta * 0.001f; } long start_time = 0; bool bStartTimeSet = false; -long SIM_GetTime() { +long SIM_GetTime() +{ long cur = timeGetTime(); - if (bStartTimeSet == false) { + if (bStartTimeSet == false) + { start_time = cur; bStartTimeSet = true; } return cur - start_time; } // this time counter is simulated, I need this for unit tests to work -int rtos_get_time() { +int rtos_get_time() +{ return g_simulatedTimeNow; } int g_bDoingUnitTestsNow = 0; @@ -313,22 +329,26 @@ int g_bDoingUnitTestsNow = 0; int SelfTest_GetNumErrors(); extern int g_selfTestsMode; -float myFabs(float f) { +float myFabs(float f) +{ if (f < 0) return -f; return f; } -bool Float_Equals(float a, float b) { +bool Float_Equals(float a, float b) +{ float res = myFabs(a - b); return res < 0.001f; } -bool Float_EqualsEpsilon(float a, float b, float epsilon) { +bool Float_EqualsEpsilon(float a, float b, float epsilon) +{ float res = myFabs(a - b); return res < epsilon; } #define VA_BUFFER_SIZE 4096 #define VA_COUNT 4 -const char *va(const char *fmt, ...) { +const char *va(const char *fmt, ...) +{ va_list argList; static int whi = 0; static char buffer[VA_COUNT][VA_BUFFER_SIZE]; @@ -343,19 +363,20 @@ const char *va(const char *fmt, ...) { return p; } - #ifdef LINUX // fixes - temp #endif #if !ENABLE_SDL_WINDOW -bool SIM_ReadDHT11(int pin, byte *data) { +bool SIM_ReadDHT11(int pin, byte *data) +{ return false; } -void Sim_SendFakeBL0942Packet(float v, float c, float p) { - +void Sim_SendFakeBL0942Packet(float v, float c, float p) +{ } -void SIM_GeneratePowerStateDesc(char *o, int outLen) { +void SIM_GeneratePowerStateDesc(char *o, int outLen) +{ *o = 0; } #endif @@ -363,52 +384,66 @@ void SIM_GeneratePowerStateDesc(char *o, int outLen) { int __cdecl main(int argc, char **argv) { bool bWantsUnitTests = 1; - + #ifndef LINUX WSADATA wsaData; #endif // clear debug data - if (1) { + if (1) + { FILE *f = fopen("sim_lastPublishes.txt", "wb"); - if (f != 0) { + if (f != 0) + { fprintf(f, "\n\n"); fclose(f); } } printf("Argc: %i\n", argc); - if (argc > 1) { + if (argc > 1) + { int value; - for (int i = 1; i < argc; i++) { - if (argv[i][0] == '-') { - if (wal_strnicmp(argv[i] + 1, "port", 4) == 0) { + for (int i = 1; i < argc; i++) + { + if (argv[i][0] == '-') + { + if (wal_strnicmp(argv[i] + 1, "port", 4) == 0) + { i++; - if (i < argc && sscanf(argv[i], "%d", &value) == 1) { + if (i < argc && sscanf(argv[i], "%d", &value) == 1) + { g_httpPort = value; } - } else if (wal_strnicmp(argv[i] + 1, "w", 1) == 0) { + } + else if (wal_strnicmp(argv[i] + 1, "w", 1) == 0) + { i++; - if (i < argc && sscanf(argv[i], "%d", &value) == 1) { + if (i < argc && sscanf(argv[i], "%d", &value) == 1) + { #if ENABLE_SDL_WINDOW SIM_SetWindowW(value); #endif } } - else if (wal_strnicmp(argv[i] + 1, "h", 1) == 0) { + else if (wal_strnicmp(argv[i] + 1, "h", 1) == 0) + { i++; - if (i < argc && sscanf(argv[i], "%d", &value) == 1) { + if (i < argc && sscanf(argv[i], "%d", &value) == 1) + { #if ENABLE_SDL_WINDOW SIM_SetWindowH(value); #endif } } - else if (wal_strnicmp(argv[i] + 1, "runUnitTests", 12) == 0) { + else if (wal_strnicmp(argv[i] + 1, "runUnitTests", 12) == 0) + { i++; - if (i < argc && sscanf(argv[i], "%d", &value) == 1) { + if (i < argc && sscanf(argv[i], "%d", &value) == 1) + { // 0 = don't run, 1 = run with system pause, 2 - run without system pause g_selfTestsMode = value; } @@ -418,7 +453,7 @@ int __cdecl main(int argc, char **argv) } printf("g_selfTestsMode %i\n", g_selfTestsMode); - int iResult; + int iResult; #if 0 int maxTest = 100; @@ -430,12 +465,13 @@ int __cdecl main(int argc, char **argv) } #endif #ifndef LINUX - // Initialize Winsock - iResult = WSAStartup(MAKEWORD(2,2), &wsaData); - if (iResult != 0) { - printf("WSAStartup failed with error: %d\n", iResult); - return 1; - } + // Initialize Winsock + iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); + if (iResult != 0) + { + printf("WSAStartup failed with error: %d\n", iResult); + return 1; + } #endif printf("sizeof(short) = %d\n", (int)sizeof(short)); printf("sizeof(int) = %d\n", (int)sizeof(int)); @@ -446,116 +482,142 @@ int __cdecl main(int argc, char **argv) printf("sizeof(long double) = %d\n", (int)sizeof(long double)); printf("sizeof(led_corr_t) = %d\n", (int)sizeof(led_corr_t)); printf("sizeof(mainConfig_t) = %d\n", (int)sizeof(mainConfig_t)); - - if (sizeof(FLASH_VARS_STRUCTURE) != MAGIC_FLASHVARS_SIZE) { + + if (sizeof(FLASH_VARS_STRUCTURE) != MAGIC_FLASHVARS_SIZE) + { printf("sizeof(FLASH_VARS_STRUCTURE) != MAGIC_FLASHVARS_SIZE!: %i\n", sizeof(FLASH_VARS_STRUCTURE)); system("pause"); } - if (sizeof(ledRemap_t) != MAGIC_LED_REMAP_SIZE) { + if (sizeof(ledRemap_t) != MAGIC_LED_REMAP_SIZE) + { printf("sizeof(ledRemap_t) != MAGIC_LED_REMAP_SIZE!: %i\n", sizeof(ledRemap_t)); system("pause"); } - if (sizeof(led_corr_t) != MAGIC_LED_CORR_SIZE) { + if (sizeof(led_corr_t) != MAGIC_LED_CORR_SIZE) + { printf("sizeof(led_corr_t) != MAGIC_LED_CORR_SIZE!: %i\n", sizeof(led_corr_t)); system("pause"); } - //printf("Offset MQTT Group: %i", OFFSETOF(mainConfig_t, mqtt_group)); - if (sizeof(mainConfig_t) != MAGIC_CONFIG_SIZE_V4) { + // printf("Offset MQTT Group: %i", OFFSETOF(mainConfig_t, mqtt_group)); + if (sizeof(mainConfig_t) != MAGIC_CONFIG_SIZE_V4) + { printf("sizeof(mainConfig_t) != MAGIC_CONFIG_SIZE!: %i\n", sizeof(mainConfig_t)); system("pause"); } - if (OFFSETOF(mainConfig_t, staticIP) != 0x00000527) { + if (OFFSETOF(mainConfig_t, staticIP) != 0x00000527) + { printf("OFFSETOF(mainConfig_t, staticIP) != 0x00000527z: %i\n", OFFSETOF(mainConfig_t, staticIP)); system("pause"); } - if (OFFSETOF(mainConfig_t, wifi_ssid) != 0x00000014) { + if (OFFSETOF(mainConfig_t, wifi_ssid) != 0x00000014) + { printf("OFFSETOF(mainConfig_t, wifi_ssid) != 0x00000014: %i\n", OFFSETOF(mainConfig_t, wifi_ssid)); system("pause"); } - if (OFFSETOF(mainConfig_t, wifi_pass) != 0x00000054) { + if (OFFSETOF(mainConfig_t, wifi_pass) != 0x00000054) + { printf("OFFSETOF(mainConfig_t, wifi_pass) != 0x00000054: %i\n", OFFSETOF(mainConfig_t, wifi_pass)); system("pause"); } - if (OFFSETOF(mainConfig_t, unused_fill) != 0x0000045E) { + if (OFFSETOF(mainConfig_t, unused_fill) != 0x0000045E) + { printf("OFFSETOF(mainConfig_t, unused_fill) != 0x0000045E: %i\n", OFFSETOF(mainConfig_t, unused_fill)); system("pause"); } - if (OFFSETOF(mainConfig_t, buttonHoldRepeat) != 0x000004BA) { + if (OFFSETOF(mainConfig_t, buttonHoldRepeat) != 0x000004BA) + { printf("OFFSETOF(mainConfig_t, buttonHoldRepeat) != 0x000004BA: %i\n", OFFSETOF(mainConfig_t, buttonHoldRepeat)); system("pause"); } - if (OFFSETOF(mainConfig_t, shortDeviceName) != 0x2DE) { + if (OFFSETOF(mainConfig_t, shortDeviceName) != 0x2DE) + { printf("OFFSETOF(mainConfig_t, shortDeviceName) != 0x2DE: %i\n", OFFSETOF(mainConfig_t, shortDeviceName)); system("pause"); } - if (OFFSETOF(mainConfig_t, timeRequiredToMarkBootSuccessfull) != 0x00000597) { + if (OFFSETOF(mainConfig_t, timeRequiredToMarkBootSuccessfull) != 0x00000597) + { printf("OFFSETOF(mainConfig_t, timeRequiredToMarkBootSuccessfull) != 0x00000597: %i\n", OFFSETOF(mainConfig_t, timeRequiredToMarkBootSuccessfull)); system("pause"); } - if (OFFSETOF(mainConfig_t, dgr_sendFlags) != 0x00000460) { + if (OFFSETOF(mainConfig_t, dgr_sendFlags) != 0x00000460) + { printf("OFFSETOF(mainConfig_t, dgr_sendFlags) != 0x00000460: %i\n", OFFSETOF(mainConfig_t, dgr_sendFlags)); system("pause"); } - if (OFFSETOF(mainConfig_t, mqtt_host) != 0x00000094) { + if (OFFSETOF(mainConfig_t, mqtt_host) != 0x00000094) + { printf("OFFSETOF(mainConfig_t, mqtt_host) != 0x00000094: %i\n", OFFSETOF(mainConfig_t, mqtt_host)); system("pause"); } - if (OFFSETOF(mainConfig_t, mqtt_userName) != 0x1D4) { + if (OFFSETOF(mainConfig_t, mqtt_userName) != 0x1D4) + { printf("OFFSETOF(mainConfig_t, mqtt_userName) != 0x1D4: %i\n", OFFSETOF(mainConfig_t, mqtt_userName)); system("pause"); -} - if (OFFSETOF(mainConfig_t, mqtt_port) != 0x294) { + } + if (OFFSETOF(mainConfig_t, mqtt_port) != 0x294) + { printf("OFFSETOF(mainConfig_t, mqtt_port) != 0x294: %i\n", OFFSETOF(mainConfig_t, mqtt_port)); system("pause"); } - if (OFFSETOF(mainConfig_t, mqtt_group) != 0x00000554) { + if (OFFSETOF(mainConfig_t, mqtt_group) != 0x00000554) + { printf("OFFSETOF(mainConfig_t, mqtt_group) != 0x00000554: %i\n", OFFSETOF(mainConfig_t, mqtt_group)); system("pause"); } - if (OFFSETOF(mainConfig_t, LFS_Size) != 0x000004BC) { + if (OFFSETOF(mainConfig_t, LFS_Size) != 0x000004BC) + { printf("OFFSETOF(mainConfig_t, LFS_Size) != 0x000004BC: %i\n", OFFSETOF(mainConfig_t, LFS_Size)); system("pause"); } - if (OFFSETOF(mainConfig_t, ping_host) != 0x000005A0) { + if (OFFSETOF(mainConfig_t, ping_host) != 0x000005A0) + { printf("OFFSETOF(mainConfig_t, ping_host) != 0x000005A0: %i\n", OFFSETOF(mainConfig_t, ping_host)); system("pause"); } - if (OFFSETOF(mainConfig_t, buttonShortPress) != 0x000004B8) { + if (OFFSETOF(mainConfig_t, buttonShortPress) != 0x000004B8) + { printf("OFFSETOF(mainConfig_t, buttonShortPress) != 0x000004B8: %i\n", OFFSETOF(mainConfig_t, buttonShortPress)); system("pause"); } - if (OFFSETOF(mainConfig_t, pins) != 0x0000033E) { + if (OFFSETOF(mainConfig_t, pins) != 0x0000033E) + { printf("OFFSETOF(mainConfig_t, pins) != 0x0000033E: %i\n", OFFSETOF(mainConfig_t, pins)); system("pause"); } - if (OFFSETOF(mainConfig_t, version) != 0x00000004) { + if (OFFSETOF(mainConfig_t, version) != 0x00000004) + { printf("OFFSETOF(mainConfig_t, version) != 0x00000004: %i\n", OFFSETOF(mainConfig_t, version)); system("pause"); } - if (OFFSETOF(mainConfig_t, initCommandLine) != 0x000005E0) { + if (OFFSETOF(mainConfig_t, initCommandLine) != 0x000005E0) + { printf("OFFSETOF(mainConfig_t, initCommandLine) != 0x000005E0: %i\n", OFFSETOF(mainConfig_t, initCommandLine)); system("pause"); } - if (OFFSETOF(mainConfig_t, wifi_ssid2) != 0x00000C00) { + if (OFFSETOF(mainConfig_t, wifi_ssid2) != 0x00000C00) + { printf("OFFSETOF(mainConfig_t, wifi_ssid2) != 0x00000C00: %i\n", OFFSETOF(mainConfig_t, wifi_ssid2)); system("pause"); } - if (OFFSETOF(mainConfig_t, wifi_pass2) != 0x00000C40) { + if (OFFSETOF(mainConfig_t, wifi_pass2) != 0x00000C40) + { printf("OFFSETOF(mainConfig_t, wifi_pass2) != 0x00000C40: %i\n", OFFSETOF(mainConfig_t, wifi_pass2)); system("pause"); } - if (OFFSETOF(mainConfig_t, unused) != 0x00000CA5) { - //printf("OFFSETOF(mainConfig_t, unused) != 0x00000CA5: %i\n", OFFSETOF(mainConfig_t, unused)); - //system("pause"); + if (OFFSETOF(mainConfig_t, unused) != 0x00000CA5) + { + // printf("OFFSETOF(mainConfig_t, unused) != 0x00000CA5: %i\n", OFFSETOF(mainConfig_t, unused)); + // system("pause"); } // Test expansion - //CMD_UART_Send_Hex(0,0,"FFAA$CH1$BB",0); + // CMD_UART_Send_Hex(0,0,"FFAA$CH1$BB",0); #ifndef LINUX _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF); #endif - if (g_selfTestsMode) { + if (g_selfTestsMode) + { g_bDoingUnitTestsNow = 1; SIM_ClearOBK(0); // let things warm up a little @@ -564,12 +626,12 @@ int __cdecl main(int argc, char **argv) Win_DoUnitTests(); Sim_RunFrames(50, false); g_bDoingUnitTestsNow = 0; - if (g_selfTestsMode > 1) { + if (g_selfTestsMode > 1) + { return SelfTest_GetNumErrors(); } } - #if ENABLE_SDL_WINDOW SIM_CreateWindow(argc, argv); #endif @@ -586,10 +648,12 @@ int __cdecl main(int argc, char **argv) CMD_ExecuteCommand("MqttUser homeassistant", 0); #endif CMD_ExecuteCommand("reboot", 0); - //CMD_ExecuteCommand("addRepeatingEvent 1 -1 backlog addChannel 1 1; publishInt myTestTopic $CH1", 0); - - if (false) { - while (1) { + // CMD_ExecuteCommand("addRepeatingEvent 1 -1 backlog addChannel 1 1; publishInt myTestTopic $CH1", 0); + + if (false) + { + while (1) + { Sleep(DEFAULT_FRAME_TIME); Sim_RunFrame(DEFAULT_FRAME_TIME); #if ENABLE_SDL_WINDOW @@ -597,9 +661,11 @@ int __cdecl main(int argc, char **argv) #endif } } - else { + else + { long prev_time = SIM_GetTime(); - while (1) { + while (1) + { long cur_time = SIM_GetTime(); g_delta = cur_time - prev_time; if (g_delta <= 0) @@ -617,29 +683,26 @@ int __cdecl main(int argc, char **argv) } // initialise OTA flash starting at startaddr -int init_ota(unsigned int startaddr) { +int init_ota(unsigned int startaddr) +{ return 0; } // add any length of data to OTA -void add_otadata(unsigned char *data, int len) { +void add_otadata(unsigned char *data, int len) +{ return; } // finalise OTA flash (write last sector if incomplete) -void close_ota() { +void close_ota() +{ return; } -void otarequest(const char *urlin) { +void otarequest(const char *urlin) +{ return; } - - - - - - #endif -