void umain(int argc, char **argv) { int r, i; for (i = 0; i < NBUCKETS; i++) table[i] = NULL; r = rpc_server_init(PORT); if (r < 0) exit(); rpc_server(proc); cprintf("Should not return\n"); }
/** Application entry point. */ int main(void) { static thread_t *shelltp = NULL; /* Initializes a serial-over-USB CDC driver. */ sduObjectInit(&SDU1); sduStart(&SDU1, &serusbcfg); sdStart(&SD3, NULL); chprintf((BaseSequentialStream *)&SD3 , "\n> boot\n"); /* * Activates the USB driver and then the USB bus pull-up on D+. * Note, a delay is inserted in order to not have to disconnect the cable * after a reset. */ usbDisconnectBus(serusbcfg.usbp); chThdSleepMilliseconds(1500); usbStart(serusbcfg.usbp, &usbcfg); usbConnectBus(serusbcfg.usbp); /* Shell manager initialization. */ shellInit(); /* Initialize global objects. */ config_init(); chMtxObjectInit(&robot_pose_lock); /* Initialise timestamp module */ timestamp_stm32_init(); /* bus enumerator init */ static __attribute__((section(".ccm"))) struct bus_enumerator_entry_allocator bus_enum_entries_alloc[MAX_NB_BUS_ENUMERATOR_ENTRIES]; bus_enumerator_init(&bus_enumerator, bus_enum_entries_alloc, MAX_NB_BUS_ENUMERATOR_ENTRIES); /* allocate and init motor manager */ static __attribute__((section(".ccm"))) trajectory_t trajectory_buffer[MAX_NB_TRAJECTORY_BUFFERS]; static __attribute__((section(".ccm"))) float trajectory_points_buffer[ACTUATOR_TRAJECTORY_NB_POINTS * ACTUATOR_TRAJECTORY_POINT_DIMENSION * MAX_NB_TRAJECTORY_BUFFERS]; static __attribute__((section(".ccm"))) motor_driver_t motor_driver_buffer[MAX_NB_MOTOR_DRIVERS]; motor_manager_init(&motor_manager, trajectory_buffer, MAX_NB_TRAJECTORY_BUFFERS, trajectory_points_buffer, MAX_NB_TRAJECTORY_BUFFERS, motor_driver_buffer, MAX_NB_MOTOR_DRIVERS, &bus_enumerator); differential_base_init(); /* Checks if there is any log message from a previous boot */ if (panic_log_read() != NULL) { /* Turns on the user LED if yes */ palClearPad(GPIOC, GPIOC_LED); /* Turn on all LEDs on the front panel. */ palSetPad(GPIOF, GPIOF_LED_READY); palSetPad(GPIOF, GPIOF_LED_DEBUG); palSetPad(GPIOF, GPIOF_LED_ERROR); palSetPad(GPIOF, GPIOF_LED_POWER_ERROR); palSetPad(GPIOF, GPIOF_LED_PC_ERROR); palSetPad(GPIOF, GPIOF_LED_BUS_ERROR); palSetPad(GPIOF, GPIOF_LED_YELLOW_1); palSetPad(GPIOF, GPIOF_LED_YELLOW_2); palSetPad(GPIOF, GPIOF_LED_GREEN_1); palSetPad(GPIOF, GPIOF_LED_GREEN_2); } else { struct netif *ethernet_if; differential_base_tracking_start(); // tracy ip_thread_init(); chThdSleepMilliseconds(1000); ethernet_if = netif_find("ms0"); if (ethernet_if) { dhcp_start(ethernet_if); } sntp_init(); can_bridge_init(); uavcan_node_start(10); rpc_server_init(); message_server_init(); interface_panel_init(); odometry_publisher_init(); #ifdef ENABLE_STREAM #warning "Enabling robot stream can lead to lwip crash. Do not use in match until fixed." stream_init(); #endif } /* main thread, spawns a shell on USB connection. */ while (1) { if (!shelltp && (SDU1.config->usbp->state == USB_ACTIVE)) { shelltp = shellCreate(&shell_cfg1, SHELL_WA_SIZE, USB_SHELL_PRIO); } else if (chThdTerminatedX(shelltp)) { chThdRelease(shelltp); /* Recovers memory of the previous shell. */ shelltp = NULL; /* Triggers spawning of a new shell. */ } chThdSleepMilliseconds(500); } }