targets/plc_debug.c
changeset 450 18583d13f0fa
parent 423 4d7ac355701d
child 452 2d0718a05cc7
--- a/targets/plc_debug.c	Wed Dec 02 13:07:57 2009 +0100
+++ b/targets/plc_debug.c	Wed Dec 02 20:22:28 2009 +0100
@@ -30,11 +30,6 @@
 /* Buffer's cursor*/
 static char* buffer_cursor = debug_buffer;
 
-typedef struct{
-    void* ptrvalue;
-    __IEC_types_enum type;
-}struct_plcvar;
-
 /***
  * Declare programs 
  **/
@@ -45,15 +40,23 @@
  **/
 %(extern_variables_declarations)s
 
-static int subscription_table[MAX_SUBSCRIBTION];
-static int* latest_subscription = subscription_table;
-static int* subscription_cursor = subscription_table;
+typedef void(*__for_each_variable_do_fp)(void*, __IEC_types_enum);
+__for_each_variable_do(__for_each_variable_do_fp fp)
+{
+%(for_each_variable_do_code)s
+}
 
-struct_plcvar variable_table[%(variables_pointer_type_table_count)d];
+__IEC_types_enum __find_variable(unsigned int varindex, void ** varp)
+{
+    switch(varindex){
+%(find_variable_case_code)s
+    }
+    *varp = NULL;
+    return UNKNOWN_ENUM;
+}
 
 void __init_debug(void)
 {
-%(variables_pointer_type_table_initializer)s
     buffer_state = BUFFER_FREE;
 }
 
@@ -71,6 +74,44 @@
 extern void InitiateDebugTransfer(void);
 
 extern unsigned long __tick;
+
+#define __BufferDebugDataIterator_case_t(TYPENAME) \
+        case TYPENAME##_ENUM :\
+            flags = ((__IEC_##TYPENAME##_t *)varp)->flags;\
+            ptrvalue = &((__IEC_##TYPENAME##_t *)varp)->value;
+
+#define __BufferDebugDataIterator_case_p(TYPENAME)\
+        case TYPENAME##_P_ENUM :\
+            flags = ((__IEC_##TYPENAME##_p *)varp)->flags;\
+            ptrvalue = ((__IEC_##TYPENAME##_p *)varp)->value;
+
+void BufferDebugDataIterator(void* varp, __IEC_types_enum vartype)
+{
+    void *ptrvalue = NULL;
+    char flags = 0;
+    /* find data to copy*/
+    switch(vartype){
+        ANY(__BufferDebugDataIterator_case_t)
+        ANY(__BufferDebugDataIterator_case_p)
+    }
+    if(flags && __IEC_DEBUG_FLAG){
+        USINT size = __get_type_enum_size(vartype);
+        /* compute next cursor positon*/
+        char* next_cursor = buffer_cursor + size;
+        /* if buffer not full */
+        if(next_cursor <= debug_buffer + BUFFER_SIZE)
+        {
+            /* copy data to the buffer */
+            memcpy(buffer_cursor, ptrvalue, size);
+            /* increment cursor according size*/
+            buffer_cursor = next_cursor;
+        }else{
+            /*TODO : signal overflow*/
+        }
+    }
+}
+
+
 void __publish_debug(void)
 {
     /* Check there is no running debugger re-configuration */
@@ -84,38 +125,10 @@
         /* If buffer was free */
         if(latest_state == BUFFER_FREE)
         {
-            int* subscription;
-            
             /* Reset buffer cursor */
             buffer_cursor = debug_buffer;
-            
-            /* iterate over subscriptions */
-            for(subscription=subscription_table;
-                subscription < latest_subscription;
-                subscription++)
-            {
-                /* get variable descriptor */
-                struct_plcvar* my_var = &variable_table[*subscription];
-                char* next_cursor;
-                /* get variable size*/
-                USINT size = __get_type_enum_size(my_var->type);
-                /* compute next cursor positon*/
-                next_cursor = buffer_cursor + size;
-                /* if buffer not full */
-                if(next_cursor <= debug_buffer + BUFFER_SIZE)
-                {
-                    /* copy data to the buffer */
-                    memcpy(buffer_cursor, my_var->ptrvalue, size);
-                    /* increment cursor according size*/
-                    buffer_cursor = next_cursor;
-                }else{
-                    /*TODO : signal overflow*/
-                }
-            }
-    
-            /* Reset buffer cursor again (for IterDebugData)*/
-            buffer_cursor = debug_buffer;
-            subscription_cursor = subscription_table;
+            /* Iterate over all variables to fill debug buffer */
+            __for_each_variable_do(BufferDebugDataIterator);
             
             /* Leave debug section,
              * Trigger asynchronous transmission 
@@ -126,21 +139,41 @@
     }
 }
 
+#define __RegisterDebugVariable_case_t(TYPENAME) \
+        case TYPENAME##_ENUM :\
+            ((__IEC_##TYPENAME##_t *)varp)->flags |= __IEC_DEBUG_FLAG;
+#define __RegisterDebugVariable_case_p(TYPENAME)\
+        case TYPENAME##_P_ENUM :\
+            ((__IEC_##TYPENAME##_p *)varp)->flags |= __IEC_DEBUG_FLAG;
 void RegisterDebugVariable(int idx)
 {
-    /*If subscription table not full */
-    if(latest_subscription - subscription_table < MAX_SUBSCRIBTION)
-    {
-        *(latest_subscription++) = idx;
-        /* TODO pre-calc buffer size and signal overflow*/
-    }else{
-        /*TODO : signal subscription overflow*/
+    void *varp;
+    switch(__find_variable(idx, varp)){
+        ANY(__RegisterDebugVariable_case_t)
+        ANY(__RegisterDebugVariable_case_p)
+    }
+}
+
+#define __ResetDebugVariablesIterator_case_t(TYPENAME) \
+        case TYPENAME##_ENUM :\
+            ((__IEC_##TYPENAME##_t *)varp)->flags &= ~__IEC_DEBUG_FLAG;
+
+#define __ResetDebugVariablesIterator_case_p(TYPENAME)\
+        case TYPENAME##_P_ENUM :\
+            ((__IEC_##TYPENAME##_p *)varp)->flags &= ~__IEC_DEBUG_FLAG;\
+
+void ResetDebugVariablesIterator(void* varp, __IEC_types_enum vartype)
+{
+    /* force debug flag to 0*/
+    switch(vartype){
+        ANY(__ResetDebugVariablesIterator_case_t)
+        ANY(__ResetDebugVariablesIterator_case_p)
     }
 }
 
 void ResetDebugVariables(void)
 {
-    latest_subscription = subscription_table;
+    __for_each_variable_do(ResetDebugVariablesIterator);
 }
 
 void FreeDebugData(void)
@@ -153,29 +186,11 @@
         BUFFER_FREE);
 }
 
-void* IterDebugData(int* idx, const char **type_name)
-{
-	struct_plcvar* my_var;
-	USINT size;
-    if(subscription_cursor < latest_subscription){
-        char* old_cursor = buffer_cursor;
-        *idx = *subscription_cursor;
-        my_var = &variable_table[*(subscription_cursor++)];
-        *type_name = __get_type_enum_name(my_var->type);
-        /* get variable size*/
-        size = __get_type_enum_size(my_var->type);
-        /* compute next cursor position*/
-        buffer_cursor = buffer_cursor + size;
-        if(old_cursor < debug_buffer + BUFFER_SIZE)
-        {
-            return old_cursor;
-        }else{
-            //printf("%%d > %%d\n", old_cursor - debug_buffer, BUFFER_SIZE);
-            return NULL;
-        } 
-    }
-    *idx = -1;
-    *type_name = NULL;
-    return NULL;
+/* Wait until debug data ready and return pointer to it */
+int GetDebugData(unsigned long *tick, unsigned long *size, void **buffer){
+    int res = WaitDebugData(tick);
+    *size = buffer_cursor - debug_buffer;
+    *buffer = NULL;
+    return res;
 }