int main(void) { main_init(); tx_data[0] = 0; tx_data[1] = 0; tx_data[2] = 0; tx_data[3] = 0; tx_data[4] = 0; tx_data[5] = 0; tx_data[6] = 0; tx_data[7] = 0; new_can_data = false; while (1) { if (sys_time_check_and_ack_timer(0)) { main_periodic_task(); } main_event_task(); } return 0; }
int main(void) { // not calling mcu_init with PERIPHERALS_AUTO_INIT // rather explicitly init only sys_time mcu_arch_init(); sys_time_init(); gpio_setup_output(TEST_GPIO1); gpio_setup_output(TEST_GPIO2); unsigned int tmr_2 = sys_time_register_timer(2, NULL); sys_time_register_timer(1, main_periodic); mcu_int_enable(); while (1) { if (sys_time_check_and_ack_timer(tmr_2)) { main_periodic_2(); } } return 0; }
void handle_periodic_tasks_ap(void) { if (sys_time_check_and_ack_timer(sensors_tid)) { sensors_task(); } #if USE_BARO_BOARD if (sys_time_check_and_ack_timer(baro_tid)) { baro_periodic(); } #endif if (sys_time_check_and_ack_timer(navigation_tid)) { navigation_task(); } #ifndef AHRS_TRIGGERED_ATTITUDE_LOOP if (sys_time_check_and_ack_timer(attitude_tid)) { attitude_loop(); } #endif if (sys_time_check_and_ack_timer(modules_tid)) { modules_periodic_task(); } if (sys_time_check_and_ack_timer(monitor_tid)) { monitor_task(); } if (sys_time_check_and_ack_timer(telemetry_tid)) { reporting_task(); LED_PERIODIC(); } }
void handle_periodic_tasks_fbw(void) { if (sys_time_check_and_ack_timer(0)) periodic_task_fbw(); }
void px4flash_event(void) { if (PX4IO_PORT->char_available(PX4IO_PORT->periph)) { if (!setToBootloaderMode) { //ignore anything coming from IO if not in bootloader mode (which should be nothing) } else { //relay everything from IO to the laptop while (PX4IO_PORT->char_available(PX4IO_PORT->periph)) { unsigned char b = PX4IO_PORT->get_byte(PX4IO_PORT->periph); FLASH_PORT->put_byte(FLASH_PORT->periph, b); } } } //TODO: check if bootloader timeout was surpassed if (FLASH_PORT->char_available(FLASH_PORT->periph) && !setToBootloaderMode) { // TMP TEST // while (FLASH_PORT->char_available(FLASH_PORT->periph)) { // unsigned char bla = FLASH_PORT->get_byte(FLASH_PORT->periph); // FLASH_PORT->put_byte(FLASH_PORT->periph,bla); // } // return; //check whether this is flash related communication, and for who (ap/fbw) int state = 0; while (state < 4 && FLASH_PORT->char_available(FLASH_PORT->periph)) { unsigned char b = FLASH_PORT->get_byte(FLASH_PORT->periph); switch (state) { case (0) : if (b == 'p') { state++; } else { return; } break; case (1) : if (b == 'p') { state++; } else { return; } break; case (2) : if (b == 'r') { state++; } else { return; } break; case (3) : if (b == 'z') { state++; } else { return; } break; default : break; } } if (state != 4) {return;} //TODO: check if/how this interferes with flashing original PX4 firmware unsigned char target = FLASH_PORT->get_byte(FLASH_PORT->periph); if (target == '1') { //target ap //the target is the ap, so reboot to PX4 bootloader scb_reset_system(); } else { // target fbw //the target is the fbw, so reboot the fbw and switch to relay mode //first check if the bootloader has not timeout: if (sys_time_check_and_ack_timer(px4iobl_tid) || px4ioRebootTimeout) { px4ioRebootTimeout = TRUE; sys_time_cancel_timer(px4iobl_tid); FLASH_PORT->put_byte(FLASH_PORT->periph, 'T'); FLASH_PORT->put_byte(FLASH_PORT->periph, 'I'); FLASH_PORT->put_byte(FLASH_PORT->periph, 'M'); FLASH_PORT->put_byte(FLASH_PORT->periph, 'E'); FLASH_PORT->put_byte(FLASH_PORT->periph, 'O'); FLASH_PORT->put_byte(FLASH_PORT->periph, 'U'); FLASH_PORT->put_byte(FLASH_PORT->periph, 'T'); // use 7 chars as answer return; } { // FBW OK OK hollay hollay :) FLASH_PORT->put_byte(FLASH_PORT->periph, 'F'); FLASH_PORT->put_byte(FLASH_PORT->periph, 'B'); FLASH_PORT->put_byte(FLASH_PORT->periph, 'W'); FLASH_PORT->put_byte(FLASH_PORT->periph, 'O'); FLASH_PORT->put_byte(FLASH_PORT->periph, 'K'); FLASH_PORT->put_byte(FLASH_PORT->periph, 'O'); FLASH_PORT->put_byte(FLASH_PORT->periph, 'K'); // use 7 chars as answer } //stop all intermcu communication: disable_inter_comm(true); /* * The progdieshit define is very usefull, if for whatever reason the (normal, not bootloader) firmware on the IO chip became disfunct. * In that case: * 1. enable this define * 2. build and upload the fmu f4 chip (ap target in pprz center) * 3. build the io code, and convert the firmware using the following command: * /home/houjebek/paparazzi/sw/tools/px4/px_mkfw.py --prototype "/home/houjebek/px4/Firmware/Images/px4io-v2.prototype" --image /home/houjebek/paparazzi/var/aircrafts/Iris/fbw/fbw.bin > /home/houjebek/paparazzi/var/aircrafts/Iris/fbw/fbw.px4 * 4. Start the following command: * /home/houjebek/paparazzi/sw/tools/px4/px_uploader.py --port "/dev/ttyACM0" /home/houjebek/paparazzi/var/aircrafts/Iris/fbw/fbw.px4 * 5a. Either, boot the Pixhawk (reconnect usb) holding the IO reset button until the FMU led stops blinking fast (i.e. exits its own bootloader) * 5b Or, press the IO reset button on the pixhawk * 6. Watch the output of the command of step 4, it should recognize the IO bootloader and start flashing. If not try repeating step 5a. * 7. Don forget to disable the define and upload the ap again :) */ // #define progdieshit #ifndef progdieshit //send the reboot to bootloader command: static struct IOPacket dma_packet; dma_packet.count_code = 0x40 + 0x01; dma_packet.crc = 0; dma_packet.page = PX4IO_PAGE_SETUP; dma_packet.offset = PX4IO_P_SETUP_REBOOT_BL; dma_packet.regs[0] = PX4IO_REBOOT_BL_MAGIC; dma_packet.crc = crc_packet(&dma_packet); struct IOPacket *pkt = &dma_packet; uint8_t *p = (uint8_t *)pkt; PX4IO_PORT->put_byte(PX4IO_PORT->periph, p[0]); PX4IO_PORT->put_byte(PX4IO_PORT->periph, p[1]); PX4IO_PORT->put_byte(PX4IO_PORT->periph, p[2]); PX4IO_PORT->put_byte(PX4IO_PORT->periph, p[3]); PX4IO_PORT->put_byte(PX4IO_PORT->periph, p[4]); PX4IO_PORT->put_byte(PX4IO_PORT->periph, p[5]); sys_time_usleep(5000); // this seems to be close to the minimum delay necessary to process this packet at the IO side //the pixhawk IO chip should respond with: // 0x00 ( PKT_CODE_SUCCESS ) // 0xe5 // 0x32 // 0x0a //After that, the IO chips reboots into bootloader mode, in which it will stay for a short period //The baudrate in bootloader mode ic changed to 115200 (normal operating baud is 1500000, at least for original pixhawk fmu firmware) //state machine state = 0; while (state < 4 && PX4IO_PORT->char_available(PX4IO_PORT->periph)) { unsigned char b = PX4IO_PORT->get_byte(PX4IO_PORT->periph); switch (state) { case (0) : if (b == PKT_CODE_SUCCESS) { state++; } else { state = 0; } break; case (1) : if (b == 0xe5) { state++; } else { state = 0; } break; case (2) : if (b == 0x32) { state++; } else { state = 0; } break; case (3) : if (b == 0x0a) { state++; } else { state = 0; } break; default : break; } } #else int state = 4; #endif if (state == 4) { uart_periph_set_baudrate(PX4IO_PORT->periph, B115200); /* look for the bootloader for 150 ms */ int ret = 0; for (int i = 0; i < 15 && !ret ; i++) { sys_time_usleep(10000); //send a get_sync command in order to keep the io in bootloader mode PX4IO_PORT->put_byte(PX4IO_PORT->periph, PROTO_GET_SYNC); PX4IO_PORT->put_byte(PX4IO_PORT->periph, PROTO_EOC); //get_sync should be replied with, so check if that happens and //all other bytes are discarded, hopefully those were not important //(they may be caused by sending multiple syncs) while (PX4IO_PORT->char_available(PX4IO_PORT->periph)) { unsigned char b = PX4IO_PORT->get_byte(PX4IO_PORT->periph); if (b == PROTO_INSYNC) { setToBootloaderMode = true; ret = 1; break; } } } if (setToBootloaderMode) { //if successfully entered bootloader mode, clear any remaining bytes (which may have a function, but I did not check) while (PX4IO_PORT->char_available(PX4IO_PORT->periph)) {PX4IO_PORT->get_byte(PX4IO_PORT->periph);} } } else { FLASH_PORT->put_byte(FLASH_PORT->periph, 'E'); //TODO: find out what the PX4 protocol for error feedback is... FLASH_PORT->put_byte(FLASH_PORT->periph, 'R'); FLASH_PORT->put_byte(FLASH_PORT->periph, 'R'); FLASH_PORT->put_byte(FLASH_PORT->periph, 'O'); FLASH_PORT->put_byte(FLASH_PORT->periph, 'R'); FLASH_PORT->put_byte(FLASH_PORT->periph, '!'); FLASH_PORT->put_byte(FLASH_PORT->periph, ' '); // use 7 chars as answer } } } else if (FLASH_PORT->char_available(FLASH_PORT->periph)) { //already in bootloader mode, just directly relay data while (FLASH_PORT->char_available(FLASH_PORT->periph)) { unsigned char b = FLASH_PORT->get_byte(FLASH_PORT->periph); PX4IO_PORT->put_byte(PX4IO_PORT->periph, b); } } }