You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

417 lines
11 KiB
C++

#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)
{
CommandDecoder decoder(mar);
switch (decoder.GetDevice())
{
case CommandData::Devices::MainCar: //<2F><><EFBFBD><EFBFBD>
MainCarRx_Handler(mar); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>
break;
case CommandData::Devices::Barrier: //<2F><>բ<EFBFBD><D5A2>־<EFBFBD><D6BE>
DataTool::PrintDataArray(mar, 8);
break;
case CommandData::Devices::LED_Display: //LED<45><44>ʾ<EFBFBD><CABE>־<EFBFBD><EFBFBD><EFA3A8><EFBFBD>޷<EFBFBD><DEB7>أ<EFBFBD>
break;
case CommandData::Devices::Garage_B: //<2F><><EFBFBD><EFBFBD><E5B3B5><EFBFBD><EFBFBD>־<EFBFBD><D6BE>B
{
GarageCommand cmd;
if (cmd.IsPositionData(mar))
{
//Serial.print("Garage at: ");
//Serial.println(cmd.CurrentPos(mar));
}
if (cmd.IsIRData(mar))
{
//Serial.print("Front IR: ");
//Serial.println(cmd.FrontIRTiggered(mar) ? "Triggered" : "Not Triggered");
//Serial.print("Back IR: ");
//Serial.println(cmd.BackIRTiggered(mar) ? "Triggered" : "Not Triggered");
}
break;
}
case CommandData::Devices::VoiceReport: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE>
{
VoiceReportCommand cmd;
uint16_t y;
byte m, d, h, mm, s;
if (cmd.ReadRTCDate(mar, y, m, d))
{
//Serial.print(y);
//Serial.print("-");
//Serial.print(m);
//Serial.print("-");
//Serial.println(d);
}
else
//Serial.println("Invalidate Date");
if (cmd.ReadRTCTime(mar, h, mm, s))
{
//Serial.print(h);
//Serial.print(":");
//Serial.print(mm);
//Serial.print(":");
//Serial.println(s);
}
else
//Serial.println("Invalidate Time");
break;
}
case CommandData::Devices::AlarmTower: //<2F><><EFBFBD><EFBFBD><E2B1A8><EFBFBD><EFBFBD>־<EFBFBD><D6BE>
{
AlarmTowerCommand cmd;
if (cmd.IsAlarmTowerCommand(mar))
{
//Serial.print("Rescue Position: ");
//Serial.println(cmd.ReadRescuePosition(mar), HEX);
}
break;
}
case CommandData::Devices::TFT_B: //TFT<46><54>ʾ<EFBFBD><CABE>־<EFBFBD><D6BE>B
break;
case CommandData::Devices::WirelessCharger: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD><DFB3><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE>
break;
case CommandData::Devices::TFT_A: //TFT<46><54>ʾ<EFBFBD><CABE>־<EFBFBD><D6BE>A
break;
case CommandData::Devices::ETC: //ETCϵͳ<CFB5><CDB3>־<EFBFBD><D6BE>
break;
case CommandData::Devices::Garage_A: //<2F><><EFBFBD><EFBFBD><E5B3B5><EFBFBD><EFBFBD>־<EFBFBD><D6BE>A
break;
case CommandData::Devices::TrafficLight_A: //<2F><>ͨ<EFBFBD>Ʊ<EFBFBD>ע<EFBFBD><D7A2>A
{
TrafficLightCommand cmd;
if (cmd.ModeChangeSuccess(mar))
Serial.println("Enter Identify Mode");
else
Serial.println("Mode Change Failure");
break;
}
case CommandData::Devices::TrafficLight_B: //<2F><>ͨ<EFBFBD>Ʊ<EFBFBD>־<EFBFBD><D6BE>B
break;
case CommandData::Devices::SpecTerrain:
{
SpecTerrainCommand cmd;
if(cmd.IsSpecTerrainCommand(mar))
{
switch (cmd.ReadStatus(mar))
{
case SpecTerrainCommand::Status::Passed_AtoB:
case SpecTerrainCommand::Status::Passed_BtoA:
Serial.println("Passed");
break;
case SpecTerrainCommand::Status::NotPass:
Serial.println("Not Pass");
break;
default:
Serial.println("Data Invalidate");
}
}
else
Serial.println("Command Invalidate");
break;
}
default:
break;
}
}
void Handler::OpenMVRx_Handler(uint8_t* mac)
{
switch (mac[2])
{
case 0x91: //<2F><><EFBFBD><EFBFBD>
break;
case 0x92: //<2F><>ά<EFBFBD><CEAC>ʶ<EFBFBD><CAB6>
break;
default:
break;
}
}
void Handler::MainCarRx_Handler(uint8_t* com)
{
2 years ago
CommandDecoder decoder(com);
if (!decoder.CommandValidate())
return;
switch(decoder.GetMainCommand())
{
case CommandData::MainCarCommand::StartRun:
int point_cnt = 0;
CommandEncoder encoder;
encoder.SetDevice(0xAA); //<2F><><EFBFBD><EFBFBD>
encoder.SetCommand(0xAA, 0xAA, 0xAA, 0xAA);
AutoPathRunner::MapPoint* points = AutoPathRunner::DecodeRoute("E2-D2-B2-B4-B6-B7", point_cnt);
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);
2 years ago
break;
case CommandData::MainCarCommand::RunningRoute:
dynamic_route_recv = "";
dynamic_route_recv.concat((char)decoder.GetDataBit(1));
dynamic_route_recv.concat((char)decoder.GetDataBit(2));
dynamic_route_recv.concat('-');
//Serial.print("Route Command: ");
//Serial.println(dynamic_route_recv);
2 years ago
break;
case CommandData::MainCarCommand::RunningRouteData:
dynamic_route_recv.concat((char)decoder.GetDataBit(1));
dynamic_route_recv.concat((char)decoder.GetDataBit(2));
if (decoder.GetDataBit(3) == CommandData::MainCarCommand::RouteDataStop)
{
dynamic_route_recv += "-B7";
//Serial.println(dynamic_route_recv);
//Serial.println("Run!");
2 years ago
int point_cnt = 0;
AutoPathRunner::MapPoint* points = AutoPathRunner::DecodeRoute(dynamic_route_recv.c_str(), point_cnt);
AutoPathRunner::DoRun(points, point_cnt, AutoPathRunner::CarHeadPosition::Y_Negitive, AutoRunnerCallback);
2 years ago
delay(1500);
AutoPathRunner::ReversingIntoGarage(true, 3);
2 years ago
}
else
{
dynamic_route_recv.concat('-');
//Serial.println(dynamic_route_recv);
2 years ago
}
break;
}
switch (com[2])
{
case 0x01: //ֹͣ
//DCMotor.Stop();
AccurateMotor.ForceStop();
break;
case 0x02: //ǰ<><C7B0>
//DCMotor.Go(com[3], (com[4] + (com[5] << 8)));
AccurateMotor.RunForward((com[4] + (com[5] << 8)));
ZigBee_back[2] = 0x03;
break;
case 0x03: //<2F><><EFBFBD><EFBFBD>
//DCMotor.Back(com[3], (com[4] + (com[5] << 8)));
AccurateMotor.RunBackward((com[4] + (com[5] << 8)));
ZigBee_back[2] = 0x03;
break;
case 0x04: //<2F><>ת
//DCMotor.TurnLeft(com[3]);
AccurateMotor.TurnLeft(com[3]);
ZigBee_back[2] = 0x02;
break;
case 0x05: //<2F><>ת
//DCMotor.TurnRight(com[3]);
AccurateMotor.TurnRight(com[3]);
ZigBee_back[2] = 0x02;
break;
case 0x06: //ѭ<><D1AD>
//DCMotor.CarTrack(com[3]);
ZigBee_back[2] = 0x00;
break;
case 0x07: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Command.Judgment(Command.command01); //<2F><><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>
ExtSRAMInterface.ExMem_Write_Bytes(Command.command01, 8); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
break;
case 0x10: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
infrare_com[0] = com[3];
infrare_com[1] = com[4];
infrare_com[2] = com[5];
break;
case 0x11: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
infrare_com[3] = com[3];
infrare_com[4] = com[4];
infrare_com[5] = com[5];
break;
case 0x12: //<2F><><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Infrare.Transmition(infrare_com, 6);
break;
case 0x20: //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>
if (com[3] == 0x01)
LED.LeftTurnOn();
else
LED.LeftTurnOff();
if (com[4] == 0x01)
LED.RightTurnOn();
else
LED.RightTurnOff();
break;
case 0x30: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (com[3] == 0x01)
BEEP.TurnOn();
else
BEEP.TurnOff();
break;
case 0x40: //<2F><><EFBFBD><EFBFBD>
break;
case 0x50: //LCDͼƬ<CDBC>Ϸ<EFBFBD>ҳ
Command.Judgment(Command.command13);
ExtSRAMInterface.ExMem_Write_Bytes(Command.command13, 8);
break;
case 0x51: //LCDͼƬ<CDBC>·<EFBFBD>ҳ
Command.Judgment(Command.command14);
ExtSRAMInterface.ExMem_Write_Bytes(Command.command14, 8);
break;
case 0x61: //<2F><>Դ<EFBFBD><D4B4>һ<EFBFBD><D2BB>
Infrare.Transmition(Command.HW_Dimming1, 4);
break;
case 0x62: //<2F><>Դ<EFBFBD>Ӷ<EFBFBD><D3B6><EFBFBD>
Infrare.Transmition(Command.HW_Dimming2, 4);
break;
case 0x63: //<2F><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Infrare.Transmition(Command.HW_Dimming3, 4);
break;
case 0x80: //<2F>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>
if (com[3] == 0x01)
{
sendflag = 0x01; //<2F>ϴ<EFBFBD><CFB4>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD><EFBFBD>
}
else
{
sendflag = 0x00; //<2F>ر<EFBFBD><D8B1>ϴӳ<CFB4><D3B3><EFBFBD><EFBFBD><EFBFBD>
}
case 0x91:
if (com[3] == 0x03) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
//Servoangle_control(com[4]);
}
break;
default:
break;
}
}
void Handler::Key_0()
{
2 years ago
int point_cnt = 0;
AutoPathRunner::MapPoint* points = AutoPathRunner::DecodeRoute("E2-D2-B2-B4-B6-B7", point_cnt);
AutoPathRunner::DoRun(points, point_cnt, AutoPathRunner::CarHeadPosition::Y_Negitive, AutoRunnerCallback);
2 years ago
delay(1500);
AutoPathRunner::ReversingIntoGarage(true, 3);
}
void Handler::Key_1()
{
/*OpenMVOpt::OpenMVTrack_Disc_CloseUp();
2 years ago
delay(500);
OpenMVOpt::Servo_Control(0);*/
AccurateMotor.TurnLeft(90);
AccurateMotor.DelayUntilCarStop();
delay(2000);
AccurateMotor.TurnLeft(180);
AccurateMotor.DelayUntilCarStop();
}
void Handler::Key_2()
{
2 years ago
OpenMVOpt::Servo_Control(-60);
delay(500);
2 years ago
OpenMVOpt::OpenMV_Track(8, []() { return false; }, false);
AutoPathRunner::ReversingIntoGarage(true, 0x03);
}
void Handler::Key_3()
{
uint8_t data[128] = { 0 };
OpenMVOpt::OpenMVQr_Disc_StartUp();
if (!OpenMVOpt::OpenMV_WaitQRData(data, 128, 2000))
{
OpenMVOpt::OpenMVQr_Disc_CloseUp();
LED.LeftTurnOn();
}
else
{
OpenMVOpt::OpenMVQr_Disc_CloseUp();
LED.RightTurnOn();
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);
cmd.CMD_IR_CarLicenseMode_5to6_XY(str[4], str[5], 'B', '6');
}
}
void Handler::KEY_Handler(uint8_t k_value)
{
switch (k_value)
{
case 1:
Key_0();
break;
case 2:
Key_1();
break;
case 3:
Key_2();
break;
case 4:
Key_3();
break;
}
}