|
|
@ -1,5 +1,67 @@
|
|
|
|
#include "Handler.h"
|
|
|
|
#include "Handler.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void Handler::AutoRunnerCallback(String point, AutoPathRunner::CarHeadPosition pos)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
//Serial.print("Callback(");
|
|
|
|
|
|
|
|
//Serial.print((point == "") ? "EMPTY" : point);
|
|
|
|
|
|
|
|
//Serial.println(String(",") + (int)pos + ")");
|
|
|
|
|
|
|
|
AccurateMotor.ForceStop();
|
|
|
|
|
|
|
|
OpenMVOpt::OpenMVTrack_Disc_CloseUp();
|
|
|
|
|
|
|
|
AccurateMotor.ForceStop();
|
|
|
|
|
|
|
|
if ((point == "D2")/* && (pos == AutoPathRunner::CarHeadPosition::Y_Negitive)*/)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
TrafficLightCommand cmd;
|
|
|
|
|
|
|
|
ZigBeeOperator.SendCommand(cmd.CMD_EnterIdentifyMode());
|
|
|
|
|
|
|
|
delay(500);
|
|
|
|
|
|
|
|
ZigBeeOperator.SendCommand(cmd.CMD_CheckRandomResult());
|
|
|
|
|
|
|
|
delay(500);
|
|
|
|
|
|
|
|
AccurateMotor.RunBackwardSlow(3);
|
|
|
|
|
|
|
|
AccurateMotor.DelayUntilCarStop();
|
|
|
|
|
|
|
|
OpenMVOpt::OpenMV_TrackInPlace();
|
|
|
|
|
|
|
|
AccurateMotor.RunForwardSlow(9);
|
|
|
|
|
|
|
|
AccurateMotor.DelayUntilCarStop();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (point == "B4")
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
_3DDisplayCommand cmd;
|
|
|
|
|
|
|
|
uint8_t data[128] = { 0 };
|
|
|
|
|
|
|
|
AccurateMotor.TurnLeft(45);
|
|
|
|
|
|
|
|
AccurateMotor.DelayUntilCarStop();
|
|
|
|
|
|
|
|
cmd.CMD_IR_CarLicenseMode_1to4('A', 'B', 'C', 'D');
|
|
|
|
|
|
|
|
delay(200);
|
|
|
|
|
|
|
|
cmd.CMD_IR_CarLicenseMode_5to6_XY('E', 'F', 'E', '2');
|
|
|
|
|
|
|
|
AccurateMotor.TurnRight(45);
|
|
|
|
|
|
|
|
AccurateMotor.DelayUntilCarStop();
|
|
|
|
|
|
|
|
/*AccurateMotor.TurnRight(90);
|
|
|
|
|
|
|
|
AccurateMotor.DelayUntilCarStop();
|
|
|
|
|
|
|
|
OpenMVOpt::Servo_Control(0);
|
|
|
|
|
|
|
|
delay(500);
|
|
|
|
|
|
|
|
OpenMVOpt::OpenMVQr_Disc_StartUp();
|
|
|
|
|
|
|
|
bool ret = OpenMVOpt::OpenMV_WaitQRData(data, 128, 2000);
|
|
|
|
|
|
|
|
OpenMVOpt::OpenMVQr_Disc_CloseUp();
|
|
|
|
|
|
|
|
AccurateMotor.TurnLeft(135);
|
|
|
|
|
|
|
|
AccurateMotor.DelayUntilCarStop();
|
|
|
|
|
|
|
|
if (!ret)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
cmd.CMD_IR_CarLicenseMode_1to4('A', 'B', 'C', 'D');
|
|
|
|
|
|
|
|
delay(200);
|
|
|
|
|
|
|
|
cmd.CMD_IR_CarLicenseMode_5to6_XY('E', 'F', 'E', '2');
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
String str = OpenMVOpt::DecodeQRData(data, 128);
|
|
|
|
|
|
|
|
_3DDisplayCommand cmd;
|
|
|
|
|
|
|
|
cmd.CMD_IR_CarLicenseMode_1to4(str[0], str[1], str[2], str[3]);
|
|
|
|
|
|
|
|
delay(200);
|
|
|
|
|
|
|
|
cmd.CMD_IR_CarLicenseMode_5to6_XY(str[4], str[5], 'E', '2');
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
OpenMVOpt::Servo_Control(-60);
|
|
|
|
|
|
|
|
delay(500);
|
|
|
|
|
|
|
|
AccurateMotor.TurnRight(135);
|
|
|
|
|
|
|
|
AccurateMotor.DelayUntilCarStop();*/
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Handler::ZigBeeRx_Handler(uint8_t* mar)
|
|
|
|
void Handler::ZigBeeRx_Handler(uint8_t* mar)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
CommandDecoder decoder(mar);
|
|
|
|
CommandDecoder decoder(mar);
|
|
|
@ -18,15 +80,15 @@ void Handler::ZigBeeRx_Handler(uint8_t* mar)
|
|
|
|
GarageCommand cmd;
|
|
|
|
GarageCommand cmd;
|
|
|
|
if (cmd.IsPositionData(mar))
|
|
|
|
if (cmd.IsPositionData(mar))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
Serial.print("Garage at: ");
|
|
|
|
//Serial.print("Garage at: ");
|
|
|
|
Serial.println(cmd.CurrentPos(mar));
|
|
|
|
//Serial.println(cmd.CurrentPos(mar));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (cmd.IsIRData(mar))
|
|
|
|
if (cmd.IsIRData(mar))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
Serial.print("Front IR: ");
|
|
|
|
//Serial.print("Front IR: ");
|
|
|
|
Serial.println(cmd.FrontIRTiggered(mar) ? "Triggered" : "Not Triggered");
|
|
|
|
//Serial.println(cmd.FrontIRTiggered(mar) ? "Triggered" : "Not Triggered");
|
|
|
|
Serial.print("Back IR: ");
|
|
|
|
//Serial.print("Back IR: ");
|
|
|
|
Serial.println(cmd.BackIRTiggered(mar) ? "Triggered" : "Not Triggered");
|
|
|
|
//Serial.println(cmd.BackIRTiggered(mar) ? "Triggered" : "Not Triggered");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -37,24 +99,24 @@ void Handler::ZigBeeRx_Handler(uint8_t* mar)
|
|
|
|
byte m, d, h, mm, s;
|
|
|
|
byte m, d, h, mm, s;
|
|
|
|
if (cmd.ReadRTCDate(mar, y, m, d))
|
|
|
|
if (cmd.ReadRTCDate(mar, y, m, d))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
Serial.print(y);
|
|
|
|
//Serial.print(y);
|
|
|
|
Serial.print("-");
|
|
|
|
//Serial.print("-");
|
|
|
|
Serial.print(m);
|
|
|
|
//Serial.print(m);
|
|
|
|
Serial.print("-");
|
|
|
|
//Serial.print("-");
|
|
|
|
Serial.println(d);
|
|
|
|
//Serial.println(d);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
else
|
|
|
|
Serial.println("Invalidate Date");
|
|
|
|
//Serial.println("Invalidate Date");
|
|
|
|
if (cmd.ReadRTCTime(mar, h, mm, s))
|
|
|
|
if (cmd.ReadRTCTime(mar, h, mm, s))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
Serial.print(h);
|
|
|
|
//Serial.print(h);
|
|
|
|
Serial.print(":");
|
|
|
|
//Serial.print(":");
|
|
|
|
Serial.print(mm);
|
|
|
|
//Serial.print(mm);
|
|
|
|
Serial.print(":");
|
|
|
|
//Serial.print(":");
|
|
|
|
Serial.println(s);
|
|
|
|
//Serial.println(s);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
else
|
|
|
|
Serial.println("Invalidate Time");
|
|
|
|
//Serial.println("Invalidate Time");
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case CommandData::Devices::AlarmTower: //ºìÍⱨ¾¯±êÖ¾Îï
|
|
|
|
case CommandData::Devices::AlarmTower: //ºìÍⱨ¾¯±êÖ¾Îï
|
|
|
@ -62,8 +124,8 @@ void Handler::ZigBeeRx_Handler(uint8_t* mar)
|
|
|
|
AlarmTowerCommand cmd;
|
|
|
|
AlarmTowerCommand cmd;
|
|
|
|
if (cmd.IsAlarmTowerCommand(mar))
|
|
|
|
if (cmd.IsAlarmTowerCommand(mar))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
Serial.print("Rescue Position: ");
|
|
|
|
//Serial.print("Rescue Position: ");
|
|
|
|
Serial.println(cmd.ReadRescuePosition(mar), HEX);
|
|
|
|
//Serial.println(cmd.ReadRescuePosition(mar), HEX);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -138,38 +200,45 @@ void Handler::MainCarRx_Handler(uint8_t* com)
|
|
|
|
switch(decoder.GetMainCommand())
|
|
|
|
switch(decoder.GetMainCommand())
|
|
|
|
{
|
|
|
|
{
|
|
|
|
case CommandData::MainCarCommand::StartRun:
|
|
|
|
case CommandData::MainCarCommand::StartRun:
|
|
|
|
if (decoder.GetDataBit(1) == CommandData::MainCarCommand::StartRunSub)
|
|
|
|
int point_cnt = 0;
|
|
|
|
{
|
|
|
|
CommandEncoder encoder;
|
|
|
|
int point_cnt = 0;
|
|
|
|
encoder.SetDevice(0xAA); //Ö÷³µ
|
|
|
|
AutoPathRunner::MapPoint* points = AutoPathRunner::DecodeRoute("B7-B6-D6-F6-F4-D4-B4-B2-D2-D1", point_cnt);
|
|
|
|
encoder.SetCommand(0xAA, 0xAA, 0xAA, 0xAA);
|
|
|
|
AutoPathRunner::DoRun(points, point_cnt, AutoPathRunner::CarHeadPosition::X_Positive);
|
|
|
|
AutoPathRunner::MapPoint* points = AutoPathRunner::DecodeRoute("E2-D2-B2-B4-B6-B7", point_cnt);
|
|
|
|
delay(1500);
|
|
|
|
AutoPathRunner::DoRun(points, point_cnt, AutoPathRunner::CarHeadPosition::Y_Negitive, AutoRunnerCallback);
|
|
|
|
}
|
|
|
|
ZigBeeOperator.SendCommand(encoder.GetCommandArray());
|
|
|
|
|
|
|
|
delay(200);
|
|
|
|
|
|
|
|
ZigBeeOperator.SendCommand(encoder.GetCommandArray());
|
|
|
|
|
|
|
|
OpenMVOpt::Servo_Control(-60);
|
|
|
|
|
|
|
|
delay(1500);
|
|
|
|
|
|
|
|
AutoPathRunner::ReversingIntoGarage(true, 3);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case CommandData::MainCarCommand::RunningRoute:
|
|
|
|
case CommandData::MainCarCommand::RunningRoute:
|
|
|
|
dynamic_route_recv = "";
|
|
|
|
dynamic_route_recv = "";
|
|
|
|
dynamic_route_recv.concat((char)decoder.GetDataBit(1));
|
|
|
|
dynamic_route_recv.concat((char)decoder.GetDataBit(1));
|
|
|
|
dynamic_route_recv.concat((char)decoder.GetDataBit(2));
|
|
|
|
dynamic_route_recv.concat((char)decoder.GetDataBit(2));
|
|
|
|
dynamic_route_recv.concat('-');
|
|
|
|
dynamic_route_recv.concat('-');
|
|
|
|
Serial.print("Route Command: ");
|
|
|
|
//Serial.print("Route Command: ");
|
|
|
|
Serial.println(dynamic_route_recv);
|
|
|
|
//Serial.println(dynamic_route_recv);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case CommandData::MainCarCommand::RunningRouteData:
|
|
|
|
case CommandData::MainCarCommand::RunningRouteData:
|
|
|
|
dynamic_route_recv.concat((char)decoder.GetDataBit(1));
|
|
|
|
dynamic_route_recv.concat((char)decoder.GetDataBit(1));
|
|
|
|
dynamic_route_recv.concat((char)decoder.GetDataBit(2));
|
|
|
|
dynamic_route_recv.concat((char)decoder.GetDataBit(2));
|
|
|
|
if (decoder.GetDataBit(3) == CommandData::MainCarCommand::RouteDataStop)
|
|
|
|
if (decoder.GetDataBit(3) == CommandData::MainCarCommand::RouteDataStop)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
Serial.println(dynamic_route_recv);
|
|
|
|
dynamic_route_recv += "-B7";
|
|
|
|
Serial.println("Run!");
|
|
|
|
//Serial.println(dynamic_route_recv);
|
|
|
|
|
|
|
|
//Serial.println("Run!");
|
|
|
|
int point_cnt = 0;
|
|
|
|
int point_cnt = 0;
|
|
|
|
AutoPathRunner::MapPoint* points = AutoPathRunner::DecodeRoute(dynamic_route_recv.c_str(), point_cnt);
|
|
|
|
AutoPathRunner::MapPoint* points = AutoPathRunner::DecodeRoute(dynamic_route_recv.c_str(), point_cnt);
|
|
|
|
AutoPathRunner::DoRun(points, point_cnt, AutoPathRunner::CarHeadPosition::X_Positive);
|
|
|
|
AutoPathRunner::DoRun(points, point_cnt, AutoPathRunner::CarHeadPosition::Y_Negitive, AutoRunnerCallback);
|
|
|
|
delay(1500);
|
|
|
|
delay(1500);
|
|
|
|
|
|
|
|
AutoPathRunner::ReversingIntoGarage(true, 3);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
|
dynamic_route_recv.concat('-');
|
|
|
|
dynamic_route_recv.concat('-');
|
|
|
|
Serial.println(dynamic_route_recv);
|
|
|
|
//Serial.println(dynamic_route_recv);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -278,20 +347,22 @@ void Handler::MainCarRx_Handler(uint8_t* com)
|
|
|
|
void Handler::Key_0()
|
|
|
|
void Handler::Key_0()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
int point_cnt = 0;
|
|
|
|
int point_cnt = 0;
|
|
|
|
AutoPathRunner::MapPoint* points = AutoPathRunner::DecodeRoute("B7-B6-D6-F6-F4-D4-B4-B2-D2-D1", point_cnt);
|
|
|
|
AutoPathRunner::MapPoint* points = AutoPathRunner::DecodeRoute("E2-D2-B2-B4-B6-B7", point_cnt);
|
|
|
|
AutoPathRunner::DoRun(points, point_cnt, AutoPathRunner::CarHeadPosition::X_Positive);
|
|
|
|
AutoPathRunner::DoRun(points, point_cnt, AutoPathRunner::CarHeadPosition::Y_Negitive, AutoRunnerCallback);
|
|
|
|
delay(1500);
|
|
|
|
delay(1500);
|
|
|
|
AccurateMotor.TurnLeft(90);
|
|
|
|
AutoPathRunner::ReversingIntoGarage(true, 3);
|
|
|
|
AccurateMotor.DelayUntilCarStop();
|
|
|
|
|
|
|
|
AccurateMotor.RunForward(20);
|
|
|
|
|
|
|
|
AccurateMotor.DelayUntilCarStop();
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Handler::Key_1()
|
|
|
|
void Handler::Key_1()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
OpenMVOpt::OpenMVTrack_Disc_CloseUp();
|
|
|
|
/*OpenMVOpt::OpenMVTrack_Disc_CloseUp();
|
|
|
|
delay(500);
|
|
|
|
delay(500);
|
|
|
|
OpenMVOpt::Servo_Control(0);
|
|
|
|
OpenMVOpt::Servo_Control(0);*/
|
|
|
|
|
|
|
|
AccurateMotor.TurnLeft(90);
|
|
|
|
|
|
|
|
AccurateMotor.DelayUntilCarStop();
|
|
|
|
|
|
|
|
delay(2000);
|
|
|
|
|
|
|
|
AccurateMotor.TurnLeft(180);
|
|
|
|
|
|
|
|
AccurateMotor.DelayUntilCarStop();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Handler::Key_2()
|
|
|
|
void Handler::Key_2()
|
|
|
@ -299,19 +370,29 @@ void Handler::Key_2()
|
|
|
|
OpenMVOpt::Servo_Control(-60);
|
|
|
|
OpenMVOpt::Servo_Control(-60);
|
|
|
|
delay(500);
|
|
|
|
delay(500);
|
|
|
|
OpenMVOpt::OpenMV_Track(8, []() { return false; }, false);
|
|
|
|
OpenMVOpt::OpenMV_Track(8, []() { return false; }, false);
|
|
|
|
AutoPathRunner::ReversingIntoGarage(false, 0x04);
|
|
|
|
AutoPathRunner::ReversingIntoGarage(true, 0x03);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Handler::Key_3()
|
|
|
|
void Handler::Key_3()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_3DDisplayCommand cmd;
|
|
|
|
uint8_t data[128] = { 0 };
|
|
|
|
TextEncoder encoder("主车不动安如山,从车乱飞墙撞翻。");
|
|
|
|
OpenMVOpt::OpenMVQr_Disc_StartUp();
|
|
|
|
while(encoder.HasNextChar())
|
|
|
|
if (!OpenMVOpt::OpenMV_WaitQRData(data, 128, 2000))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
OpenMVOpt::OpenMVQr_Disc_CloseUp();
|
|
|
|
|
|
|
|
LED.LeftTurnOn();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
|
byte b1, b2;
|
|
|
|
OpenMVOpt::OpenMVQr_Disc_CloseUp();
|
|
|
|
encoder.GetNextChar(b1, b2);
|
|
|
|
LED.RightTurnOn();
|
|
|
|
ZigBeeOperator.SendCommand(cmd.CMD_ZIGBEE_CustomTextAdd(b1, b2, encoder.IsLastChar()));
|
|
|
|
AccurateMotor.TurnLeft(135);
|
|
|
|
|
|
|
|
AccurateMotor.DelayUntilCarStop();
|
|
|
|
|
|
|
|
String str = OpenMVOpt::DecodeQRData(data, 128);
|
|
|
|
|
|
|
|
_3DDisplayCommand cmd;
|
|
|
|
|
|
|
|
cmd.CMD_IR_CarLicenseMode_1to4(str[0], str[1], str[2], str[3]);
|
|
|
|
delay(200);
|
|
|
|
delay(200);
|
|
|
|
|
|
|
|
cmd.CMD_IR_CarLicenseMode_5to6_XY(str[4], str[5], 'B', '6');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|