void CommandSetup(const void *d) { if (opMode != ACTIVE) { opMode = CONFIGURED; uint32_t baudRate = *(uint32_t*)d; Ecan1Init(F_OSC, baudRate); } }
void BallastNodeInit(void) { nodeId = CAN_NODE_RUDDER_CONTROLLER; // Initialize our ECAN peripheral Ecan1Init(F_OSC, NODE_CAN_BAUD); // Initialize the EEPROM for storing the onboard parameters. enum DATASTORE_INIT x = DataStoreInit(); if (x == DATASTORE_INIT_SUCCESS) { ballastCalData.RestoredCalibration = true; ballastCalData.Calibrated = true; LATAbits.LATA3 = 1; } else if (x == DATASTORE_INIT_FAIL) { FATAL_ERROR(); } // Transmit the ballast angle at 10Hz if (!AddMessageRepeating(&sched, SCHED_ID_BALLAST_ANGLE, 10)) { while (1); } // Transmit status at 4Hz if (!AddMessageRepeating(&sched, SCHED_ID_CUSTOM_LIMITS, 4)) { while (1); } // Transmit temperature at 1Hz if (!AddMessageRepeating(&sched, SCHED_ID_TEMPERATURE, 1)) { while (1); } // Transmit error/status at 2Hz if (!AddMessageRepeating(&sched, SCHED_ID_STATUS, 2)) { while (1); } }
void HilNodeInit(void) { // Set a unique node ID for this node. nodeId = CAN_NODE_HIL; // And configure the Peripheral Pin Select pins: PPSUnLock; // To enable ECAN1 pins: TX on 7, RX on 4 PPSOutput(OUT_FN_PPS_C1TX, OUT_PIN_PPS_RP7); PPSInput(PPS_C1RX, PPS_RP4); // To enable UART1 pins: TX on 11, RX on 13 PPSOutput(OUT_FN_PPS_U1TX, OUT_PIN_PPS_RP11); PPSInput(PPS_U1RX, PPS_RP13); // Configure SPI1 so that: // * (input) SPI1.SDI = B8 PPSInput(PPS_SDI1, PPS_RP10); // * SPI1.SCK is output on B9 PPSOutput(OUT_FN_PPS_SCK1, OUT_PIN_PPS_RP9); // * (output) SPI1.SDO = B10 PPSOutput(OUT_FN_PPS_SDO1, OUT_PIN_PPS_RP8); PPSLock; // Enable pin A4, the amber LED on the CAN node, as an output. We'll blink this at 1Hz. It'll // stay lit when in HIL mode with it turning off whenever packets are received. _TRISA4 = 0; // Initialize communications for HIL. HilInit(); // Set Timer4 to be a 4Hz timer. Used for blinking the amber status LED. Timer4Init(HilNodeBlink, 39062); // Set up Timer2 for a 100Hz timer. This triggers CAN message transmission at the same frequency // that the sensors actually do onboard the boat. Timer2Init(HilNodeTimer100Hz, 1562); // Initialize ECAN1 Ecan1Init(); // Set a schedule for outgoing CAN messages // Transmit the rudder angle at 10Hz if (!AddMessageRepeating(&sched, SCHED_ID_RUDDER_ANGLE, 10)) { FATAL_ERROR(); } // Transmit the rudder status at 10Hz if (!AddMessageRepeating(&sched, SCHED_ID_RUDDER_LIMITS, 10)) { FATAL_ERROR(); } // Transmit the throttle status at 100Hz if (!AddMessageRepeating(&sched, SCHED_ID_THROTTLE_STATUS, 10)) { FATAL_ERROR(); } // Transmit the RC status at 2Hz if (!AddMessageRepeating(&sched, SCHED_ID_RC_STATUS, 2)) { FATAL_ERROR(); } // Transmit latitude/longitude at 5Hz if (!AddMessageRepeating(&sched, SCHED_ID_LAT_LON, 5)) { FATAL_ERROR(); } // Transmit heading & speed at 5Hz if (!AddMessageRepeating(&sched, SCHED_ID_COG_SOG, 5)) { FATAL_ERROR(); } // Transmit heading & speed at 5Hz if (!AddMessageRepeating(&sched, SCHED_ID_GPS_FIX, 5)) { FATAL_ERROR(); } }
void ImuNodeInit(uint32_t f_osc) { // And configure the Peripheral Pin Select pins: PPSUnLock; PPSUnLock; #ifdef __dsPIC33FJ128MC802__ // To enable ECAN1 pins: TX on 7, RX on 4 PPSOutput(OUT_FN_PPS_C1TX, OUT_PIN_PPS_RP7); PPSInput(IN_FN_PPS_C1RX, IN_PIN_PPS_RP4); // To enable UART1 pins: TX on 9, RX on 8 PPSOutput(OUT_FN_PPS_U1TX, OUT_PIN_PPS_RP9); PPSInput(IN_FN_PPS_U1RX, IN_PIN_PPS_RP8); #elif __dsPIC33EP256MC502__ // To enable ECAN1 pins: TX on 39, RX on 36 PPSOutput(OUT_FN_PPS_C1TX, OUT_PIN_PPS_RP39); PPSInput(IN_FN_PPS_C1RX, IN_PIN_PPS_RP36); // To enable UART1 pins: TX on 41, RX on 40 PPSOutput(OUT_FN_PPS_U1TX, OUT_PIN_PPS_RP41); PPSInput(IN_FN_PPS_U1RX, IN_PIN_PPS_RP40); #endif PPSLock; // Also disable analog functionality on B8 so we can use it for UART1 RX. // This only applies to the dsPIC33E family. #ifdef __dsPIC33EP256MC502__ ANSELBbits.ANSB8 = 0; #endif // Initialize status LEDs for use. // A3 (output): Red LED, off by default, and is solid when the system hit a fatal error. _TRISA3 = 0; _LATA3 = 0; // A4 (output): Amber LED, blinks at 1Hz when disconnected from the IMU, 2Hz otherwise. _TRISA4 = 0; _LATA4 = 0; _TRISB7 = 0; // Set ECAN1_TX pin to an output _TRISB4 = 1; // Set ECAN1_RX pin to an input; // Set up UART1 for 115200 baud. There's no round() on the dsPICs, so we implement our own. double brg = (double)f_osc / 2.0 / 16.0 / 115200.0 - 1.0; if (brg - floor(brg) >= 0.5) { brg = ceil(brg); } else { brg = floor(brg); } Uart1Init((uint16_t)brg); // Initialize ECAN1 for input and output using DMA buffers 0 & 2 Ecan1Init(f_osc, NODE_CAN_BAUD); // Set the node ID nodeId = CAN_NODE_IMU_SENSOR; // Set up all of our tasks. // Blink at 1Hz if (!AddMessageRepeating(&taskSchedule, TASK_BLINK, RATE_TRANSMIT_BLINK_DEFAULT)) { FATAL_ERROR(); } // Transmit node status at 2Hz if (!AddMessageRepeating(&taskSchedule, TASK_TRANSMIT_STATUS, RATE_TRANSMIT_NODE_STATUS)) { FATAL_ERROR(); } // Transmit IMU data at 25Hz if (!AddMessageRepeating(&taskSchedule, TASK_TRANSMIT_IMU, RATE_TRANSMIT_IMU_DATA)) { FATAL_ERROR(); } }