int main( void ) { unsigned char inc; unsigned int rx_time=0, tx_time=0; mcu_init(); sys_time_init(); led_init(); VCOM_allow_linecoding(1); #ifdef USE_USB_SERIAL VCOM_init(); #endif mcu_int_enable(); LED_ON(3); #ifdef USE_UART0 while(1) { if (T0TC > (rx_time+((PCLK / T0_PCLK_DIV) / BLINK_MIN))) LED_OFF(1); if (T0TC > (tx_time+((PCLK / T0_PCLK_DIV) / BLINK_MIN))) LED_OFF(2); if (uart_char_available(&uart0) && VCOM_check_free_space(1)) { LED_ON(1); rx_time = T0TC; inc = uart_getch(&uart0); VCOM_putchar(inc); } if (VCOM_check_available() && uart_check_free_space(&uart0, 1)) { LED_ON(2); tx_time = T0TC; inc = VCOM_getchar(); uart_transmit(&uart0, inc); } } #else while(1) { if (T0TC > (rx_time+((PCLK / T0_PCLK_DIV) / BLINK_MIN))) LED_OFF(1); if (T0TC > (tx_time+((PCLK / T0_PCLK_DIV) / BLINK_MIN))) LED_OFF(2); if (uart_char_available(&uart1) && VCOM_check_free_space(1)) { LED_ON(1); rx_time = T0TC; inc = uart_getch(&uart1); VCOM_putchar(inc); } if (VCOM_check_available() && uart_check_free_space(&uart1, 1)) { LED_ON(2); tx_time = T0TC; inc = VCOM_getchar(); uart_transmit(&uart1, inc); } } #endif return 0; }
/** * @brief sdlogger_spi_direct_periodic * Periodic function called at module frequency */ void sdlogger_spi_direct_periodic(void) { sdcard_spi_periodic(&sdcard1); #if SDLOGGER_ON_ARM if(autopilot_motors_on) { sdlogger_spi.do_log = 1; } else { sdlogger_spi.do_log = 0; } #endif switch (sdlogger_spi.status) { case SDLogger_Initializing: if (sdcard1.status == SDCard_Idle) { sdcard_spi_read_block(&sdcard1, 0x00002000, &sdlogger_spi_direct_index_received); sdlogger_spi.status = SDLogger_RetreivingIndex; } break; case SDLogger_Ready: if ((sdlogger_spi.do_log == 1) && sdcard1.status == SDCard_Idle) { LOGGER_LED_ON; sdcard_spi_multiwrite_start(&sdcard1, sdlogger_spi.next_available_address); sdlogger_spi.status = SDLogger_Logging; } break; case SDLogger_Logging: /* This line is NOT unit-tested because it is an inline function */ #if PERIODIC_TELEMETRY periodic_telemetry_send_Logger(DefaultPeriodic, &pprzlog_tp.trans_tx, &sdlogger_spi.device); #endif /* Check if SD Card buffer is full and SD Card is ready for new data */ if (sdlogger_spi.sdcard_buf_idx > 512 && sdcard1.status == SDCard_MultiWriteIdle) { sdcard_spi_multiwrite_next(&sdcard1, &sdlogger_spi_direct_multiwrite_written); } /* Check if switch is flipped to stop logging */ if (sdlogger_spi.do_log == 0) { sdlogger_spi.status = SDLogger_LoggingFinalBlock; } break; case SDLogger_LoggingFinalBlock: if (sdcard1.status == SDCard_MultiWriteIdle) { if (sdlogger_spi.sdcard_buf_idx > 512) { sdcard_spi_multiwrite_next(&sdcard1, &sdlogger_spi_direct_multiwrite_written); } else if (sdlogger_spi.sdcard_buf_idx > 1) { /* Fill with trailing zero's */ for (uint16_t i = sdlogger_spi.sdcard_buf_idx; i < (SD_BLOCK_SIZE+1); i++) { sdcard1.output_buf[i] = 0x00; } sdcard_spi_multiwrite_next(&sdcard1, &sdlogger_spi_direct_multiwrite_written); } else if (sdlogger_spi.sdcard_buf_idx == 1) { sdcard_spi_multiwrite_stop(&sdcard1); sdlogger_spi.status = SDLogger_StoppedLogging; } } break; case SDLogger_StoppedLogging: if (sdcard1.status == SDCard_Idle) { sdcard_spi_read_block(&sdcard1, 0x00002000, &sdlogger_spi_direct_index_received); sdlogger_spi.status = SDLogger_GettingIndexForUpdate; } break; case SDLogger_UpdatingIndex: if (sdcard1.status == SDCard_Idle) { LOGGER_LED_OFF; sdlogger_spi.status = SDLogger_Ready; } break; case SDLogger_Downloading: if (sdcard1.status == SDCard_Idle) { /* Put bytes to the buffer until all is written or buffer is full */ for (uint16_t i = sdlogger_spi.sdcard_buf_idx; i < SD_BLOCK_SIZE; i++) { long fd = 0; if (uart_check_free_space(&(DOWNLINK_DEVICE), &fd, 1)) { uart_put_byte(&(DOWNLINK_DEVICE), fd, sdcard1.input_buf[i]); } else { /* No free space left, abort for-loop */ break; } sdlogger_spi.sdcard_buf_idx++; } /* Request next block if entire buffer was written to uart */ if (sdlogger_spi.sdcard_buf_idx >= SD_BLOCK_SIZE) { if (sdlogger_spi.download_length > 0) { sdcard_spi_read_block(&sdcard1, sdlogger_spi.download_address, NULL); sdlogger_spi.download_address++; sdlogger_spi.download_length--; } else { LOGGER_LED_OFF; sdlogger_spi.status = SDLogger_Ready; } sdlogger_spi.sdcard_buf_idx = 0; } } break; default: break; } }