int main(void) { //initializations Board_init(); Board_configure(USE_SERIAL | USE_LCD | USE_TIMER); Interface_init(); //I2C_init(I2C_ID, I2C_CLOCK_FREQ); dbprint("Interface online.\n"); DELAY(STARTUP_DELAY); Timer_new(TIMER_TEST, DEBUG_PRINT_DELAY); //cycle and check if buttons are pressed, if so, turn light on for 3 seconds while(1) { #ifdef DO_STUFF //check to see which button is pressed if(Timer_isExpired(TIMER_TEST)) { LCD_setPosition(0,0); dbprint("Ok=%d, C=%d, R=%d, S=%x,\n Reset=%x, SS=%x\n", Interface_isOkPressed(), Interface_isCancelPressed(), Interface_isRescuePressed(), Interface_isStopPressed(), Interface_isResetPressed(), Interface_isSetStationPressed()); Timer_new(TIMER_TEST, DEBUG_PRINT_DELAY); } Interface_runSM(); #endif } return SUCCESS; }
int main(void) { //initializations Board_init(); Board_configure(USE_SERIAL | USE_LCD | USE_TIMER); Interface_init(); //I2C_init(I2C_ID, I2C_CLOCK_FREQ); DELAY(10); dbprint("Interface online.\n"); DELAY(STARTUP_DELAY); enum { CANCEL = 1, OK, STOP, RESCUE, SETSTATION, IDLE, RESET } state; //cycle and check if buttons are pressed, if so, turn light on for 3 seconds while(1) { //check to see which button is pressed if(Interface_isCancelPressed() && state != CANCEL){ state = CANCEL; LCD_setPosition(0,0); dbprint("Cancel.\n"); }else if(Interface_isOkPressed() && state != OK){ state = OK; LCD_setPosition(0,0); dbprint("Ok.\n"); }else if(Interface_isStopPressed() && state != STOP){ state = STOP; LCD_setPosition(0,0); dbprint("Stop.\n"); }else if(Interface_isRescuePressed() && state != RESCUE){ state = RESCUE; LCD_setPosition(0,0); dbprint("Rescue.\n"); }else if(Interface_isSetStationPressed() && state != SETSTATION){ state = SETSTATION; LCD_setPosition(0,0); dbprint("Set station.\n"); }else if(Interface_isResetPressed() && state != RESET){ state = RESET; LCD_setPosition(0,0); dbprint("Reset.\n"); }else{ // Nothing } Interface_runSM(); } return SUCCESS; }
int main(void) { // Initialize the UART,Timers, and I2C1v Board_init(); Board_configure(USE_SERIAL | USE_LCD | USE_TIMER); dbprint("Starting encoders...\n"); I2C_init(I2C_ID, I2C_CLOCK_FREQ); Encoder_init(); Interface_init(); Timer_new(TIMER_TEST, PRINT_DELAY ); while (!Timer_isExpired(TIMER_TEST)) { Encoder_runSM(); } // Not working? //Encoder_setZeroPitch(); //Encoder_setZeroYaw(); dbprint("Encoders initialized.\n"); DELAY(STARTUP_DELAY) Timer_new(TIMER_TEST, PRINT_DELAY ); bool clearedCalibrateMessage = TRUE; Timer_new(TIMER_TEST2,CALIBRATE_HOLD_DELAY); //Interface_waitLightOnTimer(CALIBRATE_HOLD_DELAY); Interface_waitLightOnTimer(CALIBRATE_HOLD_DELAY); LCD_setPosition(0,0); dbprint("Encoders:\n"); while(1) { if (Timer_isExpired(TIMER_TEST)) { LCD_setPosition(1,0); dbprint(" P=%.1f,\n Y=%.1f\n",Encoder_getPitch(), Encoder_getYaw()); Timer_new(TIMER_TEST, PRINT_DELAY ); } if (Interface_isOkPressed() && Timer_isExpired(TIMER_TEST2)) { Encoder_setZeroPitch(); Encoder_setZeroYaw(); LCD_setPosition(3,0); dbprint("Zeroed encoders.\n"); clearedCalibrateMessage = FALSE; Interface_waitLightOnTimer(CALIBRATE_HOLD_DELAY); Interface_readyLightOff(); Timer_new(TIMER_TEST2,CALIBRATE_HOLD_DELAY); } if (Timer_isExpired(TIMER_TEST2) && !clearedCalibrateMessage) { clearedCalibrateMessage = TRUE; LCD_setPosition(3,0); dbprint(" "); Interface_readyLightOn(); } Encoder_runSM(); Interface_runSM(); } return (SUCCESS); }
int main(void) { //initializations Board_init(); Serial_init(); Timer_init(); LCD_init(); Interface_init(); printf("INITIALIZATIONS COMPLETE\n"); LCD_writeString("Interface online.\n"); Timer_new(TIMER_TEST, 100); while (1) { if (Timer_isExpired(TIMER_TEST)) { printf("%X -- C:%X F:%X\n",Interface_isOkPressed(), buttonCount.okay, buttonPressed.flag.okay); Timer_new(TIMER_TEST, 100); } Interface_runSM(); } }
int main (int argc, char **argv) { Interface_init(); s_t* st2=(s_t*)(Instance[1].gm->mem_ref.pointer); st2->port=38800; char c; s32 i, j; int new_omg_model; // goto ocg in oai_emulation.info. // pointers signal buffers (s = transmit, r,r0 = receive) double **s_re[NINST], **s_im[NINST], **r_re[NINST], **r_im[NINST], **r_re0, **r_im0; double **r_re0_d[8][3], **r_im0_d[8][3], **r_re0_u[3][8],**r_im0_u[3][8]; // double **s_re, **s_im, **r_re, **r_im, **r_re0, **r_im0; double forgetting_factor=0; int map1,map2; double **ShaF= NULL; // Framing variables s32 slot, last_slot, next_slot; // variables/flags which are set by user on command-line double snr_dB, sinr_dB; u8 set_snr=0,set_sinr=0; u8 cooperation_flag; // for cooperative communication u8 target_dl_mcs = 4; u8 target_ul_mcs = 2; u8 rate_adaptation_flag; u8 abstraction_flag = 0, ethernet_flag = 0; u16 Nid_cell = 0; s32 UE_id, eNB_id, ret; // time calibration for soft realtime mode struct timespec time_spec; unsigned long time_last, time_now; int td, td_avg, sleep_time_us; char *g_log_level = "trace"; // by default global log level is set to trace lte_subframe_t direction; #ifdef XFORMS FD_phy_procedures_sim *form[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX]; char title[255]; #endif LTE_DL_FRAME_PARMS *frame_parms; FILE *UE_stats[NUMBER_OF_UE_MAX], *eNB_stats; char UE_stats_filename[255]; int len; #ifdef ICIC remove ("dci.txt"); #endif //time_t t0,t1; clock_t start, stop; // Added for PHY abstraction Node_list ue_node_list = NULL; Node_list enb_node_list = NULL; //default parameters target_dl_mcs = 0; rate_adaptation_flag = 0; oai_emulation.info.n_frames = 0xffff;//1024; //100; oai_emulation.info.n_frames_flag = 0;//fixme snr_dB = 30; cooperation_flag = 0; // default value 0 for no cooperation, 1 for Delay diversity, 2 for Distributed Alamouti init_oai_emulation(); // to initialize everything !!! // get command-line options while ((c = getopt (argc, argv, "haePToFt:C:N:k:x:m:rn:s:S:f:z:u:b:c:M:p:g:l:d:U:B:R:E:")) != -1) { switch (c) { case 'F': // set FDD oai_emulation.info.frame_type = 0; break; case 'C': oai_emulation.info.tdd_config = atoi (optarg); if (oai_emulation.info.tdd_config > 6) { msg ("Illegal tdd_config %d (should be 0-6)\n", oai_emulation.info.tdd_config); exit (-1); } break; case 'R': oai_emulation.info.N_RB_DL = atoi (optarg); if ((oai_emulation.info.N_RB_DL != 6) && (oai_emulation.info.N_RB_DL != 15) && (oai_emulation.info.N_RB_DL != 25) && (oai_emulation.info.N_RB_DL != 50) && (oai_emulation.info.N_RB_DL != 75) && (oai_emulation.info.N_RB_DL != 100)) { msg ("Illegal N_RB_DL %d (should be one of 6,15,25,50,75,100)\n", oai_emulation.info.N_RB_DL); exit (-1); } case 'N': Nid_cell = atoi (optarg); if (Nid_cell > 503) { msg ("Illegal Nid_cell %d (should be 0 ... 503)\n", Nid_cell); exit(-1); } break; case 'h': help (); exit (1); case 'x': oai_emulation.info.transmission_mode = atoi (optarg); if ((oai_emulation.info.transmission_mode != 1) && (oai_emulation.info.transmission_mode != 2) && (oai_emulation.info.transmission_mode != 5) && (oai_emulation.info.transmission_mode != 6)) { msg("Unsupported transmission mode %d\n",oai_emulation.info.transmission_mode); exit(-1); } break; case 'm': target_dl_mcs = atoi (optarg); break; case 'r': rate_adaptation_flag = 1; break; case 'n': oai_emulation.info.n_frames = atoi (optarg); //n_frames = (n_frames >1024) ? 1024: n_frames; // adjust the n_frames if higher that 1024 oai_emulation.info.n_frames_flag = 1; break; case 's': snr_dB = atoi (optarg); set_snr = 1; oai_emulation.info.ocm_enabled=0; break; case 'S': sinr_dB = atoi (optarg); set_sinr = 1; oai_emulation.info.ocm_enabled=0; break; case 'k': //ricean_factor = atof (optarg); printf("[SIM] Option k is no longer supported on the command line. Please specify your channel model in the xml template\n"); exit(-1); break; case 't': //Td = atof (optarg); printf("[SIM] Option t is no longer supported on the command line. Please specify your channel model in the xml template\n"); exit(-1); break; case 'f': forgetting_factor = atof (optarg); break; case 'z': cooperation_flag = atoi (optarg); break; case 'u': oai_emulation.info.nb_ue_local = atoi (optarg); break; case 'b': oai_emulation.info.nb_enb_local = atoi (optarg); break; case 'a': abstraction_flag = 1; break; case 'p': oai_emulation.info.nb_master = atoi (optarg); break; case 'M': abstraction_flag = 1; ethernet_flag = 1; oai_emulation.info.ethernet_id = atoi (optarg); oai_emulation.info.master_id = oai_emulation.info.ethernet_id; oai_emulation.info.ethernet_flag = 1; break; case 'e': oai_emulation.info.extended_prefix_flag = 1; break; case 'l': g_log_level = optarg; break; case 'c': strcpy(oai_emulation.info.local_server, optarg); oai_emulation.info.ocg_enabled=1; break; case 'g': oai_emulation.info.multicast_group = atoi (optarg); break; case 'B': oai_emulation.info.omg_model_enb = atoi (optarg); break; case 'U': oai_emulation.info.omg_model_ue = atoi (optarg); break; case 'T': oai_emulation.info.otg_enabled = 1; break; case 'P': oai_emulation.info.opt_enabled = 1; break; case 'E': oai_emulation.info.seed = atoi (optarg); break; default: help (); exit (-1); break; } } // configure oaisim with OCG oaisim_config(g_log_level); // config OMG and OCG, OPT, OTG, OLG if (oai_emulation.info.nb_ue_local > NUMBER_OF_UE_MAX ) { printf ("Enter fewer than %d UEs for the moment or change the NUMBER_OF_UE_MAX\n", NUMBER_OF_UE_MAX); exit (-1); } if (oai_emulation.info.nb_enb_local > NUMBER_OF_eNB_MAX) { printf ("Enter fewer than %d eNBs for the moment or change the NUMBER_OF_UE_MAX\n", NUMBER_OF_eNB_MAX); exit (-1); } // fix ethernet and abstraction with RRC_CELLULAR Flag #ifdef RRC_CELLULAR abstraction_flag = 1; ethernet_flag = 0; #endif if (set_sinr == 0) sinr_dB = snr_dB - 20; // setup ntedevice interface (netlink socket) #ifndef CYGWIN ret = netlink_init (); #endif if (ethernet_flag == 1) { oai_emulation.info.master[oai_emulation.info.master_id].nb_ue = oai_emulation.info.nb_ue_local; oai_emulation.info.master[oai_emulation.info.master_id].nb_enb = oai_emulation.info.nb_enb_local; if (!oai_emulation.info.master_id) oai_emulation.info.is_primary_master = 1; j = 1; for (i = 0; i < oai_emulation.info.nb_master; i++) { if (i != oai_emulation.info.master_id) oai_emulation.info.master_list = oai_emulation.info.master_list + j; LOG_I (EMU, "Index of master id i=%d MASTER_LIST %d\n", i, oai_emulation.info.master_list); j *= 2; } LOG_I (EMU, " Total number of master %d my master id %d\n", oai_emulation.info.nb_master, oai_emulation.info.master_id); #ifdef LINUX init_bypass (); #endif while (emu_tx_status != SYNCED_TRANSPORT) { LOG_I (EMU, " Waiting for EMU Transport to be synced\n"); emu_transport_sync (); //emulation_tx_rx(); } } // ethernet flag NB_UE_INST = oai_emulation.info.nb_ue_local + oai_emulation.info.nb_ue_remote; NB_eNB_INST = oai_emulation.info.nb_enb_local + oai_emulation.info.nb_enb_remote; #ifndef NAS_NETLINK for (UE_id=0;UE_id<NB_UE_INST;UE_id++) { sprintf(UE_stats_filename,"UE_stats%d.txt",UE_id); UE_stats[UE_id] = fopen (UE_stats_filename, "w"); } eNB_stats = fopen ("eNB_stats.txt", "w"); printf ("UE_stats=%p, eNB_stats=%p\n", UE_stats, eNB_stats); #endif LOG_I(EMU, "total number of UE %d (local %d, remote %d) \n", NB_UE_INST,oai_emulation.info.nb_ue_local,oai_emulation.info.nb_ue_remote); LOG_I(EMU, "Total number of eNB %d (local %d, remote %d) \n", NB_eNB_INST,oai_emulation.info.nb_enb_local,oai_emulation.info.nb_enb_remote); printf("Running with frame_type %d, Nid_cell %d, N_RB_DL %d, EP %d, mode %d, target dl_mcs %d, rate adaptation %d, nframes %d, abstraction %d\n", 1+oai_emulation.info.frame_type, Nid_cell, oai_emulation.info.N_RB_DL, oai_emulation.info.extended_prefix_flag, oai_emulation.info.transmission_mode,target_dl_mcs,rate_adaptation_flag,oai_emulation.info.n_frames,abstraction_flag); // init_lte_vars (&frame_parms, oai_emulation.info.frame_type, oai_emulation.info.tdd_config, oai_emulation.info.extended_prefix_flag,oai_emulation.info.N_RB_DL, Nid_cell, cooperation_flag, oai_emulation.info.transmission_mode, abstraction_flag); init_frame_params (&frame_parms, oai_emulation.info.frame_type, oai_emulation.info.tdd_config, oai_emulation.info.extended_prefix_flag,oai_emulation.info.N_RB_DL, Nid_cell, cooperation_flag, oai_emulation.info.transmission_mode, abstraction_flag); printf ("Nid_cell %d\n", frame_parms->Nid_cell); /* Added for PHY abstraction */ if (abstraction_flag) get_beta_map(); for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) { enb_data[eNB_id] = (node_desc_t *)malloc(sizeof(node_desc_t)); init_enb(enb_data[eNB_id],oai_emulation.environment_system_config.antenna.eNB_antenna); } for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) { ue_data[UE_id] = (node_desc_t *)malloc(sizeof(node_desc_t)); init_ue(ue_data[UE_id],oai_emulation.environment_system_config.antenna.UE_antenna); } // init SF map here!!! map1 =(int)oai_emulation.topology_config.area.x_km; map2 =(int)oai_emulation.topology_config.area.y_km; //ShaF = createMat(map1,map2); -> memory is allocated within init_SF ShaF = init_SF(map1,map2,DECOR_DIST,SF_VAR); // size of area to generate shadow fading map printf("Simulation area x=%f, y=%f\n", oai_emulation.topology_config.area.x_km, oai_emulation.topology_config.area.y_km); if (abstraction_flag == 0){ int ci; int ji=0; for(ci=0;ci<NB_eNB_INST;ci++) { init_channel_mmap_channel(10+ji,frame_parms, &(s_re[ci]), &(s_im[ci]), &(r_re[ci]), &(r_im[ci]), &(r_re0), &(r_im0)); ji++; //printf("ci %d\n",ci); } ji=0; for(ci=NB_eNB_INST;ci<(NB_eNB_INST+NB_UE_INST);ci++) { init_channel_mmap_channel(20+ji,frame_parms, &(s_re[ci]), &(s_im[ci]), &(r_re[ci]), &(r_im[ci]), &(r_re0), &(r_im0)); ji++; //printf("ci %d\n",ci); } } for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) { for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) { init_rre(frame_parms,&(r_re0_u[eNB_id][UE_id]),&(r_im0_u[eNB_id][UE_id])); init_rre(frame_parms,&(r_re0_d[UE_id][eNB_id]),&(r_im0_d[UE_id][eNB_id])); } } // printf("r_re0 %lf , r_im0 %lf\n",r_re0_u[0][0][0][0],r_im0_u[0][0][0][0]); // // r_im0_u[0][0][0][0]=100; // // printf("r_re0 %lf , r_im0 %lf\n",r_re0_u[0][0][0][0],r_im0_u[0][0][0][0]); // // // clean_param((r_re0_u[0][0]),(r_im0_u[0][0]),frame_parms); // // printf("r_re0 %lf , r_im0 %lf\n",r_re0_u[0][0][0][0],r_im0_u[0][0][0][0]); for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) { for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) { #ifdef DEBUG_SIM printf ("[SIM] Initializing channel from eNB %d to UE %d\n", eNB_id, UE_id); #endif eNB2UE[eNB_id][UE_id] = new_channel_desc_scm(2, 2, map_str_to_int(small_scale_names, oai_emulation.environment_system_config.fading.small_scale.selected_option), oai_emulation.environment_system_config.system_bandwidth_MB, forgetting_factor, 0, 0); UE2eNB[UE_id][eNB_id] = new_channel_desc_scm(2, 2, map_str_to_int(small_scale_names, oai_emulation.environment_system_config.fading.small_scale.selected_option), oai_emulation.environment_system_config.system_bandwidth_MB, forgetting_factor, 0, 0); } } randominit (0); set_taus_seed (0); number_of_cards = 1; openair_daq_vars.rx_rf_mode = 1; openair_daq_vars.tdd = 1; openair_daq_vars.rx_gain_mode = DAQ_AGC_ON; openair_daq_vars.dlsch_transmission_mode = oai_emulation.info.transmission_mode; openair_daq_vars.target_ue_dl_mcs = target_dl_mcs; openair_daq_vars.target_ue_ul_mcs = target_ul_mcs; openair_daq_vars.dlsch_rate_adaptation = rate_adaptation_flag; openair_daq_vars.ue_ul_nb_rb = 2; #ifdef XFORMS fl_initialize (&argc, argv, NULL, 0, 0); for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) { form[eNB_id][UE_id] = create_form_phy_procedures_sim (); sprintf (title, "LTE SIM UE %d eNB %d", UE_id, eNB_id); fl_show_form (form[eNB_id][UE_id]->phy_procedures_sim, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); } #endif // time calibration for OAI clock_gettime (CLOCK_REALTIME, &time_spec); time_now = (unsigned long) time_spec.tv_nsec; td_avg = 0; sleep_time_us = SLEEP_STEP_US; td_avg = TARGET_SF_TIME_NS; // s_t* st2=(s_t*)(Instance[1].gm->mem_ref.pointer); st2->Exec_FLAG=0; int count; IntInitAll(); Soc_t* this = (Soc_t*)(obj_inst[0].ptr->mem_ref.pointer); fd_set read_ibits; fd_set write_ibits; int n; struct timeval tvp ; tvp.tv_sec=10; tvp.tv_usec=0; FD_ZERO(&read_ibits); FD_SET(this->m_io_sync.io_sync_entries->fd_read, &read_ibits); ch_thread *e2u_t[NB_eNB_INST][NB_UE_INST]; ch_thread *u2e_t[NB_UE_INST][NB_eNB_INST]; for(eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++){ for(UE_id=0;UE_id<NB_UE_INST;UE_id++){ e2u_t[eNB_id][UE_id]=(ch_thread*)calloc(1,sizeof(ch_thread)); }} for(UE_id=0;UE_id<NB_UE_INST;UE_id++){ for(eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++){ u2e_t[UE_id][eNB_id]=(ch_thread*)calloc(1,sizeof(ch_thread)); }} pthread_t thread,thread2; pthread_t cthr_u[NB_eNB_INST][NB_UE_INST]; pthread_t cthr_d[NB_UE_INST][NB_eNB_INST]; for (UE_id = oai_emulation.info.first_ue_local; UE_id < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); UE_id++){ for (eNB_id=oai_emulation.info.first_enb_local;eNB_id<(oai_emulation.info.first_enb_local+oai_emulation.info.nb_enb_local);eNB_id++) { u2e_t[UE_id][eNB_id]->eNB_id=eNB_id; u2e_t[UE_id][eNB_id]->UE_id=UE_id; u2e_t[UE_id][eNB_id]->r_re0=r_re0_d[UE_id][eNB_id]; u2e_t[UE_id][eNB_id]->r_im0=r_im0_d[UE_id][eNB_id]; u2e_t[UE_id][eNB_id]->r_re=r_re[NB_eNB_INST+UE_id]; u2e_t[UE_id][eNB_id]->r_im=r_im[NB_eNB_INST+UE_id]; u2e_t[UE_id][eNB_id]->s_im=s_im[eNB_id]; u2e_t[UE_id][eNB_id]->s_re=s_re[eNB_id]; u2e_t[UE_id][eNB_id]->eNB2UE=eNB2UE[eNB_id][UE_id]; u2e_t[UE_id][eNB_id]->UE2eNB=UE2eNB[UE_id][eNB_id]; u2e_t[UE_id][eNB_id]->enb_data=enb_data[eNB_id]; u2e_t[UE_id][eNB_id]->ue_data=ue_data[UE_id]; u2e_t[UE_id][eNB_id]->next_slot=&next_slot; u2e_t[UE_id][eNB_id]->abstraction_flag=&abstraction_flag; u2e_t[UE_id][eNB_id]->frame_parms=frame_parms; pthread_create (&cthr_d[UE_id][eNB_id], NULL, do_DL_sig_channel_T,(void*)(u2e_t[UE_id][eNB_id])); } } int sock; int port=(35000+(10+eNB_id)+(20+UE_id)); port=35010; sock = openairInetCreateSocket(SOCK_DGRAM,IPPROTO_UDP,"127.0.0.1",port); // int n; // fd_set read_ibits; // fd_set write_ibits; // struct timeval tvp = { 0, 0 }; FD_ZERO(&read_ibits); FD_SET(sock,&read_ibits); n = openairSelect(sock+1, &read_ibits, NULL, NULL, NULL); printf("Waiting is over\n"); FD_ISSET(sock, &read_ibits); for (mac_xface->frame=0; mac_xface->frame<oai_emulation.info.n_frames; mac_xface->frame++) { int dir_flag=0; printf("=============== Frame Number %d ============= \n ",mac_xface->frame); /* // Handling the cooperation Flag if (cooperation_flag == 2) { if ((PHY_vars_eNB_g[0]->eNB_UE_stats[0].mode == PUSCH) && (PHY_vars_eNB_g[0]->eNB_UE_stats[1].mode == PUSCH)) PHY_vars_eNB_g[0]->cooperation_flag = 2; } */ // for dubugging the frame counter update_nodes(oai_emulation.info.time); enb_node_list = get_current_positions(oai_emulation.info.omg_model_enb, eNB, oai_emulation.info.time); ue_node_list = get_current_positions(oai_emulation.info.omg_model_ue, UE, oai_emulation.info.time); // update the position of all the nodes (eNB/CH, and UE/MR) every frame if (((int)oai_emulation.info.time % 10) == 0 ) { display_node_list(enb_node_list); display_node_list(ue_node_list); if (oai_emulation.info.omg_model_ue >= MAX_NUM_MOB_TYPES){ // mix mobility model for(UE_id=oai_emulation.info.first_ue_local; UE_id<(oai_emulation.info.first_ue_local+oai_emulation.info.nb_ue_local);UE_id++){ new_omg_model = randomGen(STATIC, MAX_NUM_MOB_TYPES); LOG_D(OMG, "[UE] Node of ID %d is changing mobility generator ->%d \n", UE_id, new_omg_model); // reset the mobility model for a specific node set_new_mob_type (UE_id, UE, new_omg_model, oai_emulation.info.time); } } if (oai_emulation.info.omg_model_enb >= MAX_NUM_MOB_TYPES) { // mix mobility model for (eNB_id = oai_emulation.info.first_enb_local; eNB_id < (oai_emulation.info.first_enb_local + oai_emulation.info.nb_enb_local); eNB_id++) { new_omg_model = randomGen (STATIC, MAX_NUM_MOB_TYPES); LOG_D (OMG, "[eNB] Node of ID %d is changing mobility generator ->%d \n", UE_id, new_omg_model); // reset the mobility model for a specific node set_new_mob_type (eNB_id, eNB, new_omg_model, oai_emulation.info.time); } } } #ifdef DEBUG_OMG if ((((int) oai_emulation.info.time) % 100) == 0) { for (UE_id = oai_emulation.info.first_ue_local; UE_id < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); UE_id++) { get_node_position (UE, UE_id); } } #endif if (oai_emulation.info.n_frames_flag == 0){ // if n_frames not set by the user then let the emulation run to infinity mac_xface->frame %=(oai_emulation.info.n_frames-1); // set the emulation time based on 1ms subframe number oai_emulation.info.time += 0.01; // emu time in s } else { // user set the number of frames for the emulation // let the time go faster to see the effect of mobility oai_emulation.info.time += 0.1; } /* check if the openair channel model is activated used for PHY abstraction */ /* if ((oai_emulation.info.ocm_enabled == 1)&& (ethernet_flag == 0 )) { extract_position(enb_node_list, enb_data, NB_eNB_INST); extract_position(ue_node_list, ue_data, NB_UE_INST); for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) { for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) { calc_path_loss (enb_data[eNB_id], ue_data[UE_id], eNB2UE[eNB_id][UE_id], oai_emulation.environment_system_config,ShaF[(int)ue_data[UE_id]->x][(int)ue_data[UE_id]->y]); UE2eNB[UE_id][eNB_id]->path_loss_dB = eNB2UE[eNB_id][UE_id]->path_loss_dB; printf("[CHANNEL_SIM] Pathloss bw enB %d at (%f,%f) and UE%d at (%f,%f) is %f (ShaF %f)\n", eNB_id,enb_data[eNB_id]->x,enb_data[eNB_id]->y,UE_id,ue_data[UE_id]->x,ue_data[UE_id]->y, eNB2UE[eNB_id][UE_id]->path_loss_dB, ShaF[(int)ue_data[UE_id]->x][(int)ue_data[UE_id]->y]); } } } */ // else { for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) { for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) { eNB2UE[eNB_id][UE_id]->path_loss_dB = -105 + snr_dB; //UE2eNB[UE_id][eNB_id]->path_loss_dB = -105 + snr_dB; if (eNB_id == (UE_id % NB_eNB_INST)) UE2eNB[UE_id][eNB_id]->path_loss_dB = -105 + snr_dB - 10; else UE2eNB[UE_id][eNB_id]->path_loss_dB = -105 + sinr_dB - 10; #ifdef DEBUG_SIM printf("[SIM] Path loss from eNB %d to UE %d => %f dB\n",eNB_id,UE_id,eNB2UE[eNB_id][UE_id]->path_loss_dB); printf("[SIM] Path loss from UE %d to eNB %d => %f dB\n",UE_id,eNB_id,UE2eNB[UE_id][eNB_id]->path_loss_dB); #endif } } // } else st2->EResp_FLAG=0; for (slot=0 ; slot<20 ; slot++) { printf("=============== Frame Number %d , Slot %d ============= \n ",mac_xface->frame,slot); last_slot = (slot - 1)%20; if (last_slot <0) last_slot+=20; next_slot = (slot + 1)%20; direction = subframe_select(frame_parms,next_slot>>1); if (direction == SF_DL) { dir_flag=1; } else if (direction == SF_UL) { dir_flag=2; } else {//it must be a special subframe if (next_slot%2==0) {//DL part dir_flag=1; } else {// UL part dir_flag=2; } } int count=0; if(dir_flag==1) { st2->EResp_FLAG=0; count=0; for (eNB_id=oai_emulation.info.first_enb_local;eNB_id<(oai_emulation.info.first_enb_local+oai_emulation.info.nb_enb_local);eNB_id++) { send_exec_msg(next_slot,last_slot,mac_xface->frame,mac_xface->frame,slot,0,38810+eNB_id); printf("Waiting for Exec Msg Complete \n"); // n = openairIoSyncCreateThread_2(&this->m_io_sync); } // for loop while(count<NB_eNB_INST){ n=trig_wait((void*)&this->m_io_sync); count++; } for (UE_id = oai_emulation.info.first_ue_local; UE_id < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); UE_id++){ for (eNB_id=oai_emulation.info.first_enb_local;eNB_id<(oai_emulation.info.first_enb_local+oai_emulation.info.nb_enb_local);eNB_id++) { //trigger message send_exec_msg(0,0,0,0,0,0,(35000+(10+eNB_id)+(20+UE_id))); } } usleep(5); // while(st2->EResp_FLAG<NB_eNB_INST) // { /* for (UE_id = oai_emulation.info.first_ue_local; UE_id < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); UE_id++){ for (eNB_id=oai_emulation.info.first_enb_local;eNB_id<(oai_emulation.info.first_enb_local+oai_emulation.info.nb_enb_local);eNB_id++) { u2e_t[UE_id][eNB_id]->eNB_id=eNB_id; u2e_t[UE_id][eNB_id]->UE_id=UE_id; u2e_t[UE_id][eNB_id]->r_re0=r_re0_d[UE_id][eNB_id]; u2e_t[UE_id][eNB_id]->r_im0=r_im0_d[UE_id][eNB_id]; u2e_t[UE_id][eNB_id]->r_re=r_re[NB_eNB_INST+UE_id]; u2e_t[UE_id][eNB_id]->r_im=r_im[NB_eNB_INST+UE_id]; u2e_t[UE_id][eNB_id]->s_im=s_im[eNB_id]; u2e_t[UE_id][eNB_id]->s_re=s_re[eNB_id]; u2e_t[UE_id][eNB_id]->eNB2UE=eNB2UE[eNB_id][UE_id]; u2e_t[UE_id][eNB_id]->UE2eNB=UE2eNB[UE_id][eNB_id]; u2e_t[UE_id][eNB_id]->enb_data=enb_data[eNB_id]; u2e_t[UE_id][eNB_id]->ue_data=ue_data[UE_id]; u2e_t[UE_id][eNB_id]->next_slot=&next_slot; u2e_t[UE_id][eNB_id]->abstraction_flag=&abstraction_flag; u2e_t[UE_id][eNB_id]->frame_parms=frame_parms; // pthread_create (&thread[eNB_id][UE_id], NULL, do_DL_sig_channel_T,(void*)cthread); pthread_create (&cthr_d[UE_id][eNB_id], NULL, do_DL_sig_channel_T,(void*)(u2e_t[UE_id][eNB_id])); // pthread_join(cthr_d[UE_id][eNB_id], NULL); // pthread_join(cthr_d[UE_id][eNB_id], NULL); // pthread_join(thread[eNB_id][UE_id], NULL); // do_DL_sig_channel(eNB_id,UE_id,r_re0,r_im0,r_re[NB_eNB_INST+UE_id],r_im[NB_eNB_INST+UE_id],s_re[eNB_id],s_im[eNB_id],eNB2UE,enb_data, ue_data,next_slot,abstraction_flag,frame_parms); // do_DL_sig_channel(eNB_id,UE_id,r_re0_d[UE_id][eNB_id],r_im0_d[UE_id][eNB_id],r_re[NB_eNB_INST+UE_id],r_im[NB_eNB_INST+UE_id],s_re[eNB_id],s_im[eNB_id],eNB2UE,enb_data, ue_data,next_slot,abstraction_flag,frame_parms); } } */ // //for (UE_id = oai_emulation.info.first_ue_local; UE_id < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); UE_id++){ //for (eNB_id=oai_emulation.info.first_enb_local;eNB_id<(oai_emulation.info.first_enb_local+oai_emulation.info.nb_enb_local);eNB_id++) { //pthread_join(cthr_d[UE_id][eNB_id], NULL); //} //} for (UE_id = oai_emulation.info.first_ue_local; UE_id < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); UE_id++){ clean_param(r_re[NB_eNB_INST+UE_id],r_im[NB_eNB_INST+UE_id],frame_parms); for (eNB_id=oai_emulation.info.first_enb_local;eNB_id<(oai_emulation.info.first_enb_local+oai_emulation.info.nb_enb_local);eNB_id++) { channel_add(r_re[NB_eNB_INST+UE_id],r_im[NB_eNB_INST+UE_id],r_re0_d[UE_id][eNB_id],r_im0_d[UE_id][eNB_id],frame_parms); } } // if(UE_id==NB_UE_INST) // pthread_join(thread, NULL); //} for (UE_id = oai_emulation.info.first_ue_local; UE_id < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); UE_id++){ for (eNB_id=oai_emulation.info.first_enb_local;eNB_id<(oai_emulation.info.first_enb_local+oai_emulation.info.nb_enb_local);eNB_id++) { // pthread_join(thread, NULL); //pthread_join(thread[eNB_id][UE_id], NULL); } } // } st2->EResp_FLAG=0; count=0; for (UE_id = oai_emulation.info.first_ue_local; UE_id < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); UE_id++) if (mac_xface->frame >= (UE_id * 10)) { // activate UE only after 10*UE_id frames so that different UEs turn on separately send_exec_msg(next_slot,last_slot,mac_xface->frame,mac_xface->frame,slot,0,38820+UE_id); printf("Waiting for Exec Msg Complete \n"); //n = openairIoSyncCreateThread_2(&this->m_io_sync); // n=trig_wait((void*)&this->m_io_sync); } else{ st2->EResp_FLAG=st2->EResp_FLAG+1; count++; } while(count<NB_UE_INST){ n=trig_wait((void*)&this->m_io_sync); count++; } //while(st2->EResp_FLAG<NB_UE_INST) // { // n = select(this->m_io_sync.hfd, &read_ibits, NULL, NULL,NULL); // FD_ISSET(this->m_io_sync.io_sync_entries->fd_read, &read_ibits); // printf(".."); // } } else if(dir_flag==2) { st2->EResp_FLAG=0; count=0; for (UE_id = oai_emulation.info.first_ue_local; UE_id < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); UE_id++) if (mac_xface->frame >= (UE_id * 10)) { // activate UE only after 10*UE_id frames so that different UEs turn on separately send_exec_msg(next_slot,last_slot,mac_xface->frame,mac_xface->frame,slot,0,38820+UE_id); // printf("Waiting for Exec Msg Complete \n"); // n = openairIoSyncCreateThread_2(&this->m_io_sync); // n=trig_wait((void*)&this->m_io_sync); } else{ st2->EResp_FLAG=st2->EResp_FLAG+1; count++; } while(count<NB_UE_INST){ n=trig_wait((void*)&this->m_io_sync); count++; } //while(st2->EResp_FLAG<NB_UE_INST) // { // n = select(this->m_io_sync.hfd, &read_ibits, NULL, NULL,NULL); // FD_ISSET(this->m_io_sync.io_sync_entries->fd_read, &read_ibits); // printf(".."); // } // do_UL_sig_channel2(1,0,r_re0,r_im0,r_re,r_im,s_re,s_im,UE2eNB,next_slot,abstraction_flag,frame_parms); // do_UL_sig_channel(r_re0,r_im0,r_re,r_im,s_re,s_im,UE2eNB,next_slot,abstraction_flag,frame_parms); for (eNB_id=oai_emulation.info.first_enb_local;eNB_id<(oai_emulation.info.first_enb_local+oai_emulation.info.nb_enb_local);eNB_id++) { for (UE_id = oai_emulation.info.first_ue_local; UE_id < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); UE_id++){ e2u_t[eNB_id][UE_id]->eNB_id=eNB_id; e2u_t[eNB_id][UE_id]->UE_id=UE_id; e2u_t[eNB_id][UE_id]->r_re=r_re[eNB_id]; e2u_t[eNB_id][UE_id]->r_im=r_im[eNB_id]; e2u_t[eNB_id][UE_id]->r_re0=r_re0_u[eNB_id][UE_id]; e2u_t[eNB_id][UE_id]->r_im0=r_im0_u[eNB_id][UE_id]; e2u_t[eNB_id][UE_id]->s_im=s_im[NB_eNB_INST+UE_id]; e2u_t[eNB_id][UE_id]->s_re=s_re[NB_eNB_INST+UE_id]; e2u_t[eNB_id][UE_id]->eNB2UE=eNB2UE[eNB_id][UE_id]; e2u_t[eNB_id][UE_id]->UE2eNB=UE2eNB[UE_id][eNB_id]; e2u_t[eNB_id][UE_id]->enb_data=enb_data[eNB_id]; e2u_t[eNB_id][UE_id]->ue_data=ue_data[UE_id]; e2u_t[eNB_id][UE_id]->next_slot=&next_slot; e2u_t[eNB_id][UE_id]->abstraction_flag=&abstraction_flag; e2u_t[eNB_id][UE_id]->frame_parms=frame_parms; pthread_create (&cthr_u[eNB_id][UE_id], NULL, do_UL_sig_channel_T,(void*)e2u_t[eNB_id][UE_id]); // pthread_create (&thread[eNB_id][UE_id], NULL, do_UL_sig_channel_T,(void*)cthread); // do_UL_sig_channel(eNB_id,UE_id,r_re0,r_im0,r_re[eNB_id],r_im[eNB_id],s_re[NB_eNB_INST+UE_id],s_im[NB_eNB_INST+UE_id],UE2eNB,next_slot,abstraction_flag,frame_parms); // do_UL_sig_channel(eNB_id,UE_id,r_re0_u[eNB_id][UE_id],r_im0_u[eNB_id][UE_id],r_re[eNB_id],r_im[eNB_id],s_re[NB_eNB_INST+UE_id],s_im[NB_eNB_INST+UE_id],UE2eNB,next_slot,abstraction_flag,frame_parms); } } for (eNB_id=oai_emulation.info.first_enb_local;eNB_id<(oai_emulation.info.first_enb_local+oai_emulation.info.nb_enb_local);eNB_id++) { for (UE_id = oai_emulation.info.first_ue_local; UE_id < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); UE_id++){ // pthread_join(thread[eNB_id][UE_id], NULL); pthread_join(cthr_u[eNB_id][UE_id], NULL); } } for (eNB_id=oai_emulation.info.first_enb_local;eNB_id<(oai_emulation.info.first_enb_local+oai_emulation.info.nb_enb_local);eNB_id++) { clean_param(r_re[eNB_id],r_im[eNB_id],frame_parms); for (UE_id = oai_emulation.info.first_ue_local; UE_id < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); UE_id++){ channel_add(r_re[eNB_id],r_im[eNB_id],r_re0_u[eNB_id][UE_id],r_im0_u[eNB_id][UE_id],frame_parms); } } // } st2->EResp_FLAG=0; count=0; for (eNB_id=oai_emulation.info.first_enb_local;eNB_id<(oai_emulation.info.first_enb_local+oai_emulation.info.nb_enb_local);eNB_id++) { send_exec_msg(next_slot,last_slot,mac_xface->frame,mac_xface->frame,slot,0,38810+eNB_id); // n = openairIoSyncCreateThread_2(&this->m_io_sync); // n=trig_wait((void*)&this->m_io_sync); // printf("Waiting for Exec Msg Complete \n"); } // for loop while(count<NB_eNB_INST){ n=trig_wait((void*)&this->m_io_sync); count++; } // while(st2->EResp_FLAG<NB_eNB_INST) // { // n = select(this->m_io_sync.hfd, &read_ibits, NULL, NULL,NULL); // FD_ISSET(this->m_io_sync.io_sync_entries->fd_read, &read_ibits); // // printf(".."); // } } if ((last_slot == 1) && (mac_xface->frame == 0) && (abstraction_flag == 0) && (oai_emulation.info.n_frames == 1)) { // write_output ("dlchan0.m", "dlch0", // &(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[0][0][0]), // (6 * (PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)), 1, 1); // write_output ("dlchan1.m", "dlch1", // &(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[1][0][0]), // (6 * (PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)), 1, 1); // write_output ("dlchan2.m", "dlch2", // &(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[2][0][0]), // (6 * (PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)), 1, 1); // write_output ("pbch_rxF_comp0.m", "pbch_comp0", // PHY_vars_UE_g[0]->lte_ue_pbch_vars[0]->rxdataF_comp[0], 6 * 12 * 4, 1, 1); // write_output ("pbch_rxF_llr.m", "pbch_llr", // PHY_vars_UE_g[0]->lte_ue_pbch_vars[0]->llr, (frame_parms->Ncp == 0) ? 1920 : 1728, 1, 4); } /* if ((last_slot==1) && (mac_xface->frame==1)) { write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0",PHY_vars_UE->lte_ue_dlsch_vars[eNB_id]->rxdataF_comp[0],300*(-(PHY_vars_UE->lte_frame_parms.Ncp*2)+14),1,1); write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",PHY_vars_UE->lte_ue_pdcch_vars[eNB_id]->rxdataF_comp[0],4*300,1,1); } */ if (next_slot %2 == 0){ clock_gettime (CLOCK_REALTIME, &time_spec); time_last = time_now; time_now = (unsigned long) time_spec.tv_nsec; td = (int) (time_now - time_last); if (td>0) { td_avg = (int)(((K*(long)td) + (((1<<3)-K)*((long)td_avg)))>>3); // in us LOG_I(EMU,"sleep frame %d, average time difference %ldns, CURRENT TIME DIFF %dus, avgerage difference from the target %dus\n", mac_xface->frame, td_avg, td/1000,(td_avg-TARGET_SF_TIME_NS)/1000); } if (td_avg<(TARGET_SF_TIME_NS - SF_DEVIATION_OFFSET_NS)){ sleep_time_us += SLEEP_STEP_US; } else if (td_avg > (TARGET_SF_TIME_NS + SF_DEVIATION_OFFSET_NS)) { sleep_time_us-= SLEEP_STEP_US; } }// end if next_slot%2 } //end of slot
int main(void) { // Initializations Board_init(); Board_configure(USE_SERIAL | USE_LCD | USE_TIMER); I2C_init(I2C_ID, I2C_CLOCK_FREQ); Magnetometer_init(); Interface_init(); DELAY(5); if (Accelerometer_init() != SUCCESS) { Interface_errorLightOn(); dbprint("Failed accel. init.\n"); return FAILURE; } dbprint("Ready to calibrate.\n"); Interface_readyLightOn(); DELAY(STARTUP_DELAY); LCD_setPosition(0,0); dbprint("Please level scope.\n"); Interface_pitchLightsOn(); state = CALIBRATE_PITCH; Timer_new(TIMER_TEST2, PRINT_DELAY); bool holdingCalibrate = FALSE; while (1) { switch (state) { case CALIBRATE_PITCH: if (Accelerometer_isLevel() && !holdingCalibrate) { holdingCalibrate = TRUE; Timer_new(TIMER_TEST, CALIBRATE_HOLD_DELAY); Interface_readyLightOff(); Interface_waitLightOn(); LCD_setPosition(1,0); dbprint("Hold level...\n"); } if (Accelerometer_isLevel() && holdingCalibrate && Timer_isExpired(TIMER_TEST)) { LCD_setPosition(1,0); dbprint("Pitch done!\n"); Interface_pitchLightsOff(); Interface_readyLightOn(); Interface_waitLightOff(); holdingCalibrate = FALSE; DELAY(STARTUP_DELAY); state = CALIBRATE_YAW; LCD_setPosition(0,0); dbprint("Turn scope north.\n \n"); Interface_yawLightsOn(); } else if (!Accelerometer_isLevel() && holdingCalibrate) { holdingCalibrate = FALSE; Timer_stop(TIMER_TEST); LCD_setPosition(1,0); dbprint(" \n"); Interface_readyLightOn(); Interface_waitLightOff(); } break; case CALIBRATE_YAW: if (Magnetometer_isNorth() && !holdingCalibrate) { holdingCalibrate = TRUE; Timer_new(TIMER_TEST, CALIBRATE_HOLD_DELAY); Interface_readyLightOff(); Interface_waitLightOn(); LCD_setPosition(1,0); dbprint("Hold north + level..\n"); } if (Magnetometer_isNorth() && holdingCalibrate && Timer_isExpired(TIMER_TEST)) { LCD_setPosition(1,0); dbprint("Yaw done!\n"); Interface_yawLightsOff(); Interface_readyLightOn(); Interface_waitLightOff(); holdingCalibrate = FALSE; DELAY(STARTUP_DELAY); return SUCCESS; } else if (!Magnetometer_isNorth() && holdingCalibrate) { holdingCalibrate = FALSE; Timer_stop(TIMER_TEST); LCD_setPosition(1,0); dbprint(" \n"); Interface_readyLightOn(); Interface_waitLightOff(); } #ifdef DEBUG_MAGNETOMETER if (Timer_isExpired(TIMER_TEST2)) { LCD_setPosition(3,0); dbprint("Mag: %.2f\n",Magnetometer_getHeading()); Timer_new(TIMER_TEST2, PRINT_DELAY); } #endif break; } Magnetometer_runSM(); Accelerometer_runSM(); Interface_runSM(); } return (SUCCESS); }
int main(void) { //initializations Board_init(); Board_configure(USE_SERIAL | USE_LCD | USE_TIMER); Interface_init(); DELAY(5); dbprint("Interface online.\n"); Timer_new(TIMER_TEST, LIGHT_ON_DELAY); state = 1; //cycle and check if buttons are pressed, if so, turn light on for 3 seconds while(1) { switch (state) { case READY_LIGHT: if (Timer_isExpired(TIMER_TEST)) { Interface_clearAll(); Interface_readyLightOn(); LCD_setPosition(1,0); dbprint("Ready light. \n"); Timer_new(TIMER_TEST, LIGHT_ON_DELAY); state++; } break; case READY_LIGHT_TIMER: if (Timer_isExpired(TIMER_TEST)) { Interface_clearAll(); Interface_readyLightOnTimer(LIGHT_ON_TIMER_DELAY); LCD_setPosition(1,0); dbprint("Ready light timer.\n"); Timer_new(TIMER_TEST, LIGHT_ON_DELAY); state++; } break; case WAIT_LIGHT: if (Timer_isExpired(TIMER_TEST)) { Interface_clearAll(); Interface_waitLightOn(); LCD_setPosition(0,0); dbprint("Wait light. \n"); Timer_new(TIMER_TEST, LIGHT_ON_DELAY); state++; } break; case WAIT_LIGHT_TIMER: if (Timer_isExpired(TIMER_TEST)) { Interface_clearAll(); Interface_waitLightOnTimer(LIGHT_ON_TIMER_DELAY); LCD_setPosition(0,0); dbprint("Wait light timer. \n"); Timer_new(TIMER_TEST, LIGHT_ON_DELAY); state++; } break; case ERROR_LIGHT: if (Timer_isExpired(TIMER_TEST)) { Interface_clearAll(); Interface_errorLightOn(); LCD_setPosition(0,0); dbprint("Error light. \n"); Timer_new(TIMER_TEST, LIGHT_ON_DELAY); state++; } break; case ERROR_LIGHT_TIMER: if (Timer_isExpired(TIMER_TEST)) { Interface_clearAll(); Interface_errorLightOnTimer(LIGHT_ON_TIMER_DELAY); LCD_setPosition(0,0); dbprint("Error light timer. \n"); Timer_new(TIMER_TEST, LIGHT_ON_DELAY); state++; } break; case FRONT_CALIB_LIGHT: if (Timer_isExpired(TIMER_TEST)) { Interface_clearAll(); CALIBRATE_FRONT_LED = ON; LCD_setPosition(0,0); dbprint("Front calib. light. \n"); Timer_new(TIMER_TEST, LIGHT_ON_DELAY); state++; } break; case BACK_CALIB_LIGHT: if (Timer_isExpired(TIMER_TEST)) { Interface_clearAll(); CALIBRATE_BACK_LED = ON; LCD_setPosition(0,0); dbprint("Back calib. light. \n"); Timer_new(TIMER_TEST, LIGHT_ON_DELAY); state = 1; } break; } // switch Interface_runSM(); } return SUCCESS; }