Serial Interface for GUI.
serial_gui_if.cpp
- Committer:
- daniel_gs_jeong
- Date:
- 2018-12-27
- Revision:
- 0:9eb0a8cff892
File content as of revision 0:9eb0a8cff892:
#include "mbed.h" #include "max32630fthr.h" #include "USBSerial.h" #include <string> #include <sstream> #include <iostream> #include <stdarg.h> #include "serial_gui_if.h" struct FUNCTION_TABLE{ char func_name[128]; int size_fname; int id; int argc; int arg_min[8]; int arg_max[8]; }func_table[128]; //<mbed>command arg1 arg2 arg3 .... <end> SERIAL_GUI_INTERFACE::SERIAL_GUI_INTERFACE(Serial *_serial) : serial(_serial) { memset(argv, NULL, sizeof(argv)); } SERIAL_GUI_INTERFACE::~SERIAL_GUI_INTERFACE() { delete serial; } int SERIAL_GUI_INTERFACE::set_function_info(char *_fname, int _arg, ...) //int SERIAL_GUI_INTERFACE::set_function_info( // char * _fname, // int _size_fname, // int _id, // int _argc // ) { int icnt, iarg; va_list ap; va_start(ap, _arg); for(icnt = 0; icnt < 128; icnt++) { if(func_table[icnt].id == 0 ) { strcpy(func_table[icnt].func_name, _fname); func_table[icnt].size_fname = _arg; func_table[icnt].id = va_arg(ap, int); func_table[icnt].argc = va_arg(ap, int); for(iarg= 0; iarg < func_table[icnt].argc; iarg++) { func_table[icnt].arg_min[iarg] = va_arg(ap, int); func_table[icnt].arg_max[iarg] = va_arg(ap, int); } va_end(ap); return func_table[icnt].id; } } va_end(ap); return -1; } int SERIAL_GUI_INTERFACE::get_serial_cmd_wo_head() { int ipos = 0; char tail = '\n'; char recvStr[128]; char seps[] = "\n\t;(,) "; memset(recvStr, NULL, sizeof(recvStr)); memset(argv, NULL, sizeof(argv)); //Waiting function while((recvStr[ipos] = serial->getc()) != tail){ //serial->printf("check_serial_cmd\n"); if(++ipos >= sizeof(recvStr)){ serial->printf("Recv Buffer Size Error\n"); return -1; } } ipos = 0; argv[ipos] = strtok( &recvStr[0], seps ); while( argv[ipos] != NULL ) { //serial->printf("arg[%d] = %s \n",ipos, argv[ipos]); argv[++ipos] = strtok( NULL, seps ); } for(ipos = 0; ipos < 128; ipos++) { if(strncmp(argv[0], func_table[ipos].func_name, func_table[ipos].size_fname) == 0) { //serial->printf("found %s arg[%d] @ %d sizefname %d\n",argv[0], ipos, func_table[ipos].id, func_table[ipos].size_fname); return func_table[ipos].id; } } return -1; } int SERIAL_GUI_INTERFACE::get_serial_cmd() { int rval = 0; char recvStr[6], ihead = 0; char *head = "<mbed>"; char tail = '\n'; memset(recvStr, NULL, sizeof(recvStr)); //Waiting Headers while(1){ //serial->printf("check_serial\n"); if((recvStr[ihead] = serial->getc())== tail) { ihead = 0; continue; } if(++ihead == sizeof(recvStr)){ if(strncmp(head,recvStr,sizeof(recvStr)) == 0){ //serial->printf("!! find Head %s \n", recvStr); rval = get_serial_cmd_wo_head(); break; } ihead = 0; } } serial->printf("id %d \n", rval); return rval; } void SERIAL_GUI_INTERFACE::req_function_info(void) { int icnt, iarg; serial->printf("func name_size id argc arg(min, max)\n"); for(icnt = 0; icnt < 128; icnt++) { if(func_table[icnt].id <1) return; serial->printf("%s %d 0x%x %d ", func_table[icnt].func_name, func_table[icnt].size_fname, func_table[icnt].id, func_table[icnt].argc ); for(iarg = 0; iarg < func_table[icnt].argc; iarg++) { serial->printf(" 0x%x 0x%x", func_table[icnt].arg_min[iarg], func_table[icnt].arg_max[iarg] ); } serial->printf("\n"); } return; } int SERIAL_GUI_INTERFACE::get_argi(int _n) { unsigned int hex_value = std::strtoul(argv[_n], 0, 16); return 0; } char* SERIAL_GUI_INTERFACE::get_arg(int _n) { return argv[_n]; } void SERIAL_GUI_INTERFACE::send_reg_value(int _reg, int _data) { serial->printf("0x%x = 0x%x", _reg, _data); }