diff -r 9d5036e86c3d -r 18583d13f0fa targets/plc_debug.c --- 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; }