📄 c_cmd_alternate.c
字号:
//
// File Description:
// This file contains an alternate implementation of c_cmd for testing purposes.
// It implements the minimal standard interface for the module, and serves as
// an example of output module control via C code.
//
void cCmdInit(void* pHeader)
{
pHeaders = pHeader;
IOMapCmd.Awake = TRUE;
dTimerInit();
IOMapCmd.Tick = dTimerRead();
return;
}
//Test: Start at speed 100 when enter is pressed; then progressively ramp down every half second until -100.
void cCmdCtrl(void)
{
static UBYTE State = 0;
static ULONG MyTick = 0;
if (pMapButton->State[BTN1] & PRESSED_EV)
{
pMapButton->State[BTN1] &= ~PRESSED_EV;
//Coast both motors
pMapOutPut->Outputs[0].Mode = MOTORON;
pMapOutPut->Outputs[1].Mode = MOTORON;
pMapOutPut->Outputs[0].Speed = 0;
pMapOutPut->Outputs[0].TachoLimit = 0;
pMapOutPut->Outputs[0].RunState = MOTOR_RUN_STATE_IDLE;
pMapOutPut->Outputs[0].RegMode = REGULATION_MODE_IDLE;
pMapOutPut->Outputs[1].Speed = 0;
pMapOutPut->Outputs[1].TachoLimit = 0;
pMapOutPut->Outputs[1].RunState = MOTOR_RUN_STATE_IDLE;
pMapOutPut->Outputs[1].RegMode = REGULATION_MODE_IDLE;
pMapOutPut->Outputs[0].Flags = UPDATE_MODE | UPDATE_SPEED;
pMapOutPut->Outputs[1].Flags = UPDATE_MODE | UPDATE_SPEED;
//Drop out of ongoing state machine
State = 255;
}
switch(State)
{
case 0:
{
//Initialize
pMapOutPut->Outputs[0].Flags = UPDATE_RESET_COUNT;
pMapOutPut->Outputs[1].Flags = UPDATE_RESET_COUNT;
pMapOutPut->Outputs[0].RunState = MOTOR_RUN_STATE_IDLE;
pMapOutPut->Outputs[1].RunState = MOTOR_RUN_STATE_IDLE;
State++;
}
break;
case 1:
{
//Kick off further states only if Enter button is pressed
if ((pMapButton->State[BTN4] & PRESSED_EV))
{
//Clear pressed event so UI doesn't re-use it.
pMapButton->State[BTN4] &= ~PRESSED_EV;
pMapOutPut->Outputs[0].Mode = MOTORON | BRAKE | REGULATED;
pMapOutPut->Outputs[1].Mode = MOTORON | BRAKE | REGULATED;
pMapOutPut->Outputs[0].Speed = 50;
pMapOutPut->Outputs[0].TachoLimit = 1152;
pMapOutPut->Outputs[0].RunState = MOTOR_RUN_STATE_RUNNING;
pMapOutPut->Outputs[0].SyncTurnParameter = 25;
//pMapOutPut->Outputs[0].RegMode = REGULATION_MODE_MOTOR_SPEED;
pMapOutPut->Outputs[0].RegMode = REGULATION_MODE_MOTOR_SYNC;
pMapOutPut->Outputs[1].Speed = 50;
pMapOutPut->Outputs[1].TachoLimit = 1152;
pMapOutPut->Outputs[1].RunState = MOTOR_RUN_STATE_RUNNING;
//pMapOutPut->Outputs[1].SyncTurnParameter = -7;
//pMapOutPut->Outputs[1].RegMode = REGULATION_MODE_MOTOR_SPEED;
pMapOutPut->Outputs[1].RegMode = REGULATION_MODE_MOTOR_SYNC;
pMapOutPut->Outputs[0].Flags = UPDATE_MODE | UPDATE_SPEED | UPDATE_TACHO_LIMIT;
pMapOutPut->Outputs[1].Flags = UPDATE_MODE | UPDATE_SPEED | UPDATE_TACHO_LIMIT;
State++;
}
}
break;
case 2:
{
if (pMapOutPut->Outputs[0].RunState == MOTOR_RUN_STATE_IDLE)
{
pMapOutPut->Outputs[0].Mode = MOTORON;
pMapOutPut->Outputs[1].Mode = MOTORON;
pMapOutPut->Outputs[0].Speed = 0;
pMapOutPut->Outputs[0].TachoLimit = 0;
pMapOutPut->Outputs[0].RunState = MOTOR_RUN_STATE_IDLE;
pMapOutPut->Outputs[0].RegMode = REGULATION_MODE_IDLE;
pMapOutPut->Outputs[1].Speed = 0;
pMapOutPut->Outputs[1].TachoLimit = 0;
pMapOutPut->Outputs[1].RunState = MOTOR_RUN_STATE_IDLE;
pMapOutPut->Outputs[1].RegMode = REGULATION_MODE_IDLE;
pMapOutPut->Outputs[0].Flags = UPDATE_MODE | UPDATE_SPEED;
pMapOutPut->Outputs[1].Flags = UPDATE_MODE | UPDATE_SPEED;
State++;
}
}
break;
case 3:
{
pMapOutPut->Outputs[0].Mode = MOTORON | BRAKE | REGULATED;
pMapOutPut->Outputs[1].Mode = MOTORON | BRAKE | REGULATED;
pMapOutPut->Outputs[0].Speed = 50;
pMapOutPut->Outputs[0].TachoLimit = 1152;
pMapOutPut->Outputs[0].RunState = MOTOR_RUN_STATE_RUNNING;
//pMapOutPut->Outputs[0].SyncTurnParameter = 5;
//pMapOutPut->Outputs[0].RegMode = REGULATION_MODE_MOTOR_SPEED;
pMapOutPut->Outputs[0].RegMode = REGULATION_MODE_MOTOR_SYNC;
pMapOutPut->Outputs[1].Speed = 50;
pMapOutPut->Outputs[1].TachoLimit = 1152;
pMapOutPut->Outputs[1].RunState = MOTOR_RUN_STATE_RUNNING;
//pMapOutPut->Outputs[1].RegMode = REGULATION_MODE_MOTOR_SPEED;
pMapOutPut->Outputs[1].RegMode = REGULATION_MODE_MOTOR_SYNC;
pMapOutPut->Outputs[0].Flags = UPDATE_MODE | UPDATE_SPEED | UPDATE_TACHO_LIMIT;
pMapOutPut->Outputs[1].Flags = UPDATE_MODE | UPDATE_SPEED | UPDATE_TACHO_LIMIT;
State = 2;
}
break;
default:
break;
};
//Busy loop to ensure return on 1ms boundary
BUSY_WAIT_NEXT_MS;
IOMapCmd.Tick = dTimerRead();
MyTick++;
return;
}
void cCmdExit(void)
{
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -