PingPong/Core/Src/IR_CMD_Handler.c
2024-08-25 20:27:17 +03:00

164 lines
3.2 KiB
C

/*
* IR_CMD_Handler.c
*
* Created on: Aug 25, 2024
* Author: DashyFox
*/
#include "IR_CMD_Handler.h"
#include "IR.h"
#include "SimpleTimer.h"
#include "Print.h"
#include "ShiftReg.h"
#define IR_Timeout 137
#define ResetInputProgerss_Timeout 2500
#define NULL_NumberParam 0xFFFF
//extern unsigned char IR_Command;
//extern unsigned char IR_Address;
extern unsigned char IRStatus;
IRData data;
IRData old_data;
unsigned char b1 = 1;
unsigned char b2 = 1;
unsigned char b3 = 1;
uint32_t IR_Timeout_timer = 0;
uint8_t dataHandled_flag = 0;
uint32_t inputInProgerss_timer = 0;
uint8_t inputInProgerss = 0;
uint8_t digitInputInProgerss = 0;
uint8_t inputDigit = 0; // left = 0 to right
uint16_t inputNumberParam = NULL_NumberParam;
enum IR_MENU {
IR_MENU_Home,
IR_MENU_SHOT, IR_MENU_PROGR, IR_MENU_MACRO, IR_MENU_,
};
void IR_Home_Process();
void IR_Shot_Selection();
void IR_CMD_Clear();
void (*InputHandler)(void) = IR_Home_Process;
void IR_CMD_Handler() {
// timeout tick
if (dataHandled_flag && (millis() - IR_Timeout_timer > IR_Timeout)) {
dataHandled_flag = 0;
}
if (inputInProgerss
&& (millis() - inputInProgerss_timer > ResetInputProgerss_Timeout)) {
IR_CMD_Clear();
}
// cmd handler
if (IR_Available()) {
data = getIRData();
IR_Timeout_timer = millis();
// works once per button press
if (memcmp(&data, &old_data, sizeof(IRData)) != 0
|| !dataHandled_flag) {
dataHandled_flag = 1;
if (IR_Address == 0x01) {
printNumber(data.command);
InputHandler();
inputInProgerss = 1;
inputInProgerss_timer = millis();
}
memcpy(&old_data, &data, sizeof(IRData));
}
IR_Timeout_timer = millis();
ClearIRStatus();
}
}
void IR_CMD_Clear() {
InputHandler = IR_Home_Process;
inputDigit = 0;
inputInProgerss = 0;
digitInputInProgerss = 0;
inputNumberParam = NULL_NumberParam;
SetShiftReg_inline(0, 0xff, 0);
}
void IR_Home_Process() {
InputHandler = IR_Home_Process;
SetShiftReg_inline(0xff, 0, 0);
switch (data.command) {
case IR_FONT_RIGHT:
InputHandler = IR_Shot_Selection;
break;
// case IR_FONT_RIGHT:
// // if(!(b1>64 || b2> 64|| b3>64)) b1 = 64;
// // else
// // {
// // b1 = b1>>1;
// // b2 = b2<<1;
// // b3 = b3<<1;
// // }
// SetShiftReg_inline(b1, b2, b3);
// break;
case IR_FRONT_MID:
SetShiftReg_inline(0, 0, 0);
b1 = b2 = b3 = 0;
break;
case IR_FRONT_LEFT:
// if(!b3)
// b3 = 128;
// b3 = b3>>1;
// if(!b3)
// b2 = 64;
SetShiftReg_inline(++b1, ++b2, ++b3);
break;
default:
break;
}
}
void IR_Shot_Selection() { // Сделать общим
SetShiftReg_inline(0x03, 0, 0);
if (0 <= data.command && data.command <= 9) {
if (digitInputInProgerss) {
inputNumberParam = inputNumberParam * 10; // dec shift << 1
inputNumberParam += data.command + 1;
SetShiftReg_inline(0xF0, 0, 0);
} else {
inputNumberParam = data.command + 1;
}
digitInputInProgerss = 1;
} else {
digitInputInProgerss = 0;
switch (data.command) {
case IR_ENTER:
if(inputNumberParam != NULL_NumberParam){
SetShiftReg_inline(0, 0, inputNumberParam);
}
inputNumberParam = NULL_NumberParam;
digitInputInProgerss = 0;
break;
default:
IR_Home_Process();
break;
}
}
}