diff --git a/bobbycar-protocol b/bobbycar-protocol index 2c6fb11..cb5939e 160000 --- a/bobbycar-protocol +++ b/bobbycar-protocol @@ -1 +1 @@ -Subproject commit 2c6fb114f2ea6e3aed243acea1afd28ca34938c9 +Subproject commit cb5939eefbf990c4e493746d816d09d1dfa5422c diff --git a/main.cpp b/main.cpp index c6b2cf5..daaef2d 100644 --- a/main.cpp +++ b/main.cpp @@ -1616,10 +1616,10 @@ void applyIncomingCanMessage() switch (header.StdId) { using namespace protocol::can; - case MotorController::Command::Enable: left .enable = *((bool *)buf); break; - case MotorController ::Command::Enable: right.enable = *((bool *)buf); break; - case MotorController::Command::InpTgt: left. rtU.r_inpTgt = *((int16_t*)buf); timeoutCntLeft = 0; break; - case MotorController ::Command::InpTgt: right.rtU.r_inpTgt = *((int16_t*)buf); timeoutCntRight = 0; break; + case MotorController::Command::Enable: left .enable = *((bool *)buf); break; + case MotorController ::Command::Enable: right.enable = *((bool *)buf); break; + case MotorController::Command::InpTgt: left. rtU.r_inpTgt = *((int16_t*)buf); timeoutCntLeft = 0; break; + case MotorController ::Command::InpTgt: right.rtU.r_inpTgt = *((int16_t*)buf); timeoutCntRight = 0; break; case MotorController::Command::CtrlTyp: left .rtP.z_ctrlTypSel = *((uint8_t*)buf); break; case MotorController ::Command::CtrlTyp: right.rtP.z_ctrlTypSel = *((uint8_t*)buf); break; case MotorController::Command::CtrlMod: left .rtU.z_ctrlModReq = *((uint8_t*)buf); break; @@ -1689,61 +1689,67 @@ void applyIncomingCanMessage() } } +template +void send(uint32_t addr, T value) +{ + CAN_TxHeaderTypeDef header; + header.StdId = addr; + header.ExtId = 0x01; + header.RTR = CAN_RTR_DATA; + header.IDE = CAN_ID_STD; + header.DLC = sizeof(value); + header.TransmitGlobalTime = DISABLE; + + uint8_t buf[8] {0}; + std::memcpy(buf, &value, sizeof(value)); + + static uint32_t TxMailbox; + if (const auto result = HAL_CAN_AddTxMessage(&CanHandle, &header, buf, &TxMailbox); result != HAL_OK) + { + myPrintf("HAL_CAN_AddTxMessage() failed with %i", result); + //while (true); + } +} + void sendCanFeedback() { const auto free = HAL_CAN_GetTxMailboxesFreeLevel(&CanHandle); if (!free) return; - constexpr auto send = [](uint32_t addr, auto value){ - CAN_TxHeaderTypeDef header; - header.StdId = addr; - header.ExtId = 0x01; - header.RTR = CAN_RTR_DATA; - header.IDE = CAN_ID_STD; - header.DLC = sizeof(value); - header.TransmitGlobalTime = DISABLE; - - uint8_t buf[8] {0}; - std::memcpy(buf, &value, sizeof(value)); - - static uint32_t TxMailbox; - if (const auto result = HAL_CAN_AddTxMessage(&CanHandle, &header, buf, &TxMailbox); result != HAL_OK) - { - myPrintf("HAL_CAN_AddTxMessage() failed with %i", result); - //while (true); - } - }; - static uint8_t whichToSend{}; - switch (whichToSend++) - { using namespace protocol::can; - case 0: send(MotorController::Feedback::DcLink, left. rtU.i_DCLink); break; - case 1: send(MotorController:: Feedback::DcLink, right.rtU.i_DCLink); break; - case 2: send(MotorController::Feedback::Speed, left. rtY.n_mot); break; - case 3: send(MotorController:: Feedback::Speed, right.rtY.n_mot); break; - case 4: send(MotorController::Feedback::Error, left. rtY.z_errCode); break; - case 5: send(MotorController:: Feedback::Error, right.rtY.z_errCode); break; - case 6: send(MotorController::Feedback::Angle, left. rtY.a_elecAngle); break; - case 7: send(MotorController:: Feedback::Angle, right.rtY.a_elecAngle); break; - case 8: send(MotorController::Feedback::DcPhaA, left. rtY.DC_phaA); break; - case 9: send(MotorController:: Feedback::DcPhaA, right.rtY.DC_phaA); break; - case 10: send(MotorController::Feedback::DcPhaB, left. rtY.DC_phaB); break; - case 11: send(MotorController:: Feedback::DcPhaB, right.rtY.DC_phaB); break; - case 12: send(MotorController::Feedback::DcPhaC, left. rtY.DC_phaC); break; - case 13: send(MotorController:: Feedback::DcPhaC, right.rtY.DC_phaC); break; - case 14: send(MotorController::Feedback::Chops, left. chops.exchange(0)); break; - case 15: send(MotorController:: Feedback::Chops, right.chops.exchange(0)); break; - case 16: send(MotorController::Feedback::Hall, left.hallBits()); break; - case 17: send(MotorController:: Feedback::Hall, right.hallBits()); break; - case 18: send(MotorController::Feedback::Voltage, batVoltage * BAT_CALIB_REAL_VOLTAGE / BAT_CALIB_ADC); break; - case 19: send(MotorController:: Feedback::Voltage, batVoltage * BAT_CALIB_REAL_VOLTAGE / BAT_CALIB_ADC); break; - case 20: send(MotorController::Feedback::Temp, board_temp_deg_c); break; - case 21: send(MotorController:: Feedback::Temp, board_temp_deg_c); whichToSend = 0; break; - default: myPrintf("unreachable"); - } + constexpr void(*arr[])() = { + [](){ send(MotorController::Feedback::DcLink, left. rtU.i_DCLink); }, + [](){ send(MotorController:: Feedback::DcLink, right.rtU.i_DCLink); }, + [](){ send(MotorController::Feedback::Speed, left. rtY.n_mot); }, + [](){ send(MotorController:: Feedback::Speed, right.rtY.n_mot); }, + [](){ send(MotorController::Feedback::Error, left. rtY.z_errCode); }, + [](){ send(MotorController:: Feedback::Error, right.rtY.z_errCode); }, + [](){ send(MotorController::Feedback::Angle, left. rtY.a_elecAngle); }, + [](){ send(MotorController:: Feedback::Angle, right.rtY.a_elecAngle); }, +// [](){ send(MotorController::Feedback::DcPhaA, left. rtY.DC_phaA); }, +// [](){ send(MotorController:: Feedback::DcPhaA, right.rtY.DC_phaA); }, +// [](){ send(MotorController::Feedback::DcPhaB, left. rtY.DC_phaB); }, +// [](){ send(MotorController:: Feedback::DcPhaB, right.rtY.DC_phaB); }, +// [](){ send(MotorController::Feedback::DcPhaC, left. rtY.DC_phaC); }, +// [](){ send(MotorController:: Feedback::DcPhaC, right.rtY.DC_phaC); }, + [](){ send(MotorController::Feedback::Chops, left. chops.exchange(0)); }, + [](){ send(MotorController:: Feedback::Chops, right.chops.exchange(0)); }, + [](){ send(MotorController::Feedback::Hall, left.hallBits()); }, + [](){ send(MotorController:: Feedback::Hall, right.hallBits()); }, + [](){ send(MotorController::Feedback::Voltage, batVoltage * BAT_CALIB_REAL_VOLTAGE / BAT_CALIB_ADC); }, + [](){ send(MotorController:: Feedback::Voltage, batVoltage * BAT_CALIB_REAL_VOLTAGE / BAT_CALIB_ADC); }, + [](){ send(MotorController::Feedback::Temp, board_temp_deg_c); }, + [](){ send(MotorController:: Feedback::Temp, board_temp_deg_c); }, + [](){ send(MotorController::Feedback::Id, left. rtY.id); }, + [](){ send(MotorController:: Feedback::Id, right.rtY.id); }, + [](){ send(MotorController::Feedback::Iq, left. rtY.iq); }, + [](){ send(MotorController:: Feedback::Iq, right.rtY.iq); whichToSend = 0; }, + }; + + arr[whichToSend++](); } #endif