From e9a7d1d4eb6d6b054cdee515e11981ade23ff758 Mon Sep 17 00:00:00 2001 From: btsimonh Date: Sat, 5 Mar 2022 10:10:56 +0000 Subject: [PATCH] new_cmd - make it not based on globals. Now command can be re-entrant? don't parse args in new_cmd - just cmd & args string. (we can have glbal fns to perform this if required, but current implementation not good for "my name" type args. Add context in command fn structure. This is generic ptr for any purpose. modify extsing command usage to fit. Add logging commands loglevel n and logfeature m n --- src/drv_tuyaMCU.c | 296 +++++++++++++++++++------------------- src/drv_tuyaMCU.h | 4 +- src/httpserver/http_fns.c | 1 + src/logging/logging.c | 55 +++++++ src/logging/logging.h | 2 + src/new_cmd.c | 69 ++++++--- src/new_cmd.h | 8 +- src/user_main.c | 2 + 8 files changed, 271 insertions(+), 166 deletions(-) diff --git a/src/drv_tuyaMCU.c b/src/drv_tuyaMCU.c index 5637e4909..a15bbff17 100644 --- a/src/drv_tuyaMCU.c +++ b/src/drv_tuyaMCU.c @@ -1,24 +1,28 @@ -#include "new_common.h" -#include "new_pins.h" -#include "new_cfg.h" -#include "new_cmd.h" - - -#if PLATFORM_BK7231T | PLATFORM_BK7231N +#include "new_common.h" +#include "new_pins.h" +#include "new_cfg.h" +#include "new_cmd.h" +#include "logging/logging.h" +#include "drv_tuyaMCU.h" + + +#if PLATFORM_BK7231T | PLATFORM_BK7231N #include "../../beken378/func/user_driver/BkDriverUart.h" #endif -#define TUYA_CMD_HEARTBEAT 0x00 -#define TUYA_CMD_QUERY_PRODUCT 0x01 -#define TUYA_CMD_MCU_CONF 0x02 -#define TUYA_CMD_WIFI_STATE 0x03 -#define TUYA_CMD_WIFI_RESET 0x04 -#define TUYA_CMD_WIFI_SELECT 0x05 -#define TUYA_CMD_SET_DP 0x06 -#define TUYA_CMD_STATE 0x07 -#define TUYA_CMD_QUERY_STATE 0x08 +#define TUYA_CMD_HEARTBEAT 0x00 +#define TUYA_CMD_QUERY_PRODUCT 0x01 +#define TUYA_CMD_MCU_CONF 0x02 +#define TUYA_CMD_WIFI_STATE 0x03 +#define TUYA_CMD_WIFI_RESET 0x04 +#define TUYA_CMD_WIFI_SELECT 0x05 +#define TUYA_CMD_SET_DP 0x06 +#define TUYA_CMD_STATE 0x07 +#define TUYA_CMD_QUERY_STATE 0x08 #define TUYA_CMD_SET_TIME 0x1C +void TuyaMCU_RunFrame(); + const char *TuyaMCU_GetCommandTypeLabel(int t) { if(t == TUYA_CMD_HEARTBEAT) return "Hearbeat"; @@ -42,17 +46,17 @@ const char *TuyaMCU_GetCommandTypeLabel(int t) { return "SetTime"; return "Unknown"; } -typedef struct rtcc_s { - uint8_t second; - uint8_t minute; - uint8_t hour; - uint8_t day_of_week; // sunday is day 1 - uint8_t day_of_month; - uint8_t month; - char name_of_month[4]; - uint16_t day_of_year; - uint16_t year; - uint32_t days; +typedef struct rtcc_s { + uint8_t second; + uint8_t minute; + uint8_t hour; + uint8_t day_of_week; // sunday is day 1 + uint8_t day_of_month; + uint8_t month; + char name_of_month[4]; + uint16_t day_of_year; + uint16_t year; + uint32_t days; uint32_t valid; } rtcc_t; @@ -69,28 +73,28 @@ void UART_InitReceiveRingBuffer(int size){ g_recvBufSize = size; g_recvBufIn = 0; } -int UART_GetDataSize() -{ - int remain_buf_size = 0; - - if(g_recvBufIn >= g_recvBufOut) { - remain_buf_size = g_recvBufIn - g_recvBufOut; - }else { - remain_buf_size = g_recvBufIn + g_recvBufSize - g_recvBufOut; - } - - return remain_buf_size; +int UART_GetDataSize() +{ + int remain_buf_size = 0; + + if(g_recvBufIn >= g_recvBufOut) { + remain_buf_size = g_recvBufIn - g_recvBufOut; + }else { + remain_buf_size = g_recvBufIn + g_recvBufSize - g_recvBufOut; + } + + return remain_buf_size; } -byte UART_GetNextByte(int index) { - int realIndex = g_recvBufOut + index; - if(realIndex > g_recvBufSize) - realIndex -= g_recvBufSize; - +byte UART_GetNextByte(int index) { + int realIndex = g_recvBufOut + index; + if(realIndex > g_recvBufSize) + realIndex -= g_recvBufSize; + return g_recvBuf[realIndex]; } void UART_ConsumeBytes(int idx) { - g_recvBufOut += idx; - if(g_recvBufOut > g_recvBufSize) + g_recvBufOut += idx; + if(g_recvBufOut > g_recvBufSize) g_recvBufOut -= g_recvBufSize; } // header version command lenght data checksum @@ -149,39 +153,39 @@ int UART_TryToGetNextTuyaPacket(byte *out, int maxSize) { return 0; } void UART_AppendByteToCircularBuffer(int rc) { - if(UART_GetDataSize() < (g_recvBufSize-1)) - { - g_recvBuf[g_recvBufIn++] = rc; - if(g_recvBufIn >= g_recvBufSize){ - g_recvBufIn = 0; - } + if(UART_GetDataSize() < (g_recvBufSize-1)) + { + g_recvBuf[g_recvBufIn++] = rc; + if(g_recvBufIn >= g_recvBufSize){ + g_recvBufIn = 0; + } } } -#if PLATFORM_BK7231T | PLATFORM_BK7231N -void test_ty_read_uart_data_to_buffer(int port, void* param) -{ - int rc = 0; - - while((rc = uart_read_byte(port)) != -1) - { - UART_AppendByteToCircularBuffer(rc); - } - +#if PLATFORM_BK7231T | PLATFORM_BK7231N +void test_ty_read_uart_data_to_buffer(int port, void* param) +{ + int rc = 0; + + while((rc = uart_read_byte(port)) != -1) + { + UART_AppendByteToCircularBuffer(rc); + } + } #endif void TuyaMCU_Bridge_InitUART(int baud) { #if PLATFORM_BK7231T | PLATFORM_BK7231N bk_uart_config_t config; - - config.baud_rate = 9600; - config.data_width = 0x03; - config.parity = 0; //0:no parity,1:odd,2:even - config.stop_bits = 0; //0:1bit,1:2bit - config.flow_control = 0; //FLOW_CTRL_DISABLED - config.flags = 0; - - bk_uart_initialize(0, &config, NULL); + + config.baud_rate = 9600; + config.data_width = 0x03; + config.parity = 0; //0:no parity,1:odd,2:even + config.stop_bits = 0; //0:1bit,1:2bit + config.flow_control = 0; //FLOW_CTRL_DISABLED + config.flags = 0; + + bk_uart_initialize(0, &config, NULL); bk_uart_set_rx_callback(0, test_ty_read_uart_data_to_buffer, NULL); #else @@ -189,10 +193,10 @@ void TuyaMCU_Bridge_InitUART(int baud) { #endif } void TuyaMCU_Bridge_SendUARTByte(byte b) { -#if PLATFORM_BK7231T | PLATFORM_BK7231N +#if PLATFORM_BK7231T | PLATFORM_BK7231N bk_send_byte(0, b); -#elif WINDOWS - // STUB - for testing +#elif WINDOWS + // STUB - for testing printf("%02X", b); #else @@ -202,84 +206,88 @@ void TuyaMCU_Bridge_SendUARTByte(byte b) { // append header, len, everything, checksum void TuyaMCU_SendCommandWithData(byte cmdType, byte *data, int payload_len) { - int i; - + int i; + byte check_sum = (0xFF + cmdType + (payload_len >> 8) + (payload_len & 0xFF)); - TuyaMCU_Bridge_InitUART(9600); - TuyaMCU_Bridge_SendUARTByte(0x55); - TuyaMCU_Bridge_SendUARTByte(0xAA); - TuyaMCU_Bridge_SendUARTByte(0x00); // version 00 - TuyaMCU_Bridge_SendUARTByte(cmdType); // version 00 - TuyaMCU_Bridge_SendUARTByte(payload_len >> 8); // following data length (Hi) + TuyaMCU_Bridge_InitUART(9600); + TuyaMCU_Bridge_SendUARTByte(0x55); + TuyaMCU_Bridge_SendUARTByte(0xAA); + TuyaMCU_Bridge_SendUARTByte(0x00); // version 00 + TuyaMCU_Bridge_SendUARTByte(cmdType); // version 00 + TuyaMCU_Bridge_SendUARTByte(payload_len >> 8); // following data length (Hi) TuyaMCU_Bridge_SendUARTByte(payload_len & 0xFF); // following data length (Lo) - for(i = 0; i < payload_len; i++) { - byte b = data[i]; - check_sum += b; + for(i = 0; i < payload_len; i++) { + byte b = data[i]; + check_sum += b; TuyaMCU_Bridge_SendUARTByte(b); - } - TuyaMCU_Bridge_SendUARTByte(check_sum); -} - -void TuyaMCU_Send_SetTime(rtcc_t *pTime) { - byte payload_buffer[8]; - byte tuya_day_of_week; - - if (pTime->day_of_week == 1) { - tuya_day_of_week = 7; - } else { - tuya_day_of_week = pTime->day_of_week-1; - } - - payload_buffer[0] = 0x01; - payload_buffer[1] = pTime->year % 100; - payload_buffer[2] = pTime->month; - payload_buffer[3] = pTime->day_of_month; - payload_buffer[4] = pTime->hour; - payload_buffer[5] = pTime->minute; - payload_buffer[6] = pTime->second; - payload_buffer[7] = tuya_day_of_week; //1 for Monday in TUYA Doc - - TuyaMCU_SendCommandWithData(TUYA_CMD_SET_TIME, payload_buffer, 8); -} -void TuyaMCU_Send_Hex() { - const char *args = CMD_GetArg(1); - if(args == 0) { - printf("TuyaMCU_Send_Hex: requires 1 argument (hex string, like FFAABB00CCDD\n"); - return; - } - while(*args) { - byte b; - b = hexbyte(args); - - TuyaMCU_Bridge_SendUARTByte(b); - - args += 2; - } - -} -void TuyaMCU_Send_SetTime_Example() { - rtcc_t testTime; - - testTime.year = 2012; - testTime.month = 7; - testTime.day_of_month = 15; - testTime.day_of_week = 4; - testTime.hour = 6; - testTime.minute = 54; - testTime.second = 32; - - TuyaMCU_Send_SetTime(&testTime); + } + TuyaMCU_Bridge_SendUARTByte(check_sum); } + +void TuyaMCU_Send_SetTime(rtcc_t *pTime) { + byte payload_buffer[8]; + byte tuya_day_of_week; + + if (pTime->day_of_week == 1) { + tuya_day_of_week = 7; + } else { + tuya_day_of_week = pTime->day_of_week-1; + } + + payload_buffer[0] = 0x01; + payload_buffer[1] = pTime->year % 100; + payload_buffer[2] = pTime->month; + payload_buffer[3] = pTime->day_of_month; + payload_buffer[4] = pTime->hour; + payload_buffer[5] = pTime->minute; + payload_buffer[6] = pTime->second; + payload_buffer[7] = tuya_day_of_week; //1 for Monday in TUYA Doc + + TuyaMCU_SendCommandWithData(TUYA_CMD_SET_TIME, payload_buffer, 8); +} + +int TuyaMCU_Send_Hex(const void *context, const char *cmd, char *args) { + //const char *args = CMD_GetArg(1); + if(!(*args)) { + printf("TuyaMCU_Send_Hex: requires 1 argument (hex string, like FFAABB00CCDD\n"); + return -1; + } + while(*args) { + byte b; + b = hexbyte(args); + + TuyaMCU_Bridge_SendUARTByte(b); + + args += 2; + } + return 1; +} + +int TuyaMCU_Send_SetTime_Example(const void *context, const char *cmd, char *args) { + rtcc_t testTime; + + testTime.year = 2012; + testTime.month = 7; + testTime.day_of_month = 15; + testTime.day_of_week = 4; + testTime.hour = 6; + testTime.minute = 54; + testTime.second = 32; + + TuyaMCU_Send_SetTime(&testTime); + return 1; +} + void TuyaMCU_Send(byte *data, int size) { - int i; + int i; unsigned char check_sum; check_sum = 0; - for(i = 0; i < size; i++) { - byte b = data[i]; - check_sum += b; + for(i = 0; i < size; i++) { + byte b = data[i]; + check_sum += b; TuyaMCU_Bridge_SendUARTByte(b); - } + } TuyaMCU_Bridge_SendUARTByte(check_sum); printf("\nWe sent %i bytes to Tuya MCU\n",size+1); @@ -288,8 +296,8 @@ void TuyaMCU_Init() { TuyaMCU_Bridge_InitUART(9600); UART_InitReceiveRingBuffer(256); - CMD_RegisterCommand("tuyaMcu_testSendTime","",TuyaMCU_Send_SetTime_Example, "Sends a example date by TuyaMCU to clock/callendar MCU"); - CMD_RegisterCommand("uartSendHex","",TuyaMCU_Send_Hex, "Sends raw data by TuyaMCU UART, you must write whole packet with checksum yourself"); + CMD_RegisterCommand("tuyaMcu_testSendTime","",TuyaMCU_Send_SetTime_Example, "Sends a example date by TuyaMCU to clock/callendar MCU", NULL); + CMD_RegisterCommand("uartSendHex","",TuyaMCU_Send_Hex, "Sends raw data by TuyaMCU UART, you must write whole packet with checksum yourself", NULL); ///CMD_RegisterCommand("tuyaMcu_sendSimple","",TuyaMCU_Send_Simple, "Appends a 0x55 0xAA header to a data, append a checksum at end and send"); } diff --git a/src/drv_tuyaMCU.h b/src/drv_tuyaMCU.h index 55d40d4ca..eae68a952 100644 --- a/src/drv_tuyaMCU.h +++ b/src/drv_tuyaMCU.h @@ -1,3 +1,5 @@ -void TuyaMCU_Init(); \ No newline at end of file +void TuyaMCU_Init(); +void TuyaMCU_RunFrame(); +void TuyaMCU_Send(byte *data, int size); \ No newline at end of file diff --git a/src/httpserver/http_fns.c b/src/httpserver/http_fns.c index 1e17c722f..7461064a1 100644 --- a/src/httpserver/http_fns.c +++ b/src/httpserver/http_fns.c @@ -5,6 +5,7 @@ #include "../new_cfg.h" #include "../ota/ota.h" #include "../new_cmd.h" +#include "../drv_tuyaMCU.h" #ifdef WINDOWS // nothing diff --git a/src/logging/logging.c b/src/logging/logging.c index 27902a067..a83218afa 100644 --- a/src/logging/logging.c +++ b/src/logging/logging.c @@ -6,6 +6,7 @@ #include "../httpserver/new_http.h" #include "str_pub.h" #include "../logging/logging.h" +#include "../new_cmd.h" SemaphoreHandle_t g_mutex = 0; static char tmp[1024]; @@ -32,8 +33,10 @@ char *logfeaturenames[] = { "GEN:", // = 7 "API:", // = 8 "LFS:", // = 9 + "CMD:", // = 10 }; + #ifdef DEBUG_USE_SIMPLE_LOGGER void addLog(char *fmt, ...){ @@ -135,6 +138,9 @@ static void initLog() { HTTP_RegisterCallback( "/logs", HTTP_GET, http_getlog); HTTP_RegisterCallback( "/lograw", HTTP_GET, http_getlograw); bk_printf("Init log done!\r\n"); + + CMD_RegisterCommand("loglevel", "", log_command, "set log level <0..6>", NULL); + CMD_RegisterCommand("logfeature", "", log_command, "set log feature filter, <0..10> <0|1>", NULL); } // adds a log to the log memory @@ -454,6 +460,55 @@ static int http_getlog(http_request_t *request){ } +int log_command(const void *context, const char *cmd, char *args){ + int result = 0; + if (!cmd) return -1; + if (!args) return -1; + do{ + if (!stricmp(cmd, "loglevel")){ + int res, level; + res = sscanf(args, "%d", &level); + if (res == 1){ + if ((level >= 0) && (level <= 9)){ + loglevel = level; + result = 1; + ADDLOG_DEBUG(LOG_FEATURE_CMD, "loglevel set %d", level); + } else { + ADDLOG_ERROR(LOG_FEATURE_CMD, "loglevel %d out of range", level); + result = -1; + } + } else { + ADDLOG_ERROR(LOG_FEATURE_CMD, "loglevel %s invalid?", args); + result = -1; + } + break; + } + if (!stricmp(cmd, "logfeature")){ + int res, feat; + int val = 1; + res = sscanf(args, "%d %d", &feat, &val); + if (res >= 1){ + if ((feat >= 0) && (feat < LOG_FEATURE_MAX)){ + logfeatures &= ~(1 << feat); + if (val){ + logfeatures |= (1 << feat); + } + ADDLOG_DEBUG(LOG_FEATURE_CMD, "logfeature set 0x%08X", logfeatures); + result = 1; + } else { + ADDLOG_ERROR(LOG_FEATURE_CMD, "logfeature %d out of range", feat); + result = -1; + } + } else { + ADDLOG_ERROR(LOG_FEATURE_CMD, "logfeature %s invalid?", args); + result = -1; + } + break; + } + } while (0); + + return result; +} #endif \ No newline at end of file diff --git a/src/logging/logging.h b/src/logging/logging.h index 941e47bb4..69b48a79a 100644 --- a/src/logging/logging.h +++ b/src/logging/logging.h @@ -17,6 +17,8 @@ void addLog(char *fmt, ...); void addLogAdv(int level, int feature, char *fmt, ...); +int log_command(const void *context, const char *cmd, char *args); + #define ADDLOG_ERROR(x, y, ...) addLogAdv(LOG_ERROR, x, y, ##__VA_ARGS__) #define ADDLOG_WARN(x, y, ...) addLogAdv(LOG_WARN, x, y, ##__VA_ARGS__) #define ADDLOG_INFO(x, y, ...) addLogAdv(LOG_INFO, x, y, ##__VA_ARGS__) diff --git a/src/new_cmd.c b/src/new_cmd.c index 61d11f906..b49bfdaed 100644 --- a/src/new_cmd.c +++ b/src/new_cmd.c @@ -9,13 +9,14 @@ static int generateHashValue(const char *fname) { int i; int hash; - char letter; + int letter; + unsigned char *f = (unsigned char *)fname; hash = 0; i = 0; - while (fname[i] != '\0') { - letter = tolower(fname[i]); - hash+=(int)(letter)*(i+119); + while (f[i]) { + letter = tolower(f[i]); + hash+=(letter)*(i+119); i++; } hash = (hash ^ (hash >> 10) ^ (hash >> 20)); @@ -38,7 +39,7 @@ void CMD_ListAllCommands(void *userData, void (*callback)(command_t *cmd, void * } } -void CMD_RegisterCommand(const char *name, const char *args, commandHandler_t handler, const char *userDesc) { +void CMD_RegisterCommand(const char *name, const char *args, commandHandler_t handler, const char *userDesc, void *context) { int hash; command_t *newCmd; @@ -56,6 +57,7 @@ void CMD_RegisterCommand(const char *name, const char *args, commandHandler_t ha newCmd->name = name; newCmd->next = g_commands[hash]; newCmd->userDesc = userDesc; + newCmd->context = context; g_commands[hash] = newCmd; } @@ -77,9 +79,9 @@ command_t *CMD_Find(const char *name) { #define MAX_CMD_LEN 512 #define MAX_ARGS 32 -static char g_buffer[MAX_CMD_LEN]; -static char *g_args[MAX_ARGS]; -static int g_numArgs = 0; +//static char g_buffer[MAX_CMD_LEN]; +//static char *g_args[MAX_ARGS]; +//static int g_numArgs = 0; bool isWhiteSpace(char ch) { if(ch == ' ') @@ -93,17 +95,20 @@ bool isWhiteSpace(char ch) { return false; } // NOTE: arg0 is command name -int CMD_GetArgsCount() { - return g_numArgs; -} +//int CMD_GetArgsCount() { +// return g_numArgs; +//} // NOTE: arg0 is command name -const char *CMD_GetArg(int i) { - return g_args[i]; -} -int CMD_ExecuteCommand(const char *s) { - int r = 0; +//const char *CMD_GetArg(int i) { +// return g_args[i]; +//} + +int CMD_ExecuteCommand(char *s) { + //int r = 0; char *p; - int i; + //int i; + char *cmd; + char *args; command_t *newCmd; ADDLOG_DEBUG(LOG_FEATURE_CMD, "cmd [%s]", s); @@ -112,6 +117,34 @@ int CMD_ExecuteCommand(const char *s) { s++; } + cmd = s; + p = s; + while(*p != 0) { + if(isWhiteSpace(*p)) { + *p = 0; + p++; + break; + } + p++; + } + + while(*p && isWhiteSpace(*p)) { + p++; + } + args = p; + + newCmd = CMD_Find(cmd); + if (!newCmd) { + ADDLOG_ERROR(LOG_FEATURE_CMD, "cmd %s not found", cmd); + return 0; + } + + if (newCmd->handler){ + return newCmd->handler(newCmd->context, cmd, args); + } + return 0; + +/* strcpy(g_buffer,s); p = g_buffer; g_numArgs = 0; @@ -147,6 +180,6 @@ int CMD_ExecuteCommand(const char *s) { } return r; +*/ } - diff --git a/src/new_cmd.h b/src/new_cmd.h index 3d6f50815..b7d1fcff6 100644 --- a/src/new_cmd.h +++ b/src/new_cmd.h @@ -1,18 +1,20 @@ -typedef void (*commandHandler_t)(); +typedef int (*commandHandler_t)(const void *context, const char *cmd, char *args); typedef struct command_s { const char *name; const char *argsFormat; commandHandler_t handler; const char *userDesc; + const void *context; struct command_s *next; } command_t; command_t *CMD_Find(const char *name); -void CMD_RegisterCommand(const char *name, const char *args, commandHandler_t handler, const char *userDesc); -int CMD_ExecuteCommand(const char *s); +void CMD_RegisterCommand(const char *name, const char *args, commandHandler_t handler, const char *userDesc, void *context); +// allow modification of s +int CMD_ExecuteCommand(char *s); // NOTE: argsCount includes commands name, so 1 tells "only command" int CMD_GetArgsCount() ; // NOTE: arg0 is command name diff --git a/src/user_main.c b/src/user_main.c index 2b8f564f9..382a6c165 100644 --- a/src/user_main.c +++ b/src/user_main.c @@ -55,6 +55,8 @@ #include "flash_config/flash_config.h" #include "flash_config/flash_vars_vars.h" +#include "drv_tuyaMCU.h" + #undef Malloc #undef Free