📄 robocar.cpp
字号:
#include "stdafx.h"
#include "RoboCar.h"
CRoboCar::CRoboCar(void)
: m_lSwapTime(ACTION_INFINITE_TIME)
{
m_port.OpenPort();
}
CRoboCar::~CRoboCar(void)
{
m_port.ClosePort();
}
// 等待单片机发送指令运行
void CRoboCar::WaitMessage(void)
{
char c= 0x00;
while(c != 'S')
{
m_port.Recive(&c, 1);
}
}
// 是否应该关闭系统
bool CRoboCar::IsShutDown(void)
{
char c= 0x00;
m_port.Recive(&c, 1);
if (c == 'C')
return true;
else
return false;
}
// 设置状态和状态持续时间(将清空队列),该状态结束之后,进入idle
void CRoboCar::SetStatus(unsigned long lStatus, unsigned long lTime)
{
ACTIONDESC act;
act.cAct= lStatus;
act.lTime= lTime;
Action(act);
m_lstAct.clear();
m_lstAct.push_back(act);
}
// 将一个状态添加到动作队列中
void CRoboCar::PushStatus(unsigned long lStatus, unsigned long lTime)
{
ACTIONDESC act;
act.cAct= lStatus;
act.lTime= lTime;
m_lstAct.push_back(act);
}
// 更新状态,由外部分配时间片
void CRoboCar::ResponseTick(void)
{
if (m_lstAct.empty())
{ // 队列为空,添加一个IDLE状态
SetStatus(ACTION_IDLE);
}
else
{
unsigned int dw= GetTickCount();
if (m_lSwapTime <= dw)
{
m_lstAct.pop_front();
if (!m_lstAct.empty())
{
list<ACTIONDESC>::iterator iter= m_lstAct.begin();
Action((*iter));
}
}
}
}
// 阻塞模式动作,直到动作完成(时间过去)再返回
void CRoboCar::ActionSlave(unsigned long lStatus, unsigned long lTime)
{
SetStatus(lStatus, lTime);
while(GetTickCount() < m_lSwapTime)
;
//SetStatus(ACTION_IDLE);
}
// 发送串口指令
void CRoboCar::Action(ACTIONDESC &act)
{
// 计算动作停止的时刻
if (act.lTime == ACTION_INFINITE_TIME)
{
m_lSwapTime= ACTION_INFINITE_TIME;
}
else
{
unsigned dw= ::GetTickCount();
m_lSwapTime= dw + act.lTime;
}
// 发送串口数据
switch(act.cAct)
{
case ACTION_LEFT:
m_port.SendBytes("L", 1);
break;
case ACTION_RIGHT:
m_port.SendBytes("R", 1);
break;
case ACTION_FORWARD:
m_port.SendBytes("F", 1);
break;
case ACTION_BACKWARD:
m_port.SendBytes("B", 1);
break;
case ACTION_IDLE:
m_port.SendBytes("P", 1);
break;
default:
m_port.SendBytes("P", 1);
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -