void explore_list(struct list_t *list, int (*data_process)(void *)) { struct list_entry_t *cur; cur = list->head.next; while (cur != &(list->tail)) { data_process(cur->data); cur = cur->next; } }
/** * @brief Main routine for MSC class application * @param None * @retval int */ int main(void) { NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0xC000);//初始化启动项 gpio_init();//初始化所有定义的gpio寄存器 cpu_run(); flash_stop(); // rs485_recv();//使能485接受数据 FLASH_ON(); remote_init(); LOOP_ON();//使能环流 // uart_init(9600);//设置波特率为9600 串口初始化 delay_ms(1);//定时器 SPI_Flash_Init();//初始化spi flash外围驱动 get_cfg_from_flash();//得到配置信息 (获取cfg文件的配置) get_line_from_flash(); message_state |= MESSAGE_LINE_NEW; message_state |= MESSAGE_LEFT_NEW; message_state |= MESSAGE_RIGHT_NEW; message_state |= MESSAGE_BRAKE_NEW; alloc_memory(); //初始化缓存 wwdg_init(0x7F, 0x5F, WWDG_Prescaler_8); //计数器值为7f,窗口寄存器为5f,分频数为8 (使用窗口看门狗的原因是他可以被中断) while (1) { if(uart_get_flag) { uart_get_flag = 0; data_process(); LED_OK = 1; } get_disp_state(); //左转右转还有刹车的判断报站; if(bflag) { LED_DispString(1, 1, disp_buff); //固定显示 } else { LED_ScrollDispHZ(1, 1, disp_buff);//滚动显示 } } }
int8_t module_data_handler(void* data) { uint8_t urc = 0; struct module_buf* module_data = (struct module_buf*)data; printf("module response:%s\n", module_data->buf); show_package(module_data->buf, module_data->length); if(module_data->length < 3) { printf("module response not enough length!"); if(module_data != NULL) { if(module_data->buf != NULL) { free(module_data->buf); module_data->buf = NULL; } free(module_data); module_data = NULL; } return -1; } if(MODULE_START == s_module_status) { if((strstr(module_data->buf, "OK"))) { printf("the \"at\" cmd response \"OK\"\n"); s_module_status = MODULE_SYNC; } } if (MODULE_INIT ==s_module_status|| MODULE_INIT_DONE == s_module_status) { int i = 0; if (NULL != s_current_at_command) { for (i = 0; i <sizeof(atCmdTable)/sizeof(atCmdTable[0]); i++) { if(!strcmp(s_current_at_command->at_name, atCmdTable[i].name)) { s_at_status =atCmdTable[i].at_cmd_handle(&urc, module_data->buf); if (ATC_RSP_FINISH ==s_at_status) { myfree(s_current_at_command); s_current_at_command = NULL; } break; } } } else { if(data_process(module_data) == 1) { printf("%s\n", __func__); show_package(module_data->buf, module_data->length); if(tcp_recv_cb != NULL) { tcp_recv_cb(0, module_data->buf, module_data->length); } } else { printf("the data is urc\n"); } } } if(module_data != NULL) { if(module_data->buf != NULL) { free(module_data->buf); module_data->buf = NULL; } free(module_data); module_data = NULL; } return 0; }
int a2_handle_data( struct annotate_two *a2, struct state_machine *sm, const char *data, const size_t size, char *gui_data, size_t *gui_size, struct tgdb_list *command_list){ int i, counter = 0; /* track state to find next file and line number */ for(i = 0; i < size; ++i){ switch(data[i]){ /* Ignore all car returns outputted by gdb */ case '\r': break; case '\n': switch(sm->tgdb_state){ case DATA: sm->tgdb_state = NEW_LINE; break; case NEW_LINE: sm->tgdb_state = NEW_LINE; data_process(a2, '\n', gui_data, &counter, command_list); break; case CONTROL_Z: sm->tgdb_state = DATA; data_process(a2, '\n', gui_data, &counter, command_list); data_process(a2, '\032', gui_data, &counter, command_list); break; case ANNOTATION: /* Found an annotation */ sm->tgdb_state = NL_DATA; tgdb_parse_annotation(a2, ibuf_get ( sm->tgdb_buffer ), ibuf_length ( sm->tgdb_buffer ), command_list); ibuf_clear ( sm->tgdb_buffer ); break; case NL_DATA: sm->tgdb_state = NEW_LINE; break; default: logger_write_pos ( logger, __FILE__, __LINE__, "Bad state transition"); break; } /* end switch */ break; case '\032': switch(sm->tgdb_state){ case DATA: sm->tgdb_state = DATA; data_process(a2, '\032', gui_data, &counter, command_list); break; case NEW_LINE: sm->tgdb_state = CONTROL_Z; break; case NL_DATA: sm->tgdb_state = CONTROL_Z; break; case CONTROL_Z: sm->tgdb_state = ANNOTATION; break; case ANNOTATION: ibuf_addchar ( sm->tgdb_buffer, data[i] ); break; default: logger_write_pos ( logger, __FILE__, __LINE__, "Bad state transition"); break; } /* end switch */ break; default: switch(sm->tgdb_state){ case DATA: data_process(a2, data[i], gui_data, &counter, command_list); break; case NL_DATA: sm->tgdb_state = DATA; data_process(a2, data[i], gui_data, &counter, command_list); break; case NEW_LINE: sm->tgdb_state = DATA; data_process(a2, '\n', gui_data, &counter, command_list); data_process(a2, data[i], gui_data, &counter, command_list); break; case CONTROL_Z: sm->tgdb_state = DATA; data_process(a2, '\n', gui_data, &counter, command_list); data_process(a2, '\032', gui_data, &counter, command_list); data_process(a2, data[i], gui_data, &counter, command_list); break; case ANNOTATION: ibuf_addchar ( sm->tgdb_buffer, data[i] ); break; default: logger_write_pos ( logger, __FILE__, __LINE__, "Bad state transition"); break; } /* end switch */ break; } /* end switch */ } /* end for */ gui_data[counter] = '\0'; *gui_size = counter; return 0; }