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