#obj-y += malloc.o\r
obj-$(USE_RAMLOG) += ramlog.o\r
\r
+#TCF\r
+obj-$(USE_TCF) += tcf.o\r
+obj-$(USE_TCF) += Tcf_Cfg.o\r
+obj-$(USE_TCF) += sys_monitor.o\r
+obj-$(USE_TCF) += streams.o\r
+inc-$(USE_TCF) += $(ROOTDIR)/common/tcf\r
+vpath-$(USE_TCF) += $(ROOTDIR)/common/tcf\r
+\r
+\r
# If we have configured console output we include printf. \r
# Overridden to use lib implementation with CFG_NEWLIB_PRINTF\r
ifneq ($(CFG_NEWLIB_PRINTF),y)\r
# System + Communication + Diagnostic\r
MOD_AVAIL+=CANIF CANTP COM DCM DEM DET ECUM IOHWAB KERNEL PDUR WDGM\r
# Additional\r
-MOD_AVAIL+=COMMON NEWLIB RAMLOG \r
+MOD_AVAIL+=COMMON NEWLIB RAMLOG TCF LWIP\r
\r
#\r
# Extra defines \r
/** Allow Pin mode changes during runtime (not avail on this CPU) */\r
#define PORT_SET_PIN_MODE_API STD_ON\r
\r
-/** @req PORT124 */\r
-typedef uint8 Port_PinModeType;\r
-\r
/** HW specific symbolic names of pins */\r
/** @req PORT013 */\r
typedef enum{\r
*/\r
int Arc_MBoxPost( Arc_MBoxType *mPtr, void *msg ) {\r
int rv;\r
- rv = CirqBuffDynPush(mPtr->cirqPtr,msg);\r
+ rv = CirqBuffPush(mPtr->cirqPtr,msg);\r
if( rv != 0) {\r
return 1;\r
}\r
int Arc_MBoxFetch(Arc_MBoxType *mPtr, void *msg)\r
{\r
int rv;\r
- rv = CirqBuffDynPop(mPtr->cirqPtr,msg);\r
+ rv = CirqBuffPop(mPtr->cirqPtr,msg);\r
if(rv != 0) {\r
return 1;\r
}\r
#include "core_cm3.h"\r
#endif\r
\r
+#ifdef USE_TTY_TCF_STREAMS\r
+#include "streams.h"\r
+#endif\r
+\r
\r
#if defined(CFG_ARM)\r
#define open _open\r
}\r
#endif\r
\r
+#ifdef USE_TTY_TCF_STREAMS\r
+ char *buf = (char *)_buf;\r
+ for (int i = 0; i < nbytes; i++) {\r
+ TCF_TTY_SendChar(*(buf + i));\r
+ }\r
+#endif\r
+\r
#if defined(USE_RAMLOG)\r
{\r
char *buf = (char *)_buf;\r
--- /dev/null
+/*\r
+ * tcf_cfg.c\r
+ *\r
+ * Created on: 15 sep 2010\r
+ * Author: jcar\r
+ */\r
+#include "Tcf_Cfg.h"\r
+\r
+//Service includes\r
+#include "sys_monitor.h"\r
+#include "streams.h"\r
+\r
+const char locator_hello[] = "E\0Locator\0Hello\0[\"Locator\",\"SysMonitor\",\"AsciiStreams\",\"FileSystem\"]\0\x03\x01";\r
+\r
+const TCF_Service_Info tcfServiceCfgList[] = {\r
+ {"Locator", handle_LocatorCommand, handle_LocatorEvent},\r
+ {"FileSystem", handle_FileSystemCommand, handle_FileSystemEvent},\r
+ {"SysMonitor", handle_SysMonCommand, handle_SysMonEvent},\r
+ {"AsciiStreams", handle_StreamsCommand, handle_StreamsEvent},\r
+ {"NULL", NULL},\r
+};\r
--- /dev/null
+/*\r
+ * Tcf_Cfg.h\r
+ *\r
+ * Created on: 15 sep 2010\r
+ * Author: jcar\r
+ */\r
+\r
+#ifndef TCF_CFG_H_\r
+#define TCF_CFG_H_\r
+\r
+#include "tcf.h"\r
+\r
+typedef struct {\r
+ char name[16];\r
+ TCF_Service_CommandHandler commandHandler;\r
+ TCF_Service_EventHandler eventHandler;\r
+} TCF_Service_Info;\r
+\r
+extern const TCF_Service_Info tcfServiceCfgList[];\r
+\r
+extern const char locator_hello[];\r
+\r
+#endif /* TCF_CFG_H_ */\r
--- /dev/null
+/*\r
+ * streams.c\r
+ *\r
+ * Created on: 15 sep 2010\r
+ * Author: jcar\r
+ */\r
+\r
+#include "Std_Types.h"\r
+#include "streams.h"\r
+#include "tcf.h"\r
+#include <string.h>\r
+#include "internal.h"\r
+#include "xtoa.h"\r
+#include "cirq_buffer.h"\r
+\r
+const char Streams_PID[] = "\"PID\":";\r
+const char Streams_Read[] = "read";\r
+const char Streams_Write[] = "write";\r
+const char Streams_Subscribe[] = "subcribe";\r
+const char Streams_Unsubscribe[] = "unsubscribe";\r
+const char Streams_Connect[] = "connect";\r
+const char Streams_Disconnect[] = "disconnect";\r
+const char Streams_EndofStream[] = "eos";\r
+\r
+const char Streams_LostSize[] = "\"lost size\":";\r
+const char Streams_EOS[] = "\"EOS\":";\r
+const char Streams_true[] = "true";\r
+const char Streams_false[] = "false";\r
+\r
+typedef struct {\r
+ char* id;\r
+ char* size;\r
+ char* data;\r
+} TCF_Streams_Command;\r
+\r
+#define TCF_TTY_SIZE 200\r
+\r
+static boolean tty_initialized = FALSE;\r
+static CirqBufferType cirqBuf;\r
+static char tty_buffer[TCF_TTY_SIZE] = "";\r
+\r
+void init_streams()\r
+{\r
+ cirqBuf = CirqBuffStatCreate(tty_buffer, TCF_TTY_SIZE, sizeof(char));\r
+ tty_initialized = TRUE;\r
+}\r
+\r
+uint8_t TCF_TTY_SendChar (uint8_t ch)\r
+{\r
+ int rv = 1;\r
+ if(tty_initialized == TRUE){\r
+ rv = CirqBuffPush(&cirqBuf,&ch);\r
+ }\r
+\r
+ return rv;\r
+}\r
+uint32_t TCF_TTY_ReadString(char *str, uint16_t max_len)\r
+{\r
+ char ch;\r
+ int rv;\r
+ int len = 0;\r
+ if(tty_initialized == TRUE){\r
+ do{\r
+ rv = CirqBuffPop(&cirqBuf,&ch);\r
+ if(rv==0){\r
+ len++;\r
+ *str++=ch;\r
+ }\r
+ }while((rv == 0) && (len < max_len));\r
+ }\r
+\r
+ return len;\r
+}\r
+\r
+\r
+uint16_t handle_StreamsEvent(TCF_Event* event, char* buf){\r
+ return 0;\r
+}\r
+\r
+static Std_ReturnType parse_read(char* msg, TCF_Streams_Command* command, uint16_t len){\r
+ char* curr = msg;\r
+\r
+ curr = get_next_tcf_field(curr, len);\r
+ if (curr == NULL) return E_NOT_OK;\r
+ command->id = curr;\r
+\r
+ curr = get_next_tcf_field(curr, len);\r
+ if (curr == NULL) return E_NOT_OK;\r
+ command->size = curr;\r
+\r
+ return E_OK;\r
+}\r
+\r
+static Std_ReturnType parse_write(char* msg, TCF_Streams_Command* command, uint16_t len){\r
+ char* curr = msg;\r
+\r
+ curr = get_next_tcf_field(curr, len);\r
+ if (curr == NULL) return E_NOT_OK;\r
+ command->id = curr;\r
+\r
+ curr = get_next_tcf_field(curr, len);\r
+ if (curr == NULL) return E_NOT_OK;\r
+ command->size = curr;\r
+\r
+ curr = get_next_tcf_field(curr, len);\r
+ if (curr == NULL) return E_NOT_OK;\r
+ command->data = curr;\r
+\r
+ return E_OK;\r
+}\r
+\r
+static Std_ReturnType parse_id(char* msg, TCF_Streams_Command* command, uint16_t len){\r
+ char* curr = msg;\r
+\r
+ curr = get_next_tcf_field(curr, len);\r
+ if (curr == NULL) return E_NOT_OK;\r
+ command->id = curr;\r
+\r
+ return E_OK;\r
+}\r
+\r
+uint16_t handle_StreamsCommand(TCF_Command* command, char* buf) {\r
+ char tmp[50] = "";\r
+ TCF_Streams_Command streams_cmd;\r
+\r
+ /* Start building return message */\r
+ start_tcf_field(buf, (char *)TCF_S_R); /* Start */\r
+ append_tcf_field(buf, command->token); /* Token */\r
+\r
+ if (strcmp(command->commandName, Streams_Read) == 0) {\r
+ /* C \95 <token> \95 Streams \95 read \95 <string: stream ID> \95 <int: size> \95 */\r
+ /* R \95 <token> \95 <string: data> \95 <error report> \95 <int: lost size> \95 <boolean: EOS> */\r
+ if(parse_read(command->arguments,&streams_cmd,command->args_len) != E_OK){\r
+ return 0;\r
+ }\r
+\r
+ /* Add data field */\r
+ strcat(buf, JSON_Stringify);\r
+ int len = TCF_TTY_ReadString(tmp, 49);\r
+ tmp[len] = '\0'; /* Terminate to be sure */\r
+ strcat(buf, tmp);\r
+ strcat(buf, JSON_Stringify);\r
+ strcat(buf, TCF_S_EOFIELD_MARKER);\r
+\r
+ /* Add error field */\r
+ strcat(buf, JSON_null);\r
+ strcat(buf, TCF_S_EOFIELD_MARKER);\r
+\r
+ //strcat(buf, Streams_LostSize);\r
+ ultoa(0,tmp,10);\r
+ strcat(buf,tmp);\r
+ strcat(buf, TCF_S_EOFIELD_MARKER);\r
+\r
+ //strcat(buf, Streams_EOS);\r
+ strcat(buf, Streams_false);\r
+ strcat(buf, TCF_S_EOFIELD_MARKER);\r
+ } else if (strcmp(command->commandName, Streams_Write) == 0) {\r
+ /* C \95 <token> \95 Streams \95 write \95 <string: stream ID> \95 <int: size> \95 <string: data> \95 */\r
+ /* R \95 <token> \95 <error report> */\r
+ if(parse_write(command->arguments,&streams_cmd,command->args_len) != E_OK){\r
+ return 0;\r
+ }\r
+\r
+ /* Add error field */\r
+ strcat(buf, JSON_null);\r
+ strcat(buf, TCF_S_EOFIELD_MARKER);\r
+ } else if (strcmp(command->commandName, Streams_Subscribe) == 0) {\r
+ /* R \95 <token> \95 <error report> */\r
+ if(parse_id(command->arguments,&streams_cmd,command->args_len) != E_OK){\r
+ return 0;\r
+ }\r
+ /* Add error field */\r
+ strcat(buf, JSON_null);\r
+ strcat(buf, TCF_S_EOFIELD_MARKER);\r
+ }else if (strcmp(command->commandName, Streams_Unsubscribe) == 0) {\r
+ /* R \95 <token> \95 <error report> */\r
+ if(parse_id(command->arguments,&streams_cmd,command->args_len) != E_OK){\r
+ return 0;\r
+ }\r
+ /* Add error field */\r
+ strcat(buf, JSON_null);\r
+ strcat(buf, TCF_S_EOFIELD_MARKER);\r
+ }else if (strcmp(command->commandName, Streams_Connect) == 0) {\r
+ /* R \95 <token> \95 <error report> */\r
+ if(parse_id(command->arguments,&streams_cmd,command->args_len) != E_OK){\r
+ return 0;\r
+ }\r
+ /* Add error field */\r
+ strcat(buf, JSON_null);\r
+ strcat(buf, TCF_S_EOFIELD_MARKER);\r
+ }else if (strcmp(command->commandName, Streams_Disconnect) == 0) {\r
+ /* R \95 <token> \95 <error report> */\r
+ if(parse_id(command->arguments,&streams_cmd,command->args_len) != E_OK){\r
+ return 0;\r
+ }\r
+ /* Add error field */\r
+ strcat(buf, JSON_null);\r
+ strcat(buf, TCF_S_EOFIELD_MARKER);\r
+ }\r
+\r
+ convert_to_tcf_message(buf);\r
+ uint16_t len = message_length(buf, TCF_MAX_FIELD_LENGTH);\r
+\r
+ return len;\r
+}\r
--- /dev/null
+/*\r
+ * streams.h\r
+ *\r
+ * Created on: 15 sep 2010\r
+ * Author: jcar\r
+ */\r
+\r
+#ifndef STREAMS_H_\r
+#define STREAMS_H_\r
+\r
+#include "Std_Types.h"\r
+#include "tcf.h"\r
+\r
+uint8_t TCF_TTY_SendChar (uint8_t ch);\r
+void init_streams();\r
+\r
+uint16_t handle_StreamsCommand(TCF_Command* command, char* buf);\r
+uint16_t handle_StreamsEvent(TCF_Event* event, char* buf);\r
+\r
+#endif /* STREAMS_H_ */\r
--- /dev/null
+/*\r
+ * sys_monitor.c\r
+ *\r
+ * Created on: 15 sep 2010\r
+ * Author: jcar\r
+ */\r
+\r
+#include "Std_Types.h"\r
+#include "sys_monitor.h"\r
+#include "tcf.h"\r
+#include <string.h>\r
+#include "internal.h"\r
+#include "xtoa.h"\r
+\r
+const char SysMon_PID[] = "\"PID\":";\r
+const char SysMon_Prio[] = "\"Priority\":";\r
+const char SysMon_Stackstart[] = "\"StackStart\":";\r
+const char SysMon_Stackend[] = "\"StackEnd\":";\r
+const char SysMon_Stackcurr[] = "\"StackCurr\":";\r
+const char SysMon_State[] = "\"State\":";\r
+\r
+static void AddState(char *buf, state_t state)\r
+{\r
+ /* "RSDZTW" where\r
+ R is running,\r
+ S is sleeping in an interruptible wait,\r
+ D is waiting in uninterruptible disk sleep,\r
+ Z is zombie,\r
+ T is traced or stopped (on a signal), and\r
+ W is paging */\r
+ switch(state)\r
+ {\r
+ case ST_READY:\r
+ strcat(buf,"\"D\"");\r
+ break;\r
+ case ST_WAITING:\r
+ strcat(buf,"\"S\"");\r
+ break;\r
+ case ST_SUSPENDED:\r
+ strcat(buf,"\"T\"");\r
+ break;\r
+ case ST_RUNNING:\r
+ strcat(buf,"\"R\"");\r
+ break;\r
+ case ST_NOT_STARTED:\r
+ strcat(buf,"\"T\"");\r
+ break;\r
+ }\r
+}\r
+\r
+uint16_t handle_SysMonEvent(TCF_Event* event, char* buf){\r
+ return 0;\r
+}\r
+\r
+\r
+uint16_t handle_SysMonCommand(TCF_Command* command, char* buf) {\r
+ OsPcbType *iterPcbPtr;\r
+\r
+ /* Start building return message */\r
+ start_tcf_field(buf, (char *)TCF_S_R); /* Start */\r
+ append_tcf_field(buf, command->token); /* Token */\r
+\r
+ if (strcmp(command->commandName, TCF_getChildren) == 0) {\r
+ boolean first = TRUE;\r
+\r
+ /* Add error field */\r
+ strcat(buf, JSON_null);\r
+ strcat(buf, TCF_S_EOFIELD_MARKER);\r
+\r
+ /* Add data field */\r
+ strcat(buf, JSON_ListStart);\r
+ TAILQ_FOREACH(iterPcbPtr,& os_sys.pcb_head,pcb_list) {\r
+ if(iterPcbPtr->proc_type < 4)\r
+ {\r
+ if(first){\r
+ first = FALSE;\r
+ }else{\r
+ strcat(buf, JSON_Separator);\r
+ }\r
+ strcat(buf, JSON_Stringify);\r
+ strcat(buf, iterPcbPtr->name);\r
+ strcat(buf, JSON_Stringify);\r
+ }\r
+ }\r
+ strcat(buf, JSON_ListEnd);\r
+ strcat(buf, TCF_S_EOFIELD_MARKER);\r
+\r
+ } else if (strcmp(command->commandName, TCF_getContext) == 0) {\r
+ char tmp[20] = "";\r
+\r
+ /* Add error field */\r
+ strcat(buf, JSON_null);\r
+ strcat(buf, TCF_S_EOFIELD_MARKER);\r
+\r
+ /* Add data field */\r
+ char *arg = command->arguments + 1; /* add 1 for " */\r
+ TAILQ_FOREACH(iterPcbPtr,& os_sys.pcb_head,pcb_list) {\r
+ if(strncmp(arg, iterPcbPtr->name, strlen(command->arguments)-2) == 0)\r
+ {\r
+ break;\r
+ }\r
+ }\r
+ strcat(buf, JSON_ObjStart);\r
+ strcat(buf, TCF_ID);\r
+ strcat(buf, command->arguments);\r
+\r
+ strcat(buf, JSON_Separator);\r
+ strcat(buf, TCF_File);\r
+ strcat(buf, command->arguments);\r
+\r
+ strcat(buf, JSON_Separator);\r
+ strcat(buf, SysMon_PID);\r
+ ultoa(iterPcbPtr->pid,tmp,10);\r
+ strcat(buf, tmp);\r
+\r
+ strcat(buf, JSON_Separator);\r
+ strcat(buf, SysMon_Prio);\r
+ ultoa(iterPcbPtr->prio,tmp,10);\r
+ strcat(buf, tmp);\r
+\r
+ strcat(buf, JSON_Separator);\r
+ strcat(buf, SysMon_Stackstart);\r
+ ultoa((uint32_t)iterPcbPtr->stack.top,tmp,10);\r
+ strcat(buf, tmp);\r
+\r
+/* strcat(buf, JSON_Separator);\r
+ strcat(buf, SysMon_Stackend);\r
+ ultoa((uint32_t)iterPcbPtr->stack.top + iterPcbPtr->stack.size,tmp,10);\r
+ strcat(buf, tmp);\r
+\r
+ strcat(buf, JSON_Separator);\r
+ strcat(buf, SysMon_Stackcurr);\r
+ ultoa((uint32_t)iterPcbPtr->stack.curr,tmp,10);\r
+ strcat(buf, tmp);\r
+*/\r
+ strcat(buf, JSON_Separator);\r
+ strcat(buf, SysMon_State);\r
+ AddState(buf,iterPcbPtr->state);\r
+\r
+ strcat(buf, JSON_ObjEnd);\r
+ strcat(buf, TCF_S_EOFIELD_MARKER);\r
+ }\r
+\r
+ convert_to_tcf_message(buf);\r
+ uint16_t len = message_length(buf, TCF_MAX_FIELD_LENGTH);\r
+\r
+ return len;\r
+}\r
--- /dev/null
+/*\r
+ * sys_monitor.h\r
+ *\r
+ * Created on: 15 sep 2010\r
+ * Author: jcar\r
+ */\r
+\r
+#ifndef SYSMONITOR_H_\r
+#define SYSMONITOR_H_\r
+\r
+#include "Std_Types.h"\r
+#include "tcf.h"\r
+\r
+uint16_t handle_SysMonCommand(TCF_Command* command, char* buf);\r
+uint16_t handle_SysMonEvent(TCF_Event* event, char* buf);\r
+\r
+#endif /* SYSMONITOR_H_ */\r
--- /dev/null
+/*\r
+ * tcf.c\r
+ *\r
+ * Created on: 15 sep 2010\r
+ * Author: jcar\r
+ */\r
+\r
+#include "Std_Types.h"\r
+#include <string.h>\r
+#ifdef USE_LWIP\r
+#include "lwip/tcp.h"\r
+#include "lwip/udp.h"\r
+#include "tcp_handler.h"\r
+#endif\r
+#include "tcf.h"\r
+#include "Tcf_Cfg.h"\r
+#include "xtoa.h"\r
+#include "streams.h"\r
+\r
+\r
+#define TCF_TCP_PORT 1534\r
+\r
+const char TCF_getChildren[] = "getChildren";\r
+const char TCF_getContext[] = "getContext";\r
+const char TCF_ID[] = "\"ID\":";\r
+const char TCF_File[] = "\"File\":";\r
+const char TCF_Service[] = "\"Service\":";\r
+const char TCF_Code[] = "\"Code\":";\r
+\r
+\r
+const char JSON_ObjStart[] = "{";\r
+const char JSON_ObjEnd[] = "}";\r
+const char JSON_null[] = "null";\r
+const char JSON_Separator[] = ",";\r
+\r
+const char JSON_Stringify[] = "\"";\r
+const char JSON_ListStart[] = "[";\r
+const char JSON_ListEnd[] = "]";\r
+\r
+struct tcf_tcp_state\r
+{\r
+ int num;\r
+};\r
+\r
+uint16_t message_length(const char* msg, uint16_t max_length) {\r
+ uint16_t i;\r
+ for (i = 0; i < max_length; ++i) {\r
+ if (msg[i] == '\x01') {\r
+ return i+1;\r
+ }\r
+ }\r
+ return max_length;\r
+}\r
+\r
+void start_tcf_field(char* start, char* field) {\r
+ strcpy(start, field);\r
+ strcat(start, TCF_S_EOFIELD_MARKER);\r
+}\r
+\r
+void append_tcf_field(char* start, char* field) {\r
+ strcat(start, field);\r
+ strcat(start, TCF_S_EOFIELD_MARKER);\r
+}\r
+\r
+void convert_to_tcf_message(char* start) {\r
+ strcat(start, TCF_S_EOM);\r
+ size_t length = strlen(start);\r
+ int i;\r
+ for (i = 0; i < length; ++i) {\r
+ if (start[i] == TCF_C_EOFIELD_MARKER) {\r
+ start[i] = TCF_C_EOFIELD;\r
+ }\r
+ }\r
+}\r
+\r
+char* get_next_tcf_field(char* chars, uint16_t maxlen) {\r
+ int i;\r
+ for(i = 0; i < maxlen; i++) {\r
+ if (chars[i] == TCF_FIELD_DELIMITER) {\r
+ return &chars[i+1];\r
+ }\r
+ }\r
+ return (char*) NULL;\r
+}\r
+\r
+char* get_next_tcf_msg(char* chars, uint16_t *len) {\r
+ int i;\r
+ for(i = 0; i < *len-1; i++) {\r
+ if (chars[i] == '\x03' && chars[i+1] == '\x01') {\r
+ *len -= (i + 1);\r
+ return &chars[i+2];\r
+ }\r
+ }\r
+ *len= 0;\r
+ return (char*) NULL;\r
+}\r
+\r
+static Std_ReturnType parse_command(char* msg, TCF_Command* command, uint16_t len){\r
+ char* curr = msg;\r
+\r
+ curr = get_next_tcf_field(curr, len);\r
+ if (curr == NULL) return E_NOT_OK;\r
+ command->token = curr;\r
+\r
+ curr = get_next_tcf_field(curr, len);\r
+ if (curr == NULL) return E_NOT_OK;\r
+ command->serviceName = curr;\r
+\r
+ curr = get_next_tcf_field(curr, len);\r
+ if (curr == NULL) return E_NOT_OK;\r
+ command->commandName = curr;\r
+\r
+ curr = get_next_tcf_field(curr, len);\r
+ if (curr == NULL) return E_NOT_OK;\r
+ command->arguments = curr;\r
+\r
+ command->args_len = len -((uint32_t)curr - (uint32_t)msg);\r
+ return E_OK;\r
+}\r
+\r
+Std_ReturnType parse_event(char* msg, TCF_Event* event){\r
+ char* curr = msg;\r
+\r
+ curr = get_next_tcf_field(curr, TCF_MAX_FIELD_LENGTH);\r
+ if (curr == NULL) return E_NOT_OK;\r
+ event->serviceName = curr;\r
+\r
+ curr = get_next_tcf_field(curr, TCF_MAX_FIELD_LENGTH);\r
+ if (curr == NULL) return E_NOT_OK;\r
+ event->eventName = curr;\r
+\r
+ curr = get_next_tcf_field(curr, TCF_MAX_FIELD_LENGTH);\r
+ if (curr == NULL) return E_NOT_OK;\r
+ event->eventData = curr;\r
+\r
+ return E_OK;\r
+}\r
+\r
+uint16_t handle_LocatorCommand(TCF_Command* command, char* buf) {\r
+ return 0;\r
+}\r
+\r
+uint16_t handle_LocatorEvent(TCF_Event* event, char* buf) {\r
+ uint16_t len = message_length(locator_hello, TCF_MAX_FIELD_LENGTH);\r
+ memcpy(buf,locator_hello,len);\r
+ return len;\r
+}\r
+\r
+uint16_t handle_FileSystemCommand(TCF_Command* command, char* buf) {\r
+ char tmp[20] = "";\r
+\r
+ /* Start building return message */\r
+ start_tcf_field(buf, (char *)TCF_S_R); /* Start */\r
+ append_tcf_field(buf, command->token); /* Token */\r
+\r
+ /* Add error field */\r
+ strcat(buf, JSON_ObjStart);\r
+\r
+ strcat(buf, TCF_Code);\r
+ ultoa(TCF_UNSUPPORTED,tmp,10);\r
+ strcat(buf, tmp);\r
+\r
+ strcat(buf, JSON_ObjEnd);\r
+ strcat(buf, TCF_S_EOFIELD_MARKER);\r
+\r
+ /* Add data field */\r
+ strcat(buf, JSON_null);\r
+ strcat(buf, TCF_S_EOFIELD_MARKER);\r
+\r
+ convert_to_tcf_message(buf);\r
+ uint16_t len = message_length(buf, TCF_MAX_FIELD_LENGTH);\r
+\r
+ return len;\r
+}\r
+\r
+uint16_t handle_FileSystemEvent(TCF_Event* event, char* buf) {\r
+ return 0;\r
+}\r
+\r
+/* Not reentrant so buffers can be static */\r
+static char outbuf[TCF_MAX_FIELD_LENGTH] = "";\r
+\r
+static void handle_event(char *buf, uint16_t len)\r
+{\r
+ char *msg = (char *)buf;\r
+ uint8 index;\r
+ uint16_t outlen = 0;\r
+ TCF_Event event;\r
+\r
+ if (parse_event(msg, &event) == E_OK) {\r
+ /* Find and call the requested agent */\r
+ index = 0;\r
+ while(tcfServiceCfgList[index].eventHandler != NULL){\r
+ if(strcmp(event.serviceName, tcfServiceCfgList[index].name) == 0){\r
+ outlen = tcfServiceCfgList[index].eventHandler(&event, outbuf);\r
+ break;\r
+ }\r
+ index++;\r
+ }\r
+ }\r
+\r
+ if(outlen > 0){\r
+#ifdef USE_LWIP\r
+ TcpSendData(outbuf, outlen);\r
+#endif\r
+ }\r
+}\r
+\r
+static void handle_command(char *buf, uint16_t len)\r
+{\r
+ char *msg = (char *)buf;\r
+ uint8 index;\r
+ uint16_t outlen = 0;\r
+ TCF_Command command;\r
+\r
+ if (parse_command(msg, &command, len) == E_OK) {\r
+ /* Find and call the requested agent */\r
+ index = 0;\r
+ while(tcfServiceCfgList[index].commandHandler != NULL){\r
+ if(strcmp(command.serviceName, tcfServiceCfgList[index].name) == 0){\r
+ outlen = tcfServiceCfgList[index].commandHandler(&command, outbuf);\r
+ break;\r
+ }\r
+ index++;\r
+ }\r
+\r
+ if(outlen > 0){\r
+#ifdef USE_LWIP\r
+ TcpSendData(outbuf, outlen);\r
+#endif\r
+ }\r
+ }\r
+}\r
+\r
+static void handle_incoming(const void* buf, uint16_t len) {\r
+ char *msg = (char *)buf;\r
+\r
+ if(len > 0){\r
+ do{\r
+ char c = msg[0];\r
+ if (c == 'C') {\r
+ handle_command(msg, len);\r
+ } else if (c == 'E') {\r
+ handle_event(msg, len);\r
+ }\r
+\r
+ /* Check if more than one message in buffer */\r
+ msg = get_next_tcf_msg(msg, &len);\r
+ }while((msg != NULL) && (len > 0));\r
+ }\r
+}\r
+\r
+void InitTcf(void){\r
+#ifdef USE_LWIP\r
+ CreateTcpSocket(TCF_TCP_PORT, handle_incoming);\r
+#endif\r
+ init_streams();\r
+}\r
--- /dev/null
+/*\r
+ * tcf.h\r
+ *\r
+ * Created on: 15 sep 2010\r
+ * Author: jcar\r
+ */\r
+\r
+#ifndef TCF_H_\r
+#define TCF_H_\r
+\r
+#include "Std_Types.h"\r
+\r
+#define TCF_C_EOFIELD '\x00'\r
+#define TCF_C_EOFIELD_MARKER '\x04'\r
+\r
+#define TCF_S_EOFIELD "\x00"\r
+#define TCF_S_EOFIELD_MARKER "\x04"\r
+#define TCF_S_R "R"\r
+#define TCF_S_EOM "\x03\x01"\r
+\r
+#define TCF_FIELD_DELIMITER ('\x00')\r
+#define TCF_MAX_FIELD_LENGTH (1400)\r
+\r
+extern const char TCF_getChildren[];\r
+extern const char TCF_getContext[];\r
+extern const char TCF_ID[];\r
+extern const char TCF_File[];\r
+extern const char TCF_Service[];\r
+extern const char TCF_Code[];\r
+\r
+extern const char JSON_ObjStart[];\r
+extern const char JSON_ObjEnd[];\r
+extern const char JSON_null[];\r
+extern const char JSON_Separator[];\r
+\r
+extern const char JSON_Stringify[];\r
+extern const char JSON_ListStart[];\r
+extern const char JSON_ListEnd[];\r
+\r
+/* Standard error codes: */\r
+\r
+typedef enum{\r
+ TCF_OTHER = 1,\r
+ TCF_JSON_SYNTAX = 2,\r
+ TCF_PROTOCOL = 3,\r
+ TCF_BUFFER_OVERFLOW = 4,\r
+ TCF_CHANNEL_CLOSED = 5,\r
+ TCF_COMMAND_CANCELLED = 6,\r
+ TCF_UNKNOWN_PEER = 7,\r
+ TCF_BASE64 = 8,\r
+ TCF_EOF = 9,\r
+ TCF_ALREADY_STOPPED = 10,\r
+ TCF_ALREADY_EXITED = 11,\r
+ TCF_ALREADY_RUNNING = 12,\r
+ TCF_ALREADY_ATTACHED = 13,\r
+ TCF_IS_RUNNING = 14,\r
+ TCF_INV_DATA_SIZE = 15,\r
+ TCF_INV_CONTEXT = 16,\r
+ TCF_INV_ADDRESS = 17,\r
+ TCF_INV_EXPRESSION = 18,\r
+ TCF_INV_FORMAT = 19,\r
+ TCF_INV_NUMBER = 20,\r
+ TCF_INV_DWARF = 21,\r
+ TCF_SYM_NOT_FOUND = 22,\r
+ TCF_UNSUPPORTED = 23,\r
+ TCF_INV_DATA_TYPE = 24,\r
+ TCF_INV_COMMAND = 25,\r
+} TCF_ErrorCode_t;\r
+\r
+\r
+typedef struct {\r
+ char* serviceName;\r
+ char* eventName;\r
+ char* eventData;\r
+} TCF_Event;\r
+\r
+typedef struct {\r
+ char* token;\r
+ char* serviceName;\r
+ char* commandName;\r
+ char* arguments;\r
+ uint16_t args_len;\r
+} TCF_Command;\r
+\r
+typedef struct {\r
+ char* token;\r
+ char* error;\r
+ char* data;\r
+} TCF_Result;\r
+\r
+typedef uint16_t (*TCF_Service_CommandHandler)(TCF_Command* command, char* buf);\r
+typedef uint16_t (*TCF_Service_EventHandler)(TCF_Event* command, char* buf);\r
+\r
+void InitTcf(void);\r
+uint16_t message_length(const char* msg, uint16_t max_length);\r
+char* get_next_tcf_field(char* chars, uint16_t maxlen);\r
+void start_tcf_field(char* start, char* field);\r
+void append_tcf_field(char* start, char* field);\r
+void convert_to_tcf_message(char* start);\r
+void tcf_compile_result(TCF_Result* result, char* buffer);\r
+\r
+/* Locator and Filesystem handlers are in tcf.c file. To be moved */\r
+uint16_t handle_LocatorCommand(TCF_Command* command, char* buf);\r
+uint16_t handle_LocatorEvent(TCF_Event* event, char* buf);\r
+uint16_t handle_FileSystemCommand(TCF_Command* command, char* buf);\r
+uint16_t handle_FileSystemEvent(TCF_Event* event, char* buf);\r
+\r
+#endif /* TCF_H_ */\r
typedef struct
{
- CirqBufferDynType *cirqPtr;
+ CirqBufferType *cirqPtr;
} Arc_MBoxType;