void initMainBoardDriverDataDispatcherList(void) { // Initializes the DriverDataDispatcherList initDriverDataDispatcherList(&driverDataDispatcherListArray, MAIN_BOARD_DRIVER_DATA_DISPATCHER_LIST_LENGTH); // Configure data dispatcher addLocalDriverDataDispatcher(); // I2C addI2CDriverDataDispatcher("MOTOR_BOARD_I2C_DISPATCHER", &motorBoardI2cInputBuffer, (char(*)[]) &motorBoardI2cInputBufferArray, MAIN_BOARD_I2C_INPUT_DRIVER_DATA_DISPATCHER_BUFFER_LENGTH, &motorBoardI2cOutputStream, &motorBoardI2cInputStream, &motorI2cBusConnection ); // Stream for Mechanical Board 2 addI2CDriverDataDispatcher( "MECHANICAL_BOARD_2_DISPATCHER", &mechanical2BoardInputBuffer, &mechanical2BoardInputBufferArray, MAIN_BOARD_LINK_TO_MECA_BOARD_2_BUFFER_LENGTH, &mechanical2BoardOutputStream, &mechanical2BoardInputStream, &mechanicalBoard2I2cBusConnection); // SERIAL // Uart Stream for motorBoard addUartDriverDataDispatcher( &motorSerialStreamLink, "MOTOR_BOARD_UART_DISPATCHER", SERIAL_PORT_MOTOR); // Uart Stream for mechanicalBoard addUartDriverDataDispatcher( &mechanicalBoard2SerialStreamLink, "MECA2_UART_DISPATCHER", SERIAL_PORT_MECA2); /* // Stream for Air Conditioning addI2CDriverDataDispatcher( "AIR_CONDITIONING_DISPATCHER", &airConditioningBoardInputBuffer, &airConditioningBoardInputBufferArray, MAIN_BOARD_LINK_TO_AIR_CONDITIONING_BOARD_BUFFER_LENGTH, &airConditioningBoardOutputStream, &airConditioningBoardInputStream, &i2cBusConnection); */ }
void runMainBoardPC(bool connectToRobotManagerMode) { connectToRobotManager = connectToRobotManagerMode; setBoardName(MAIN_BOARD_PC_NAME); moveConsole(0, 0, HALF_SCREEN_WIDTH, CONSOLE_HEIGHT); // We use http://patorjk.com/software/taag/#p=testall&v=2&f=Acrobatic&t=MOTOR%20BOARD%20PC // with Font : Jerusalem printf(" __ __ _ ___ _ _ ____ ___ _ ____ ____ ____ ____ \r\n"); printf("| \\/ | / \\ |_ _| \\ | | | __ ) / _ \\ / \\ | _ \\| _ \\ | _ \\ / ___|\r\n"); printf("| |\\/| | / _ \\ | || \\| | | _ \\| | | |/ _ \\ | |_) | | | | | |_) | | \r\n"); printf("| | | |/ ___ \\ | || |\\ | | |_) | |_| / ___ \\| _ <| |_| | | __/| |___ \r\n"); printf("|_| |_/_/ \\_|___|_| \\_| |____/ \\___/_/ \\_|_| \\_|____/ |_| \\____|\r\n"); printf("\r\n"); initLogs(DEBUG, (LogHandler(*)[]) &logHandlerListArray, MAIN_BOARD_PC_LOG_HANDLER_LIST_LENGTH, LOG_HANDLER_CATEGORY_ALL_MASK); initConsoleInputStream(&consoleInputStream); initConsoleOutputStream(&consoleOutputStream); addConsoleLogHandler(DEBUG, LOG_HANDLER_CATEGORY_ALL_MASK); appendStringCRLF(getDebugOutputStreamLogger(), getBoardName()); initTimerList((Timer(*)[]) &timerListArray, MAIN_BOARD_PC_TIMER_LENGTH); initBuffer(&consoleInputBuffer, (char(*)[]) &consoleInputBufferArray, MAIN_BOARD_PC_CONSOLE_INPUT_BUFFER_LENGTH, "inputConsoleBuffer", "IN"); initBuffer(&consoleOutputBuffer, (char(*)[]) &consoleOutputBufferArray, MAIN_BOARD_PC_CONSOLE_OUTPUT_BUFFER_LENGTH, "outputConsoleBuffer", "IN"); // Dispatchers initDriverDataDispatcherList((DriverDataDispatcher(*)[]) &driverDataDispatcherListArray, MAIN_BOARD_PC_DATA_DISPATCHER_LIST_LENGTH); addLocalDriverDataDispatcher(); initI2cBus(&motorBoardI2cBus, I2C_BUS_TYPE_MASTER, I2C_BUS_PORT_1); initI2cBusConnection(&motorBoardI2cBusConnection, &motorBoardI2cBus, MOTOR_BOARD_PC_I2C_ADDRESS); addI2CDriverDataDispatcher("MOTOR_BOARD_DISPATCHER", &motorBoardInputBuffer, (char(*)[]) &motorBoardInputBufferArray, MAIN_BOARD_PC_DATA_MOTOR_BOARD_DISPATCHER_BUFFER_LENGTH, &motorBoardOutputStream, &motorBoardInputStream, &motorBoardI2cBusConnection ); if (connectToRobotManager) { // Open the serial Link between RobotManager (C# Project) and the MainBoardPc openSerialLink(&robotManagerSerialStreamLink, &robotManagerInputBuffer, (char(*)[]) &robotManagerInputBufferArray, ROBOT_MANAGER_INPUT_BUFFER_LENGTH, &robotManagerOutputBuffer, (char(*)[]) &robotManagerOutputBufferArray, ROBOT_MANAGER_OUTPUT_BUFFER_LENGTH, &robotManagerOutputStream, SERIAL_PORT_ROBOT_MANAGER, 0); } // CONFIG initRobotConfigPc(&robotConfig); // EEPROM initEepromPc(&eeprom, "TODO"); initEepromFile(&eeprom); // Clock initPcClock(&clock); // Temperature initTemperaturePc(&temperature); // I2C Debug initI2CDebugBuffers(&i2cMasterDebugInputBuffer, (char(*)[]) &i2cMasterDebugInputBufferArray, MAIN_BOARD_PC_I2C_DEBUG_MASTER_IN_BUFFER_LENGTH, &i2cMasterDebugOutputBuffer, (char(*)[]) &i2cMasterDebugOutputBufferArray, MAIN_BOARD_PC_I2C_DEBUG_MASTER_OUT_BUFFER_LENGTH); // Init the drivers initDrivers(&driverRequestBuffer, (char(*)[]) &driverRequestBufferArray, MAIN_BOARD_PC_REQUEST_DRIVER_BUFFER_LENGTH, &driverResponseBuffer, (char(*)[]) &driverResponseBufferArray, MAIN_BOARD_PC_RESPONSE_DRIVER_BUFFER_LENGTH); // Get test driver for debug purpose addDriver(testDriverGetDescriptor(), TRANSMIT_LOCAL); // Devices initDeviceList((Device(*)[]) &deviceListArray, MAIN_BOARD_PC_DEVICE_LIST_LENGTH); // addLocalDevice(getTestDeviceInterface(), getTestDeviceDescriptor()); testDevice = addI2cRemoteDevice(getTestDeviceInterface(), MOTOR_BOARD_PC_I2C_ADDRESS); testDevice->deviceHandleNotification = mainBoardDeviceHandleNotification; // LOCAL BOARD addLocalDevice(getADCDeviceInterface(), getADCDeviceDescriptor()); addLocalDevice(getStrategyDeviceInterface(), getStrategyDeviceDescriptor()); addLocalDevice(getSystemDeviceInterface(), getSystemDeviceDescriptor()); addLocalDevice(getRobotConfigDeviceInterface(), getRobotConfigDeviceDescriptor(&robotConfig)); addLocalDevice(getI2cMasterDebugDeviceInterface(), getI2cMasterDebugDeviceDescriptor()); addLocalDevice(getDataDispatcherDeviceInterface(), getDataDispatcherDeviceDescriptor()); addLocalDevice(getServoDeviceInterface(), getServoDeviceDescriptor()); addLocalDevice(getTimerDeviceInterface(), getTimerDeviceDescriptor()); addLocalDevice(getClockDeviceInterface(), getClockDeviceDescriptor(&clock)); // addLocalDevice(getFileDeviceInterface(), getFileDeviceDescriptor()); addLocalDevice(getEepromDeviceInterface(), getEepromDeviceDescriptor(&eeprom)); addLocalDevice(getLogDeviceInterface(), getLogDeviceDescriptor()); addLocalDevice(getLCDDeviceInterface(), getLCDDeviceDescriptor()); addLocalDevice(getTemperatureSensorDeviceInterface(), getTemperatureSensorDeviceDescriptor(&temperature)); addLocalDevice(getNavigationDeviceInterface(), getNavigationDeviceDescriptor()); initStartMatch(&startMatch, isMatchStartedPc, mainBoardPcWaitForInstruction, &eeprom); addLocalDevice(getStartMatchDeviceInterface(), getStartMatchDeviceDescriptor(&startMatch)); // MOTOR BOARD addI2cRemoteDevice(getBatteryDeviceInterface(), MOTOR_BOARD_PC_I2C_ADDRESS); // addI2cRemoteDevice(getEepromDeviceInterface(), MOTOR_BOARD_PC_I2C_ADDRESS); addI2cRemoteDevice(getPIDDeviceInterface(), MOTOR_BOARD_PC_I2C_ADDRESS); addI2cRemoteDevice(getMotorDeviceInterface(), MOTOR_BOARD_PC_I2C_ADDRESS); addI2cRemoteDevice(getCodersDeviceInterface(), MOTOR_BOARD_PC_I2C_ADDRESS); addI2cRemoteDevice(getTrajectoryDeviceInterface(), MOTOR_BOARD_PC_I2C_ADDRESS); addI2cRemoteDevice(getMotionDeviceInterface(), MOTOR_BOARD_PC_I2C_ADDRESS); addI2cRemoteDevice(getRobotKinematicsDeviceInterface(), MOTOR_BOARD_PC_I2C_ADDRESS); addI2cRemoteDevice(getMotionSimulationDeviceInterface(), MOTOR_BOARD_PC_I2C_ADDRESS); initDevices(); delaymSec(100); setDebugI2cEnabled(false); // Ping if (!pingDriverDataDispatcherList()) { printf("PING PROBLEM !"); } // Set Clock for Motor Board ! // Read Clock ClockData* clockData = clock.readClock(&clock); // TODO : Change Dispatcher Index ... writeDateRemoteClockData(clockData, 0x01); writeHourRemoteClockData(clockData, 0x01); // testDriverIntensive(100); startTimerList(); while (1) { mainBoardPcWaitForInstruction(&startMatch); } // TODO : ShowEnd }