/*! * 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; }
/** * Behandelt die Kommandozeilen-Argumente * \param argc Anzahl der Argumente * \param *argv Zeiger auf String-Array der Argumente */ void hand_cmd_args(int argc, char * argv[]) { /* 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); int ch; /* Die Kommandozeilenargumente komplett verarbeiten */ while ((ch = getopt(argc, argv, "hsTu:Et:Mm:c:l:e:d:a:i:fk:o:F:")) != -1) { argc -= optind; argv += optind; switch (ch) { case 's': { #ifdef BOT_2_SIM_AVAILABLE /* Servermodus [-s] wird verlangt */ printf("ARGV[0]= %s\n", argv[0]); tcp_server_init(); tcp_server_run(1000); // beendet per exit() #else puts("Fehler, Binary wurde ohne BOT_2_SIM_AVAILABLE compiliert!"); exit(1); #endif // BOT_2_SIM_AVAILABLE break; } case 'T': { #ifdef BOT_2_SIM_AVAILABLE /* Testclient starten */ tcp_test_client_init(); tcp_test_client_run(1000); // beendet per exit() #else puts("Fehler, Binary wurde ohne BOT_2_SIM_AVAILABLE compiliert!"); exit(1); #endif // BOT_2_SIM_AVAILABLE break; } case 'u': { #ifdef ARM_LINUX_BOARD long long int n = atoll(optarg); uart_test((uint32_t) n); #endif break; } case 't': { /* Hostname, auf dem ct-Sim laeuft, wurde uebergeben. Der String wird in hostname gesichert. */ const size_t len = strlen(optarg) + 1; if (len > 255) { puts("hostname ungueltig"); exit(1); } tcp_hostname = realloc(tcp_hostname, len); if (tcp_hostname == NULL) { exit(1); } strcpy(tcp_hostname, optarg); break; } case 'a': { /* Bot-Adresse wurde uebergeben */ int addr = atoi(optarg); if ((addr >= CMD_SIM_ADDR) && (addr != CMD_BROADCAST)) { puts("Unzulaessige Bot-Adresse!"); exit(1); } set_bot_address(addr); break; } case 'i': { /* angegebenes BotFS Image verwenden */ #ifdef BOT_FS_AVAILABLE const size_t len = strlen(optarg) + 1; if (len > 1024) { puts("Image-Pfad ungueltig"); exit(1); } botfs_volume_image_file = malloc(len); if (NULL == botfs_volume_image_file) { exit(1); } strcpy(botfs_volume_image_file, optarg); printf("Verwende \"%s\" als BotFS-Volume-Image\n", botfs_volume_image_file); #else puts("Fehler, Binary wurde ohne BOT_FS_AVAILABLE compiliert!"); exit(1); #endif // BOT_FS_AVAILABLE break; } case 'M': { /* Dateiname fuer die Map wurde uebergeben. Der String wird in from gesichert. */ #ifndef MAP_AVAILABLE puts("ACHTUNG, das Programm wurde ohne MAP_AVAILABLE uebersetzt, die Option -M steht derzeit also NICHT zur Verfuegung."); puts("um dennoch Karten zu konvertieren, bitte im Quelltext in der Datei ct-Bot.h die Kommentarzeichen vor MAP_AVAILABLE entfernen"); puts("und neu compilieren."); exit(1); #endif #ifdef MMC_VM_AVAILABLE puts("Executable wurde mit MMC_VM_AVAILABLE compiliert."); puts("Um Karten des echten Bots einlesen zu koennen, bitte den Code bitte ohne MMC_VM_AVAILABLE neu uebersetzen."); exit(1); #endif #ifdef MAP_AVAILABLE /* Karte in pgm konvertieren */ #ifndef BOT_FS_AVAILABLE if (argc != 1) { usage(); exit(1); } const size_t len = strlen(argv[0]) + 1; if (len > 1024) { puts("Dateiname ungueltig"); exit(1); } printf("Konvertiere Karte %s in PGM %s\n", argv[0], "map.pgm"); map_read(argv[0]); #else uint8_t buffer[BOTFS_BLOCK_SIZE]; if (botfs_init(botfs_volume_image_file, buffer, False) != 0) { puts("BotFS konnte nicht initialisiert werden"); exit(1); } if (map_init() != 0) { puts("Map-Subsystem konnte nicht initialisiert werde"); exit(1); } #endif // BOT_FS_AVAILABLE map_to_pgm("map.pgm"); exit(0); #endif // MAP_AVAILABLE } case 'm': { #ifndef MAP_AVAILABLE puts("ACHTUNG, das Programm wurde ohne MAP_AVAILABLE uebersetzt, die Option -m steht derzeit also NICHT zur Verfuegung."); puts("um dennoch Karten zu konvertieren, bitte im Quelltext in der Datei ct-Bot.h die Kommentarzeichen vor MAP_AVAILABLE entfernen"); puts("und neu compilieren."); exit(1); #else /* Karte einlesen */ const size_t len = strlen(optarg) + 1; if (len > 1024) { puts("Dateiname ungueltig"); exit(1); } printf("Lese Karte von \"%s\" ein\n", optarg); #ifdef BOT_FS_AVAILABLE uint8_t buffer[BOTFS_BLOCK_SIZE]; if (botfs_init(botfs_volume_image_file, buffer, False) != 0) { puts("BotFS konnte nicht initialisiert werden"); exit(1); } #endif // BOT_FS_AVAILABLE map_read(optarg); #endif // MAP_AVAILABLE break; } case 'f': { /* BotFS Tool */ #ifdef BOT_FS_AVAILABLE char * image = argv[0]; botfs_management(image); #else puts("Fehler, Binary wurde ohne BOT_FS_AVAILABLE compiliert!"); exit(1); #endif // BOT_FS_AVAILABLE break; } case 'k' : { /* BotFS file copy */ #ifdef BOT_FS_AVAILABLE char * image = optarg; char buffer[BOTFS_BLOCK_SIZE]; if (botfs_init(image, buffer, False) != 0) { printf("Konnte BotFS mit Image \"%s\" nicht initialisieren\n", image); exit(1); } if (argc != 2) { usage(); exit(1); } const char * source_file = argv[0]; const char * dest_file = argv[1]; if (botfs_copy_file(dest_file, source_file, buffer) == 0) { puts("Datei erfolgreich kopiert"); exit(0); } else { puts("Fehler beim Kopieren"); exit(1); } #else puts("Fehler, Binary wurde ohne BOT_FS_AVAILABLE compiliert!"); exit(1); #endif // BOT_FS_AVAILABLE } case 'o' : { /* BotFS file extract */ #ifdef BOT_FS_AVAILABLE char * image = optarg; char buffer[BOTFS_BLOCK_SIZE]; if (botfs_init(image, buffer, False) != 0) { printf("Konnte BotFS mit Image \"%s\" nicht initialisieren\n", image); exit(1); } if (argc != 2) { usage(); exit(1); } const char * source_file = argv[0]; const char * dest_file = argv[1]; if (botfs_extract_file(dest_file, source_file, 0, 0, buffer) == 0) { puts("Datei erfolgreich kopiert"); exit(0); } else { puts("Fehler beim Kopieren"); exit(1); } #else puts("Fehler, Binary wurde ohne BOT_FS_AVAILABLE compiliert!"); exit(1); #endif // BOT_FS_AVAILABLE } case 'F': { /* Fat16-Tool */ #ifdef BOT_FS_AVAILABLE botfs_read_fat16(optarg); exit(0); #else puts("Fehler, Binary wurde ohne BOT_FS_AVAILABLE compiliert!"); exit(1); #endif // BOT_FS_AVAILABLE } case 'c': { /* Datei fuer den Bot (mini-fat) soll erzeugt werden. */ const int len = strlen(optarg) + 1; if (len > 1024) { puts("Dateiname ungueltig"); exit(1); } if (argc != 2) { usage(); exit(1); } const size_t id_len = strlen(argv[0]); if (id_len >= MMC_FILENAME_MAX) { puts("ID zu lang"); exit(1); } const int size = atoi(argv[1]); printf("Mini-Fat-Datei (%s) mit %d kByte und ID=%s fuer den Bot soll erstellt werden.\n", optarg, size, argv[0]); create_mini_fat_file(optarg, argv[0], size); exit(0); } case 'e': { /* Datei fuer den Sim (mini-fat) soll erzeugt werden. */ if (argc != 2) { usage(); exit(1); } const int size = atoi(argv[1]); uint32_t addr = atoi(optarg); printf("Mini-Fat-Datei mit ID=%s an Adresse 0x%x mit %d kByte auf der emulierten MMC soll erstellt werden.\n", argv[0], addr, size); create_emu_mini_fat_file(addr, argv[0], size); exit(0); } case 'd': { /* Datei fuer den Sim (mini-fat) soll geloescht werden. */ if (argc != 0) { usage(); exit(1); } printf("Mini-Fat-Datei mit ID %s auf der emulierten MMC soll geloescht werden.\n", optarg); delete_emu_mini_fat_file(optarg); exit(0); } case 'l': { #ifdef BOT_FS_AVAILABLE /* Speedlog-Datei soll in txt konvertiert werden */ const size_t len = strlen(optarg) + 1; if (len > 1024) { puts("Dateiname ungueltig"); exit(1); } convert_slog_file(optarg); exit(0); #else puts("Fehler, Binary wurde ohne BOT_FS_AVAILABLE compiliert!"); exit(1); #endif // BOT_FS_AVAILABLE } case 'E': { /* EEPROM-Init */ printf("EEPROM soll mit den Daten einer eep-Datei initialisiert werden.\n"); if (init_eeprom_man(1) != 0) { puts("Fehler bei EEPROM-Initialisierung!"); } else { puts("done."); } exit(0); } case 'h': default: /* -h oder falscher Parameter, Usage anzeigen */ usage(); exit(0); } } }