/*! Zeigt den internen Status der Sensoren mit den LEDs an */ void show_sensors(void){ uint8 led=0x00; led_t * status = (led_t *)&led; #ifdef TEST_AVAILABLE_ANALOG (*status).rechts = (sensDistR >> 9) & 0x01; (*status).links = (sensDistL >> 9) & 0x01; (*status).rot = (sensLineL >> 9) & 0x01; (*status).orange = (sensLineR >> 9) & 0x01; (*status).gelb = (sensLDRL >> 9) & 0x01; (*status).gruen = (sensLDRR >> 9) & 0x01; (*status).tuerkis = (sensBorderL >> 9) & 0x01; (*status).weiss = (sensBorderR >> 9) & 0x01; #endif #ifdef TEST_AVAILABLE_DIGITAL (*status).rechts = sensEncR & 0x01; (*status).links = sensEncL & 0x01; (*status).rot = sensTrans & 0x01; (*status).orange = sensError & 0x01; (*status).gelb = sensDoor & 0x01; (*status).gruen = (sensMouseDX >>1) & 0x01; (*status).tuerkis = (sensMouseDY >>1) & 0x01; (*status).weiss = RC5_Code & 0x01; #endif LED_set(led); }
/*! * Schaltet einzelne LEDs aus * andere werden nicht beeinflusst * @param LED Bitmaske der anzuschaltenden LEDs */ void LED_off(uint8 LED){ led &= ~LED; LED_set(led); }
/*! * Schaltet einzelne LEDs an * andere werden nicht beeinflusst * @param LED Bitmaske der anzuschaltenden LEDs */ void LED_on(uint8 LED){ led |= LED; LED_set(led); }
void LED_setAll(LED_state s) { LED_set(s,s,s,s); }
void LED_set_ar(LED_state* ss) { LED_set(ss[0], ss[1], ss[2], ss[3]); }
int main() { volatile int temp; volatile int rand_no; int x; hardware_init(); FRDM_KL26Z_LEDs_Configure(); FRDM_KL26Z_SW2_Configure(0,FALLING_EDGE); FRDM_KL26Z_SW1_Configure(PULLUP,FALLING_EDGE); PIT_Configure_interrupt_mode(0.01); NVIC_ClearPendingIRQ(31); NVIC_EnableIRQ(31); LED_set(GREEN,OFF); while(1) { switch(currentstate) { case INIT: sw_count=0; sw2_count=0; PRINTF("SW1 to start"); while(sw_count==0) {} LED_set(GREEN,OFF); currentstate = PLAY; break; case PLAY: PRINTF("when led on, press sw2"); srand(timer_tick); rand_no = rand()%5000; temp=timer_tick; while((timer_tick-temp<rand_no) && (sw2_count==0) ) {} if(sw2_count>0) { currentstate=INIT; break; } LED_set(GREEN,ON); temp=timer_tick; while(((sw2_count==0)&&timer_tick-temp<5000)) {} if(timer_tick-temp>=5000) { PRINTF("too slow"); currentstate=INIT; } else { PRINTF("reaction time: %d MSec \n" ,(timer_tick-temp)); LED_set(GREEN,OFF); currentstate = INIT; } break; default: break; } } return 0; }
/*! * Hauptprogramm des Bots. Diese Schleife kuemmert sich um seine Steuerung. */ int main (void){ #endif #ifdef PC /*! * Hauptprogramm des Bots. Diese Schleife kuemmert sich um seine Steuerung. */ int main (int argc, char *argv[]){ int ch; int start_server = 0; /*!< Wird auf 1 gesetzt, falls -s angegeben wurde */ char *hostname = NULL; /*!< Speichert den per -t uebergebenen Hostnamen zwischen */ // Die Kommandozeilenargumente komplett verarbeiten while ((ch = getopt(argc, argv, "hst:")) != -1) { switch (ch) { case 's': // Servermodus [-s] wird verlangt start_server = 1; break; case 't': // Hostname, auf dem ct-Sim laeuft wurde // uebergeben. Der String wird in hostname // gesichert. { const int len = strlen(optarg); hostname = malloc(len + 1); if (NULL == hostname) exit(1); strcpy(hostname, optarg); } break; case 'h': default: // -h oder falscher Parameter, Usage anzeigen usage(); } } argc -= optind; argv += optind; if (start_server != 0) // Soll der TCP-Server gestartet werden? { printf("ARGV[0]= %s\n",argv[1]); tcp_server_init(); tcp_server_run(); } else { printf("c't-Bot\n"); if (hostname) // Hostname wurde per Kommandozeile uebergeben tcp_hostname = hostname; else { // Der Zielhost wird per default durch das Macro IP definiert und // tcp_hostname mit einer Kopie des Strings initialisiert. tcp_hostname = malloc(strlen(IP) + 1); if (NULL == tcp_hostname) exit(1); strcpy(tcp_hostname, IP); } } #endif #ifdef TEST_AVAILABLE_MOTOR uint16 calls=0; /*!< Im Testfall zaehle die Durchlaeufe */ #endif #ifdef LOG_AVAILABLE printf("Logging is on ("); #ifdef LOG_UART_AVAILABLE printf("UART"); #endif #ifdef LOG_CTSIM_AVAILABLE printf("CTSIM"); #endif #ifdef LOG_DISPLAY_AVAILABLE printf("DISPLAY"); #endif #ifdef LOG_STDOUT_AVAILABLE printf("STDOUT"); #endif printf(")\n"); #else printf("Logging is off!\n "); #endif init(); #ifdef WELCOME_AVAILABLE display_cursor(1,1); display_printf("c't-Roboter"); LED_set(0x00); #ifdef LOG_AVAILABLE LOG_DEBUG(("Hallo Welt!")); #endif #endif #ifdef TEST_AVAILABLE_COUNTER display_screen=2; resets=eeprom_read_byte(&resetsEEPROM)+1; eeprom_write_byte(&resetsEEPROM,resets); /* Lege den Grund für jeden Reset im EEPROM ab */ eeprom_write_byte(&resetInfoEEPROM+resets,reset_flag); #endif /*! Hauptschleife des Bot */ for(;;){ #ifdef MCU bot_sens_isr(); #endif #ifdef TEST_AVAILABLE show_sensors(); #endif // Testprogramm, dass den Bot erst links, dann rechtsrum dreht #ifdef TEST_AVAILABLE_MOTOR calls++; if (calls == 1) motor_set(BOT_SPEED_SLOW,-BOT_SPEED_SLOW); else if (calls == 501) motor_set(-BOT_SPEED_SLOW,BOT_SPEED_SLOW); else if (calls== 1001) motor_set(BOT_SPEED_STOP,BOT_SPEED_STOP); else #endif // hier drin steckt der Verhaltenscode #ifdef BEHAVIOUR_AVAILABLE if (sensors_initialized ==1 ) bot_behave(); else printf("sensors not initialized\n"); #endif #ifdef MCU #ifdef BOT_2_PC_AVAILABLE // static int16 lastTimeCom =0; bot_2_pc_inform(); // Den PC ueber Sensorern und aktuatoren informieren bot_2_pc_listen(); // Kommandos vom PC empfangen // if (timer_get_s() != lastTimeCom) { // sollte genau 1x pro Sekunde zutreffen // lastTimeCom = timer_get_s(); // } #endif #endif #ifdef LOG_AVAILABLE //LOG_DEBUG(("LOG TIME %d s", timer_get_s())); #endif // Alles Anzeigen #ifdef DISPLAY_AVAILABLE display(); #endif #ifdef PC wait_for_time(100000); #endif #ifdef MCU // delay(10); #endif } /*! Falls wir das je erreichen sollten ;-) */ return 1; }