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++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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)
{
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);
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);
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!");
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);
delay(1500);
AutoPathRunner::ReversingIntoGarage(true, 3);
}
else
{
dynamic_route_recv.concat('-');
//Serial.println(dynamic_route_recv);
}
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()
{
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);
delay(1500);
AutoPathRunner::ReversingIntoGarage(true, 3);
}
void Handler::Key_1()
{
/*OpenMVOpt::OpenMVTrack_Disc_CloseUp();
delay(500);
OpenMVOpt::Servo_Control(0);*/
AccurateMotor.TurnLeft(90);
AccurateMotor.DelayUntilCarStop();
delay(2000);
AccurateMotor.TurnLeft(180);
AccurateMotor.DelayUntilCarStop();
}
void Handler::Key_2()
{
OpenMVOpt::Servo_Control(-60);
delay(500);
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;
}
}