int sensor_data_proc(int msg, DIALOG *d, int c) { int ret; int reset = FALSE; ret = nostretch_icon_proc(msg, d, c); // call the parent object if (msg == MSG_GOTMOUSE) // if we got mouse, display description sprintf(button_description, "Display current sensor data (RPM, Engine Load, Coolant Temperature, Speed, etc.)"); if (ret == D_CLOSE) // trap the close value { if (comport.status != READY) { reset = TRUE; if (open_comport() != 0) { comport.status = NOT_OPEN; // reset comport status while (comport.status == NOT_OPEN) { if (alert("COM Port could not be opened.", "Please check that port settings are correct", "and that no other application is using it", "&Configure Port", "&Ignore", 'c', 'i') == 1) display_options(); else comport.status = USER_IGNORED; } } else comport.status = READY; } display_sensor_dialog(reset); // display sensor data dialog strcpy(button_description, welcome_message); return D_REDRAW; } return ret; // return }
main() { int c,res; if (open_comport(1)) { /* loop while waiting for input. normally we would do something useful here */ while (stop == FALSE) { printf(".\n");usleep(100000); /* after receiving SIGIO, wait_flag = FALSE, input is available and can be read */ if (wait_flag==FALSE) { res = read(fd,buf,255); buf[res]=0; printf(":%s:%d\n", buf, res); if (res==1) { stop = TRUE; /* stop loop if only a CR was input */ } wait_flag = TRUE; /* wait for new input */ } } } }
int main(int argc, char *argv[]) { int policy; struct sched_param param; pthread_attr_t attr; char buffer[1024]; int err; dprintf("init\n"); if(argc != 2) { perr(AR_ERR_BAD_INIT_PARAM); printf("Useage: %s INSTANCE\n", AR_MODULE_NAME); return(AR_ERR_BAD_INIT_PARAM); } memset(&config, 0, sizeof(config)); erret(init_config(AR_MODULE_NAME, atoi(argv[1]), &config.base)); erret(read_config_int(config.base.name, "PRIORITY", &config.priority)); erret(read_config_int(config.base.name, "PRIORITY_DGPS_CORR_DATA", &config.priority_dgps_corr_data)); erret(read_config_string(config.base.name, "DEVICE", config.ser_device, sizeof(config.ser_device))); err = read_config_int_tab(config.base.name, "QUEUE_INDEX", "QUEUE_IN_GPS_CORR", &config.queue_corr_data); if(err != 0) { erret(read_config_string(config.base.name, "DEVICE_CORR_DATA_READ", config.ser_device_corr_data_read, sizeof(config.ser_device_corr_data_read))); // fprintf(stderr, "DGPS correction data from ser. device <%s>\n", config.ser_device_corr_data_read); } else { // fprintf(stderr, "DGPS correction data from queue <%d>\n", config.queue_corr_data); } memset(buffer, 0, sizeof(buffer)); config.corr_mode = -1; erret(read_config_string(config.base.name, "CORRECTION_MODE", buffer, sizeof(buffer))); if(strnicmp(buffer, "RTCA", strlen("RTCA")) == 0) { config.corr_mode = OEM4_RTCA_MODE; } else if(strnicmp(buffer, "RTCM", strlen("RTCM")) == 0) { config.corr_mode = OEM4_RTCM_MODE; } else { perrs(AR_ERR_BAD_INIT_PARAM, "Correction data mode not specified (RTCA | RTCM)."); // return(AR_ERR_BAD_INIT_PARAM); } erret(read_config_int_tab(config.base.name, "SHM_INDEX", "SHM_OUT_GPS_POS", &config.ishm_pos_out)); erret(read_config_int_tab(config.base.name, "SHM_INDEX", "SHM_OUT_GPS_VEL", &config.ishm_vel_out)); if(read_config_int(config.base.name, "UTC_OFFSET", &config.utc_offset)) { config.utc_offset = 15; } erret(SHM_Init()); erret(SHM_InitSlot(config.ishm_pos_out, sizeof(gps_pos_novatel_t))); erret(SHM_InitSlot(config.ishm_vel_out, sizeof(gps_vel_novatel_t))); if(config.queue_corr_data != 0) { erret(Q_Init()); erret(Q_InitSlot(config.queue_corr_data, sizeof(gps_corr_t), MAX_GPS_CORRECTION_Q_ITEMS_NUMBER, 1)); } else if (strlen(config.ser_device_corr_data_read)>0){ erret(open_comport(&fd_corr_data_read, config.ser_device_corr_data_read, O_RDWR, 115200)); } erret(open_comport(&fd, config.ser_device, O_RDWR, 57600)); if(0){ struct termios termios_p; if(tcgetattr(fd, &termios_p)==0) { termios_p.c_cc[VTIME] = 1; // 2*0.1s = 0.2s termios_p.c_cc[VMIN] = 0; tcsetattr(fd, TCSADRAIN, &termios_p); } else fprintf(stderr, "failed to set read timeout\n"); } //create thread for reading and writing of the correction data: ifret(pthread_getschedparam(pthread_self(), &policy, ¶m), AR_ERR_SYS_RESOURCES); param.sched_priority = config.priority_dgps_corr_data; pthread_attr_init( &attr ); ifret(pthread_attr_setschedparam(&attr, ¶m), AR_ERR_SYS_RESOURCES); ifret(pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED), AR_ERR_SYS_RESOURCES); ifret(pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED), AR_ERR_SYS_RESOURCES); if(config.corr_mode == OEM4_RTCA_MODE) { ifret(write(fd, OEM4_INIT_ROVER_RTCA, strlen(OEM4_INIT_ROVER_RTCA))==-1, AR_ERR_IO_ERROR); ifret(pthread_create(&pthreads[0], &attr, &corr_data_thread_func, NULL), AR_ERR_SYS_RESOURCES); } else if(config.corr_mode == OEM4_RTCM_MODE) { ifret(write(fd, OEM4_INIT_ROVER_RTCM, strlen(OEM4_INIT_ROVER_RTCM))==-1, AR_ERR_IO_ERROR); ifret(pthread_create(&pthreads[0], &attr, &corr_data_thread_func, NULL), AR_ERR_SYS_RESOURCES); } else { ifret(write(fd, OEM4_INIT_ROVER_COM1, strlen(OEM4_INIT_ROVER_COM1))==-1, AR_ERR_IO_ERROR); printf("running without differential data\n"); } ifret(pthread_getschedparam(pthread_self(), &policy, ¶m), AR_ERR_SYS_RESOURCES); param.sched_priority = config.priority; ifret(pthread_setschedparam(pthread_self(), policy, ¶m), AR_ERR_SYS_RESOURCES); while(1) { errp(read_data()); } return 0; }
int save_options_proc(int msg, DIALOG *d, int c) { int ret; int old_baud_rate; BITMAP *bmp; FILE *file; ret = d_button_proc(msg, d, c); if (ret == D_CLOSE) { old_baud_rate = comport.baud_rate; broadcast_dialog_message(MSG_SAVE_OPTIONS, 0); if (comport.baud_rate != old_baud_rate) { if (alert("WARNING!", "This operation may cause scan tool to stop responding.", "Are you sure you want to change the baud rate?", "Yes", "No", 0, 0) != 1) { comport.baud_rate = old_baud_rate; broadcast_dialog_message(MSG_REFRESH, 0); return D_O_K; } } close_comport(); // close current comport open_comport(); // try reinitializing comport (comport.status will be set) if ((!(display_mode & WINDOWED_MODE) && (display_mode & WINDOWED_MODE_SET)) || ((display_mode & WINDOWED_MODE) && !(display_mode & WINDOWED_MODE_SET))) { bmp = create_bitmap(SCREEN_W, SCREEN_H); if (bmp) { scare_mouse(); blit(screen, bmp, 0, 0, 0, 0, SCREEN_W, SCREEN_H); unscare_mouse(); if (display_mode & WINDOWED_MODE) { if (set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0) == 0) display_mode |= WINDOWED_MODE_SET; else display_mode &= ~WINDOWED_MODE_SUPPORTED; } else { if (set_gfx_mode(GFX_AUTODETECT_FULLSCREEN, 640, 480, 0, 0) == 0) display_mode &= ~WINDOWED_MODE_SET; else display_mode &= ~FULLSCREEN_MODE_SUPPORTED; } set_pallete(datafile[MAIN_PALETTE].dat); gui_fg_color = C_BLACK; // set the foreground color gui_bg_color = C_WHITE; // set the background color gui_mg_color = C_GRAY; // set the disabled color set_mouse_sprite(NULL); // make mouse use current palette blit(bmp, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H); show_mouse(screen); destroy_bitmap(bmp); } else alert("Error switching display modes.", "Not enough memory to save screen.", NULL, "OK", NULL, 0, 0); } file = fopen(options_file_name, "a"); if (file == NULL) alert("Options could not be saved, because file", options_file_name, "could not be open for writing", "OK", NULL, 0, 0); else { fclose(file); save_program_options(); } } return ret; }
static void init() { char temp_buf[256]; is_not_genuine_scan_tool = FALSE; /* initialize some varaibles with default values */ strcpy(options_file_name, "scantool.cfg"); strcpy(data_file_name, "scantool.dat"); strcpy(code_defs_file_name, "codes.dat"); datafile = NULL; comport.status = NOT_OPEN; display_mode = 0; set_uformat(U_ASCII); /* initialize hardware */ write_log("\nInitializing Allegro... "); allegro_init(); write_log("OK"); set_window_title(WINDOW_TITLE); write_log("\nInstalling Timers... "); if (install_timer() != 0) { write_log("Error!"); fatal_error("Error installing timers"); } write_log("OK"); write_log("\nInstalling Keyboard... "); install_keyboard(); write_log("OK"); write_log("\nInstalling Mouse... "); install_mouse(); write_log("OK"); /* load options from file, the defaults will be automatically substituted if file does not exist */ write_log("\nLoading Preferences... "); set_config_file(options_file_name); /* if config file doesn't exist or is of an incorrect version */ if (strcmp(get_config_string(NULL, "version", ""), SCANTOOL_VERSION_STR) != 0) { /* update config file */ remove(options_file_name); set_config_file(options_file_name); set_config_string(NULL, "version", SCANTOOL_VERSION_STR); load_program_options(); // Load defaults save_program_options(); } else load_program_options(); write_log("OK"); display_mode |= FULLSCREEN_MODE_SUPPORTED; write_log("\nTrying Windowed Graphics Mode... "); if (set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0) == 0) { display_mode |= WINDOWED_MODE_SUPPORTED; write_log("OK"); } else { display_mode &= ~(WINDOWED_MODE_SUPPORTED | WINDOWED_MODE_SET); write_log(allegro_error); } if (!(display_mode & WINDOWED_MODE_SET)) { write_log("\nTrying Full Screen Graphics Mode... "); if (set_gfx_mode(GFX_AUTODETECT_FULLSCREEN, 640, 480, 0, 0) == 0) { display_mode |= FULLSCREEN_MODE_SUPPORTED; write_log("OK"); } else { display_mode &= ~FULLSCREEN_MODE_SUPPORTED; write_log(allegro_error); } } if (!(display_mode & (FULLSCREEN_MODE_SUPPORTED | WINDOWED_MODE_SUPPORTED))) fatal_error(allegro_error); else if ((display_mode & WINDOWED_MODE_SUPPORTED) && !(display_mode & FULLSCREEN_MODE_SUPPORTED)) { set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0); display_mode &= WINDOWED_MODE_SET; } write_log("\nLoading Data File... "); packfile_password(PASSWORD); datafile = load_datafile(data_file_name); packfile_password(NULL); if (datafile == NULL) { sprintf(temp_buf, "Error loading %s!", data_file_name); write_log(temp_buf); fatal_error(temp_buf); } write_log("OK"); set_pallete(datafile[MAIN_PALETTE].dat); font = datafile[ARIAL12_FONT].dat; gui_fg_color = C_BLACK; // set the foreground color gui_bg_color = C_WHITE; // set the background color gui_mg_color = C_GRAY; // set the disabled color set_mouse_sprite(NULL); // make mouse use current palette write_log("\nInitializing Serial Module... "); serial_module_init(); write_log("OK"); sprintf(temp_buf, "\nOpening COM%i... ", comport.number + 1); write_log(temp_buf); /* try opening comport (comport.status will be set) */ open_comport(); switch (comport.status) { case READY: write_log("OK"); break; case NOT_OPEN: write_log("Error!"); break; default: write_log("Unknown Status"); break; } }
int main(int argc, char* argv[]) { int policy; struct sched_param param; char buffer[1024]; dprintf("init\n"); if(argc != 2) { perr(AR_ERR_BAD_INIT_PARAM); printf("Useage: %s INSTANCE\n", AR_MODULE_NAME); return(AR_ERR_BAD_INIT_PARAM); } erret(init_config(AR_MODULE_NAME, atoi(argv[1]), &config.base)); erret(read_config_int(config.base.name, "PRIORITY", &config.priority)); erret(read_config_string(config.base.name, "DEVICE", config.ser_device, sizeof(config.ser_device))); memset(buffer, 0, sizeof(buffer)); erret(read_config_string(config.base.name, "CORRECTION_MODE", buffer, sizeof(buffer))); if(strnicmp(buffer, "RTCA", strlen("RTCA")) == 0) config.corr_mode = OEMX_RTCA_MODE; else if(strnicmp(buffer, "RTCM", strlen("RTCM")) == 0) config.corr_mode = OEMX_RTCM_MODE; else { perrs(AR_ERR_BAD_INIT_PARAM, "Correction data mode not specified (RTCA | RTCM)."); return(AR_ERR_BAD_INIT_PARAM); } erret(open_comport(&fd, config.ser_device, O_RDWR, 115200)); memset(buffer, 0, sizeof(buffer)); erret(read_config_string(config.base.name, "GPS_MODE", buffer, sizeof(buffer))); if(strnicmp(buffer, "OEM4", strlen("OEM4")) == 0) config.gps_mode = OEM4_GPS; else if(strnicmp(buffer, "OEM5", strlen("OEM5")) == 0) config.gps_mode = OEM4_GPS; else { perrs(AR_ERR_BAD_INIT_PARAM, "GPS_MODE must be OEM4 or OEM5."); return(AR_ERR_BAD_INIT_PARAM); } //ifret(write(fd, OEM4_INIT_ROVER_COM1, strlen(OEM4_INIT_ROVER_COM1))==-1, AR_ERR_IO_ERROR); /* if(config.gps_mode == OEM4_GPS && config.corr_mode == OEMX_RTCA_MODE) { ifret(write(fd, OEM4_INIT_RTCA, strlen(OEM4_INIT_RTCA))==-1, AR_ERR_IO_ERROR); printf("INIT RTCA\n"); } else if(config.gps_mode == OEM4_GPS && config.corr_mode == OEMX_RTCM_MODE) { struct termios termios_p; int rlen=0; if(tcgetattr(fd, &termios_p)==0) { termios_p.c_cc[VTIME] = 10; // 2*0.1s = 0.2s termios_p.c_cc[VMIN] = 0; tcsetattr(fd, TCSANOW, &termios_p); } sprintf(buffer, "unlogall com2\n\r"); sleep(1); write(fd,buffer, strlen(buffer)); rlen=read(fd,buffer,sizeof(buffer)-1); buffer[rlen]=0; printf("%s\n---\n",buffer); ifret(write(fd, OEM4_INIT_RTCM, strlen(OEM4_INIT_RTCM))==-1, AR_ERR_IO_ERROR); sleep(1); write(fd,buffer, strlen(buffer)); rlen=read(fd,buffer,sizeof(buffer)-1); buffer[rlen]=0; printf("%s\n---\n",buffer); printf("INIT RTCM\n"); } else { perrs(AR_ERR_BAD_INIT_PARAM, "can not initialized mode for corr. data\n"); return(AR_ERR_BAD_INIT_PARAM); } */ config.queue_corr_data_1 = 0; config.queue_corr_data_2 = 0; config.queue_corr_data_3 = 0; config.queue_corr_data_4 = 0; config.queue_corr_data_5 = 0; config.queue_corr_data_6 = 0; erret(read_config_int_tab(config.base.name, "QUEUE_INDEX", "QUEUE_OUT_GPS_CORRCTION_1", &config.queue_corr_data_1)); erret(Q_Init()); erret(Q_InitSlot(config.queue_corr_data_1, sizeof(gps_corr_t), MAX_GPS_CORRECTION_Q_ITEMS_NUMBER, 0)); if(read_config_int_tab(config.base.name, "QUEUE_INDEX", "QUEUE_OUT_GPS_CORRCTION_2", &config.queue_corr_data_2)==0) { erret(Q_InitSlot(config.queue_corr_data_2, sizeof(gps_corr_t), MAX_GPS_CORRECTION_Q_ITEMS_NUMBER, 0)); } if(read_config_int_tab(config.base.name, "QUEUE_INDEX", "QUEUE_OUT_GPS_CORRCTION_3", &config.queue_corr_data_3)==0) { erret(Q_InitSlot(config.queue_corr_data_3, sizeof(gps_corr_t), MAX_GPS_CORRECTION_Q_ITEMS_NUMBER, 0)); } if(read_config_int_tab(config.base.name, "QUEUE_INDEX", "QUEUE_OUT_GPS_CORRCTION_4", &config.queue_corr_data_4)==0) { erret(Q_InitSlot(config.queue_corr_data_4, sizeof(gps_corr_t), MAX_GPS_CORRECTION_Q_ITEMS_NUMBER, 0)); } if(read_config_int_tab(config.base.name, "QUEUE_INDEX", "QUEUE_OUT_GPS_CORRCTION_5", &config.queue_corr_data_5)==0) { erret(Q_InitSlot(config.queue_corr_data_5, sizeof(gps_corr_t), MAX_GPS_CORRECTION_Q_ITEMS_NUMBER, 0)); } if(read_config_int_tab(config.base.name, "QUEUE_INDEX", "QUEUE_OUT_GPS_CORRCTION_6", &config.queue_corr_data_6)==0) { erret(Q_InitSlot(config.queue_corr_data_6, sizeof(gps_corr_t), MAX_GPS_CORRECTION_Q_ITEMS_NUMBER, 0)); } //both queues are initialized in non-blocking mode; if one of communicators is blocked, //the second one continues to transmit the data ifret(pthread_getschedparam(pthread_self(), &policy, ¶m), AR_ERR_SYS_RESOURCES); param.sched_priority = config.priority; ifret(pthread_setschedparam(pthread_self(), policy, ¶m), AR_ERR_SYS_RESOURCES); read_corr_data_loop(); return(0); }