diff --git a/src/bitmessage/bitmessage_public.h b/src/bitmessage/bitmessage_public.h index c744cd0b8..38212599b 100644 --- a/src/bitmessage/bitmessage_public.h +++ b/src/bitmessage/bitmessage_public.h @@ -7,7 +7,7 @@ typedef struct bitMessage_s { } bitMessage_t; // bitmessage_read.c -void MSG_BeginReading(bitMessage_t *msg, byte *data, int dataSize); +void MSG_BeginReading(bitMessage_t *msg, const byte *data, int dataSize); int MSG_ReadString(bitMessage_t *msg, char *out, int outBufferSize); int MSG_SkipBytes(bitMessage_t *msg, int c); int MSG_CheckAndSkip(bitMessage_t *msg, const char *s, int len); diff --git a/src/bitmessage/bitmessage_read.c b/src/bitmessage/bitmessage_read.c index bb6b1faec..672ab760b 100644 --- a/src/bitmessage/bitmessage_read.c +++ b/src/bitmessage/bitmessage_read.c @@ -2,10 +2,10 @@ -void MSG_BeginReading(bitMessage_t *msg, byte *data, int dataSize) { +void MSG_BeginReading(bitMessage_t *msg, const byte *data, int dataSize) { msg->position = 0; msg->totalSize = dataSize; - msg->data = data; + msg->data = (byte*) data; } const char *MSG_GetStringPointerAtCurrentPosition(bitMessage_t *msg) { const char *r = (const char*)(msg->data+msg->position); diff --git a/src/cmnds/cmd_main.c b/src/cmnds/cmd_main.c index 4b077668a..a560834d1 100644 --- a/src/cmnds/cmd_main.c +++ b/src/cmnds/cmd_main.c @@ -48,6 +48,9 @@ static int CMD_Restart(const void *context, const char *cmd, const char *args, i void CMD_Init() { CMD_RegisterCommand("restart", "", CMD_Restart, "Reboots the module", NULL); + if(CFG_HasFlag(OBK_FLAG_CMD_ENABLETCPRAWPUTTYSERVER)) { + CMD_StartTCPCommandLine(); + } } @@ -112,6 +115,9 @@ int get_cmd(const char *s, char *dest, int maxlen, int stripnum){ if (isWhiteSpace(*s)) { break; } + if(*s == 0) { + break; + } if (stripnum && *s >= '0' && *s <= '9'){ break; } diff --git a/src/cmnds/cmd_public.h b/src/cmnds/cmd_public.h index d0b37431e..a95be2d37 100644 --- a/src/cmnds/cmd_public.h +++ b/src/cmnds/cmd_public.h @@ -94,5 +94,7 @@ int fortest_commands_init(); void CMD_InitChannelCommands(); // cmd_send.c int CMD_InitSendCommands(); +// cmd_tcp.c +void CMD_StartTCPCommandLine(); #endif // __CMD_PUBLIC_H__ diff --git a/src/cmnds/cmd_tcp.c b/src/cmnds/cmd_tcp.c new file mode 100644 index 000000000..ef504a667 --- /dev/null +++ b/src/cmnds/cmd_tcp.c @@ -0,0 +1,160 @@ +#include "../new_pins.h" +#include "../new_cfg.h" +#include "../logging/logging.h" +#include "../obk_config.h" +#include +#include "cmd_local.h" + + +#define CMD_SERVER_PORT 100 +#define MAX_COMMAND_LEN 64 + +static xTaskHandle g_cmd_thread = NULL; +static int g_bStarted = 0; + +static void CMD_ClientThread( beken_thread_arg_t arg ) +{ + OSStatus err = kNoErr; + int fd = (int) arg; + char buf[MAX_COMMAND_LEN]; + int len; + + + while(1) { + len = recv( fd, buf, sizeof(buf)-1, 0 ); + if(len < 0) { + break; + } + if(len > 0) { + buf[len] = 0; + ADDLOG_ERROR(LOG_FEATURE_CMD, "TCP Console command: %s (raw len %i, strlen %i)", buf, len, strlen(buf) ); + LOG_SetRawSocketCallback(fd); + CMD_ExecuteCommand(buf,0); + LOG_SetRawSocketCallback(0); + //send(fd,"OK",3,0); + } + } + + rtos_delay_milliseconds(10); + + if ( err != kNoErr ) + ADDLOG_ERROR(LOG_FEATURE_CMD, "TCP client thread exit with err: %d", err ); + + lwip_close( fd );; +#if DISABLE_SEPARATE_THREAD_FOR_EACH_CMD_CLIENT + +#else + rtos_delete_thread( NULL ); +#endif +} + +/* TCP server listener thread */ +static void CMD_ServerThread( beken_thread_arg_t arg ) +{ + (void)( arg ); + OSStatus err = kNoErr; + struct sockaddr_in server_addr, client_addr; + socklen_t sockaddr_t_size = sizeof(client_addr); + char client_ip_str[16]; + int tcp_listen_fd = -1, client_fd = -1; + fd_set readfds; + + tcp_listen_fd = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + + server_addr.sin_family = AF_INET; + server_addr.sin_addr.s_addr = INADDR_ANY;/* Accept conenction request on all network interface */ + server_addr.sin_port = htons( CMD_SERVER_PORT );/* Server listen on port: 20000 */ + err = bind( tcp_listen_fd, (struct sockaddr *) &server_addr, sizeof(server_addr) ); + + err = listen( tcp_listen_fd, 0 ); + + while ( 1 ) + { + FD_ZERO( &readfds ); + FD_SET( tcp_listen_fd, &readfds ); + + select( tcp_listen_fd + 1, &readfds, NULL, NULL, NULL); + + if ( FD_ISSET( tcp_listen_fd, &readfds ) ) + { + client_fd = accept( tcp_listen_fd, (struct sockaddr *) &client_addr, &sockaddr_t_size ); + if ( client_fd >= 0 ) + { +#if PLATFORM_XR809 +#if DISABLE_SEPARATE_THREAD_FOR_EACH_CMD_CLIENT + +#else + OS_Thread_t clientThreadUnused ; +#endif +#endif + os_strcpy( client_ip_str, inet_ntoa( client_addr.sin_addr ) ); + ADDLOG_DEBUG(LOG_FEATURE_CMD, "CMD Client %s:%d connected, fd: %d", client_ip_str, client_addr.sin_port, client_fd ); +#if DISABLE_SEPARATE_THREAD_FOR_EACH_CMD_CLIENT + // Use main server thread (blocking all other clients) + // right now, I am getting OS_ThreadCreate everytime on XR809 platform + CMD_ClientThread((beken_thread_arg_t)client_fd); +#else + // Create separate thread for client + if ( kNoErr != +#if PLATFORM_XR809 + OS_ThreadCreate(&clientThreadUnused, + "CMD Client", + CMD_ClientThread, + client_fd, + OS_THREAD_PRIO_CONSOLE, + 0x400) + +#else + rtos_create_thread( NULL, BEKEN_APPLICATION_PRIORITY, + "CMD Client", + (beken_thread_function_t)CMD_ClientThread, + 0x800, + (beken_thread_arg_t)client_fd ) + +#endif + ) + { + ADDLOG_DEBUG(LOG_FEATURE_CMD, "CMD Client %s:%d thread creation failed! fd: %d", client_ip_str, client_addr.sin_port, client_fd ); + lwip_close( client_fd ); + client_fd = -1; + } +#endif + } + } + } + + if ( err != kNoErr ) + ADDLOG_ERROR(LOG_FEATURE_CMD, "Server listerner thread exit with err: %d", err ); + + lwip_close( tcp_listen_fd ); + + rtos_delete_thread( NULL ); + +} + + +void CMD_StartTCPCommandLine() +{ + OSStatus err = kNoErr; + + if(g_bStarted) { + ADDLOG_ERROR(LOG_FEATURE_CMD, "CMD server is already running!\r\n"); + return; + } + err = rtos_create_thread( &g_cmd_thread, BEKEN_APPLICATION_PRIORITY, + "CMD_server", + (beken_thread_function_t)CMD_ServerThread, + 0x800, + (beken_thread_arg_t)0 ); + if(err != kNoErr) + { + ADDLOG_ERROR(LOG_FEATURE_CMD, "create \"CMD_server\" thread failed with %i!\r\n",err); + } + else + { + ADDLOG_INFO(LOG_FEATURE_CMD, "CMD TCP server started!\r\n"); + g_bStarted = 1; + } +} + + diff --git a/src/devicegroups/deviceGroups_read.c b/src/devicegroups/deviceGroups_read.c index f6c76a25b..d93f44caa 100644 --- a/src/devicegroups/deviceGroups_read.c +++ b/src/devicegroups/deviceGroups_read.c @@ -75,7 +75,6 @@ int DGR_Parse(const byte *data, int len, dgrDevice_t *dev, struct sockaddr *addr MSG_SkipBytes(&msg,2); } else if(type < DGR_ITEM_MAX_32BIT) { if(type == DGR_ITEM_POWER) { - int total = 0; relayFlags = MSG_Read3Bytes(&msg); relaysCnt = MSG_ReadByte(&msg); diff --git a/src/driver/drv_cse7766.c b/src/driver/drv_cse7766.c index 6101fd678..7d806e10d 100644 --- a/src/driver/drv_cse7766.c +++ b/src/driver/drv_cse7766.c @@ -16,7 +16,7 @@ static float CSE7766_IREF = 251210; static int raw_unscaled_voltage; static int raw_unscaled_current; static int raw_unscaled_power; -static int raw_unscaled_freq; +//static int raw_unscaled_freq; #define CSE7766_BAUD_RATE 4800 @@ -87,7 +87,7 @@ int CSE7766_TryToGetNextCSE7766Packet() { { unsigned char adjustement; - long power_cycle_first = 0; + //long power_cycle_first = 0; long cf_pulses = 0; diff --git a/src/driver/drv_sm2135.c b/src/driver/drv_sm2135.c index 1ae90e4d8..795e51cca 100644 --- a/src/driver/drv_sm2135.c +++ b/src/driver/drv_sm2135.c @@ -8,6 +8,7 @@ #include "drv_local.h" #include "drv_uart.h" #include "../httpserver/new_http.h" +#include "../hal/hal_pins.h" #include "drv_sm2135.h" @@ -86,7 +87,7 @@ void SM2135_Write(byte *rgbcw) { SM2135_Stop(); } -static int SM2135_RGBCW(const void *context, const char *cmd, const char *args){ +static int SM2135_RGBCW(const void *context, const char *cmd, const char *args, int flags){ const char *c = args; byte col[5] = { 0, 0, 0, 0, 0 }; int ci; @@ -131,7 +132,7 @@ static int SM2135_RGBCW(const void *context, const char *cmd, const char *args){ // This is the order used on my polish Spectrum WOJ14415 bulb: // SM2135_Map 2 1 0 4 3 -static int SM2135_Map(const void *context, const char *cmd, const char *args){ +static int SM2135_Map(const void *context, const char *cmd, const char *args, int flags){ Tokenizer_TokenizeString(args); diff --git a/src/driver/drv_tasmotaDeviceGroups.c b/src/driver/drv_tasmotaDeviceGroups.c index 4f9451867..e571fb0ce 100644 --- a/src/driver/drv_tasmotaDeviceGroups.c +++ b/src/driver/drv_tasmotaDeviceGroups.c @@ -63,7 +63,7 @@ void DRV_DGR_CreateSocket_Send() { } -void DRV_DGR_Send_Generic(char *message, int len) { +void DRV_DGR_Send_Generic(byte *message, int len) { struct sockaddr_in addr; int nbytes; @@ -78,7 +78,7 @@ void DRV_DGR_Send_Generic(char *message, int len) { nbytes = sendto( g_dgr_socket_send, - message, + (const char*) message, len, 0, (struct sockaddr*) &addr, @@ -87,7 +87,7 @@ void DRV_DGR_Send_Generic(char *message, int len) { } void DRV_DGR_Send_Power(const char *groupName, int channelValues, int numChannels){ int len; - char message[64]; + byte message[64]; len = DGR_Quick_FormatPowerState(message,sizeof(message),groupName,g_dgr_send_seq, 0,channelValues, numChannels); @@ -95,7 +95,7 @@ void DRV_DGR_Send_Power(const char *groupName, int channelValues, int numChannel } void DRV_DGR_Send_Brightness(const char *groupName, byte brightness){ int len; - char message[64]; + byte message[64]; len = DGR_Quick_FormatBrightness(message,sizeof(message),groupName,g_dgr_send_seq, 0, brightness); @@ -298,7 +298,7 @@ void DRV_DGR_RunFrame() { } // now just enter a read-print loop // - int addrlen = sizeof(addr); + socklen_t addrlen = sizeof(addr); int nbytes = recvfrom( g_dgr_socket_receive, msgbuf, diff --git a/src/hal/bk7231/hal_adc_bk7231.c b/src/hal/bk7231/hal_adc_bk7231.c index 8ee87e05f..2d9ccfac2 100644 --- a/src/hal/bk7231/hal_adc_bk7231.c +++ b/src/hal/bk7231/hal_adc_bk7231.c @@ -8,6 +8,7 @@ #include #include #include "../../logging/logging.h" +#include "../../new_common.h" #include #include @@ -25,7 +26,6 @@ static int adcToGpio[] = { }; static int c_adcToGpio = sizeof(adcToGpio)/sizeof(adcToGpio[0]); -static uint16_t adcData[1]; static uint8_t gpioToAdc(int gpio) { uint8_t i; diff --git a/src/httpserver/http_fns.c b/src/httpserver/http_fns.c index 485334b18..6d703b8ff 100644 --- a/src/httpserver/http_fns.c +++ b/src/httpserver/http_fns.c @@ -1519,7 +1519,7 @@ const char *g_obk_flagNames[] = { "[MQTT] Broadcast self state every minute (May cause device disconnect's, DONT USE IT YET)", "[LED][Debug] Show raw PWM controller on WWW index instead of new LED RGB/CW/etc picker", "[LED] Force show RGBCW controller (for example, for SM2135 LEDs, or for DGR sender)", - "error", + "[CMD] Enable TCP console command server (for Putty, etc)", "error", "error", "error", diff --git a/src/logging/logging.c b/src/logging/logging.c index e4df773b3..305baf695 100644 --- a/src/logging/logging.c +++ b/src/logging/logging.c @@ -74,6 +74,11 @@ char *logfeaturenames[] = { int direct_serial_log = DEFAULT_DIRECT_SERIAL_LOG; +static int g_extraSocketToSendLOG = 0; + +void LOG_SetRawSocketCallback(int newFD) { + g_extraSocketToSendLOG = newFD; +} #ifdef WINDOWS @@ -102,10 +107,11 @@ void addLogAdv(int level, int feature, char *fmt, ...){ #else // from WINDOWS -static SemaphoreHandle_t g_mutex = 0; #ifdef DEBUG_USE_SIMPLE_LOGGER +static SemaphoreHandle_t g_mutex = 0; + void addLogAdv(int level, int feature, char *fmt, ...){ va_list argList; BaseType_t taken; @@ -137,6 +143,9 @@ void addLogAdv(int level, int feature, char *fmt, ...){ bk_printf(tmp); bk_printf("\r\n"); + if(g_extraSocketToSendLOG) { + send(g_extraSocketToSendLOG,tmp,strlen(tmp),0); + } xSemaphoreGive( g_mutex ); if (log_delay){ @@ -235,6 +244,9 @@ void addLogAdv(int level, int feature, char *fmt, ...){ //#if PLATFORM_BL602 // printf(tmp); //#endif + if(g_extraSocketToSendLOG) { + send(g_extraSocketToSendLOG,tmp,strlen(tmp),0); + } if (direct_serial_log){ bk_printf(tmp); diff --git a/src/logging/logging.h b/src/logging/logging.h index 16e16a827..fda30e7a8 100644 --- a/src/logging/logging.h +++ b/src/logging/logging.h @@ -15,7 +15,7 @@ #define _OBK_LOGGING_H void addLogAdv(int level, int feature, char *fmt, ...); - +void LOG_SetRawSocketCallback(int newFD); int log_command(const void *context, const char *cmd, const char *args, int cmdFlags); #define ADDLOG_ERROR(x, fmt, ...) addLogAdv(LOG_ERROR, x, fmt, ##__VA_ARGS__) diff --git a/src/mqtt/new_mqtt.c b/src/mqtt/new_mqtt.c index 3bb6b74af..1b03fd964 100644 --- a/src/mqtt/new_mqtt.c +++ b/src/mqtt/new_mqtt.c @@ -409,7 +409,7 @@ static OBK_Publish_Result MQTT_PublishMain(mqtt_client_t *client, const char *sC MQTT_Mutex_Free(); return OBK_PUBLISH_OK; } -void MQTT_OBK_Printf(const char *s) { +void MQTT_OBK_Printf( char *s) { addLogAdv(LOG_INFO,LOG_FEATURE_MQTT,s); } diff --git a/src/new_cfg.c b/src/new_cfg.c index fc17fa324..60e52df44 100644 --- a/src/new_cfg.c +++ b/src/new_cfg.c @@ -375,6 +375,10 @@ void CFG_SetFlag(int flag, bool bValue) { if(nf != g_cfg.genericFlags) { g_cfg.genericFlags = nf; g_cfg_pendingChanges++; + // this will start only if it wasnt running + if(bValue && flag == OBK_FLAG_CMD_ENABLETCPRAWPUTTYSERVER) { + CMD_StartTCPCommandLine(); + } } } int CFG_GetFlags() { diff --git a/src/new_common.c b/src/new_common.c index 2392677a7..d65d99b52 100644 --- a/src/new_common.c +++ b/src/new_common.c @@ -25,7 +25,7 @@ int strIsInteger(const char *s) { if(*s == 0) return 0; while(*s) { - if(isdigit(*s)==false) + if(isdigit((unsigned char)*s)==false) return 0; s++; } diff --git a/src/new_pins.h b/src/new_pins.h index 6cf7ae86c..d60d2d168 100644 --- a/src/new_pins.h +++ b/src/new_pins.h @@ -90,8 +90,9 @@ typedef struct pinsState_s { #define OBK_FLAG_MQTT_BROADCASTSELFSTATEPERMINUTE 2 #define OBK_FLAG_LED_RAWCHANNELSMODE 3 #define OBK_FLAG_LED_FORCESHOWRGBCWCONTROLLER 4 +#define OBK_FLAG_CMD_ENABLETCPRAWPUTTYSERVER 5 -#define OBK_TOTAL_FLAGS 5 +#define OBK_TOTAL_FLAGS 6 // // Main config structure (less than 2KB) diff --git a/src/user_main.c b/src/user_main.c index df87a34a3..4b8558bc5 100644 --- a/src/user_main.c +++ b/src/user_main.c @@ -178,7 +178,6 @@ void Main_OnEverySecond() { int bMQTTconnected; const char *safe; - int val; // run_adc_test(); bMQTTconnected = MQTT_RunEverySecondUpdate(); diff --git a/windowsTest_msvc2008.vcproj b/windowsTest_msvc2008.vcproj index 6f6e7552d..35d7b86bb 100644 --- a/windowsTest_msvc2008.vcproj +++ b/windowsTest_msvc2008.vcproj @@ -815,6 +815,10 @@ RelativePath=".\src\cmnds\cmd_tasmota.c" > + +