diff --git a/Makefile b/Makefile index 8127eb6..5ab6f04 100644 --- a/Makefile +++ b/Makefile @@ -51,7 +51,7 @@ OBJSL = stm32_sine.o hwinit.o stm32scheduler.o params.o terminal.o terminal_prj my_string.o digio.o sine_core.o my_fp.o fu.o inc_encoder.o printf.o anain.o \ temp_meas.o param_save.o throttle.o errormessage.o pwmgeneration.o \ picontroller.o terminalcommands.o vehiclecontrol.o \ - stm32_can.o canmap.o canhardware.o cansdo.o + stm32_can.o canmap.o canhardware.o cansdo.o sdocommands.o ifeq ($(CONTROL), SINE) OBJSL += pwmgeneration-sine.o diff --git a/libopeninv b/libopeninv index 91b26e2..d3d67d2 160000 --- a/libopeninv +++ b/libopeninv @@ -1 +1 @@ -Subproject commit 91b26e2c1fa3bae78f3fa8bd88238d7e698d6bd5 +Subproject commit d3d67d2643e51ca8dcc36293021a6bbfe89d422a diff --git a/sinus.cbp b/sinus.cbp index 94cd215..1669052 100644 --- a/sinus.cbp +++ b/sinus.cbp @@ -102,6 +102,7 @@ + @@ -131,6 +132,7 @@ + diff --git a/src/stm32_sine.cpp b/src/stm32_sine.cpp index 2c3b2eb..f02c855 100644 --- a/src/stm32_sine.cpp +++ b/src/stm32_sine.cpp @@ -46,8 +46,11 @@ #include "stm32_can.h" #include "canmap.h" #include "cansdo.h" +#include "sdocommands.h" #define PRINT_JSON 0 +#define START_COMMAND_SUBINDEX 4 +#define STOP_COMMAND_SUBINDEX 5 HWREV hwRev; //Hardware variant of board we are running on @@ -220,13 +223,13 @@ static void Ms10Task(void) PwmGeneration::SetOpmode(MOD_OFF); Throttle::cruiseSpeed = -1; TerminalCommands::EnableSaving(); - canSdo->EnableSaving(); + SdoCommands::EnableSaving(); } else if (0 == initWait) { //Disable saving in Run mode TerminalCommands::DisableSaving(); - canSdo->DisableSaving(); + SdoCommands::DisableSaving(); PwmGeneration::SetTorquePercent(0); Throttle::RampThrottle(0); //Restart ramp Encoder::Reset(); @@ -356,6 +359,29 @@ void Param::Change(Param::PARAM_NUM paramNum) } } +static void ProcessCustomSdoCommands(CanSdo::SdoFrame* sdoFrame) +{ + if (sdoFrame->index == SDO_INDEX_COMMANDS && sdoFrame->cmd == SDO_WRITE) + { + switch (sdoFrame->subIndex) + { + case START_COMMAND_SUBINDEX: + if (sdoFrame->data < MOD_LAST) + { + Param::SetInt(Param::opmode, sdoFrame->data); + sdoFrame->cmd = SDO_WRITE_REPLY; + sdoFrame->data = 0; + } + break; + case STOP_COMMAND_SUBINDEX: + Param::SetInt(Param::opmode, 0); + sdoFrame->cmd = SDO_WRITE_REPLY; + sdoFrame->data = 0; + break; + } + } +} + static void UpgradeParameters() { Param::SetInt(Param::version, 4); //backward compatibility @@ -441,11 +467,22 @@ extern "C" int main(void) while(1) { char c = 0; + CanSdo::SdoFrame* sdoFrame = sdo.GetPendingUserspaceSdo(); t.Run(); + if (canSdo->GetPrintRequest() == PRINT_JSON) { TerminalCommands::PrintParamsJson(canSdo, &c); } + if (0 != sdoFrame) + { + SdoCommands::ProcessStandardCommands(sdoFrame); + + if (sdoFrame->cmd == SDO_ABORT) + ProcessCustomSdoCommands(sdoFrame); + + sdo.SendSdoReply(sdoFrame); + } } return 0;