]> rtime.felk.cvut.cz Git - arc.git/commitdiff
tcf in own module and fixes for default mahi-1 merge
authorjonte <devnull@localhost>
Wed, 22 Sep 2010 15:38:36 +0000 (17:38 +0200)
committerjonte <devnull@localhost>
Wed, 22 Sep 2010 15:38:36 +0000 (17:38 +0200)
14 files changed:
boards/board_common.mk
boards/stm32_stm3210c/build_config.mk
boards/stm32_stm3210c/config/Port_Cfg.h
common/mbox.c
common/newlib_port.c
common/tcf/Tcf_Cfg.c [new file with mode: 0644]
common/tcf/Tcf_Cfg.h [new file with mode: 0644]
common/tcf/streams.c [new file with mode: 0644]
common/tcf/streams.h [new file with mode: 0644]
common/tcf/sys_monitor.c [new file with mode: 0644]
common/tcf/sys_monitor.h [new file with mode: 0644]
common/tcf/tcf.c [new file with mode: 0644]
common/tcf/tcf.h [new file with mode: 0644]
include/mbox.h

index b56693c015cb597288900811bb47ff2a4d9b79c1..737e88d9ad6c229e296dcb8b021eb1ba3d20dfd3 100644 (file)
@@ -184,6 +184,15 @@ obj-$(USE_COMMON) += arc.o
 #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
index 446523294479876626fe61ec3ea26cadf32c1e04..5f34ed5ad56a11c83ed09e877e4ed5e62fa7a8b4 100644 (file)
@@ -29,7 +29,7 @@ MOD_AVAIL+=ADC CAN DIO MCU FLS PORT PWM
 # 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
index 18a82898fdcb7ced15935a87189632c78e2757cb..dc0684875ec8ca0df58ae1f3fc934c4c46413bea 100644 (file)
@@ -28,9 +28,6 @@
 /** 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
index 3bd0aa1a2462a584b9a51268353007ca6c4aa4e6..28b4737c101c8946a6c7b60b0cb911d3fd709a64 100644 (file)
@@ -57,7 +57,7 @@ void Arc_MBoxDestroy( Arc_MBoxType *mPtr ) {
  */\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
@@ -71,7 +71,7 @@ int Arc_MBoxPost( Arc_MBoxType *mPtr, void *msg ) {
 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
index e8c7dcd5f877270f1a1ebeb684d6bd7d44afb3d2..60a756795ae7e9055fd1de2ef3d49a09175ee8db 100644 (file)
 #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
@@ -236,6 +240,13 @@ int write(  int fd, const void *_buf, size_t nbytes)
                }\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
diff --git a/common/tcf/Tcf_Cfg.c b/common/tcf/Tcf_Cfg.c
new file mode 100644 (file)
index 0000000..09f676b
--- /dev/null
@@ -0,0 +1,21 @@
+/*\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
diff --git a/common/tcf/Tcf_Cfg.h b/common/tcf/Tcf_Cfg.h
new file mode 100644 (file)
index 0000000..c92a712
--- /dev/null
@@ -0,0 +1,23 @@
+/*\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
diff --git a/common/tcf/streams.c b/common/tcf/streams.c
new file mode 100644 (file)
index 0000000..667f508
--- /dev/null
@@ -0,0 +1,205 @@
+/*\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
diff --git a/common/tcf/streams.h b/common/tcf/streams.h
new file mode 100644 (file)
index 0000000..6be0fa1
--- /dev/null
@@ -0,0 +1,20 @@
+/*\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
diff --git a/common/tcf/sys_monitor.c b/common/tcf/sys_monitor.c
new file mode 100644 (file)
index 0000000..6bc5017
--- /dev/null
@@ -0,0 +1,148 @@
+/*\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
diff --git a/common/tcf/sys_monitor.h b/common/tcf/sys_monitor.h
new file mode 100644 (file)
index 0000000..e5388de
--- /dev/null
@@ -0,0 +1,17 @@
+/*\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
diff --git a/common/tcf/tcf.c b/common/tcf/tcf.c
new file mode 100644 (file)
index 0000000..abed811
--- /dev/null
@@ -0,0 +1,258 @@
+/*\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
diff --git a/common/tcf/tcf.h b/common/tcf/tcf.h
new file mode 100644 (file)
index 0000000..f77cbf8
--- /dev/null
@@ -0,0 +1,108 @@
+/*\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
index d4b9e7b461eafb55aab8aa1fa0e3f6b2ce75cf8d..0cd99742a2a07be24802e8f977988cd260f45d27 100644 (file)
@@ -20,7 +20,7 @@
 
 typedef struct
 {
-       CirqBufferDynType *cirqPtr;
+       CirqBufferType *cirqPtr;
 } Arc_MBoxType;