mirror of
https://github.com/Show-maket/IR-protocol.git
synced 2025-05-04 07:10:16 +00:00
refactor
This commit is contained in:
parent
e752d0fb50
commit
d46640b145
@ -6,8 +6,8 @@ std::list<IR_Decoder*>& IR_Decoder::get_dec_list() // определение ф
|
||||
return dec_list; // возвращается ссылка на переменную
|
||||
}
|
||||
|
||||
IR_Decoder::IR_Decoder(const uint8_t isrPin, uint16_t addr, IR_Encoder *encPair)
|
||||
: IR_DecoderRaw(isrPin, addr, encPair)
|
||||
IR_Decoder::IR_Decoder(const uint8_t pin, uint16_t addr, IR_Encoder *encPair)
|
||||
: IR_DecoderRaw(pin, addr, encPair)
|
||||
{
|
||||
get_dec_list().push_back(this);
|
||||
};
|
||||
|
@ -24,7 +24,7 @@ public:
|
||||
PacketTypes::Request gotRequest;
|
||||
PacketTypes::BasePack gotRaw;
|
||||
|
||||
IR_Decoder(const uint8_t isrPin, uint16_t addr, IR_Encoder *encPair = nullptr);
|
||||
IR_Decoder(const uint8_t pin, uint16_t addr, IR_Encoder *encPair = nullptr);
|
||||
~IR_Decoder();
|
||||
|
||||
static void tick();
|
||||
|
@ -1,8 +1,9 @@
|
||||
#include "IR_DecoderRaw.h"
|
||||
#include "IR_Encoder.h"
|
||||
|
||||
IR_DecoderRaw::IR_DecoderRaw(const uint8_t isrPin, uint16_t addr, IR_Encoder *encPair) : isrPin(isrPin), encoder(encPair)
|
||||
IR_DecoderRaw::IR_DecoderRaw(const uint8_t pin, uint16_t addr, IR_Encoder *encPair) : encoder(encPair)
|
||||
{
|
||||
setPin(pin);
|
||||
id = addr;
|
||||
prevRise = prevFall = prevPrevFall = prevPrevRise = 0;
|
||||
if (encPair != nullptr)
|
||||
@ -46,6 +47,11 @@ volatile uint32_t time_;
|
||||
|
||||
void IR_DecoderRaw::isr()
|
||||
{
|
||||
|
||||
if(isPairSending){
|
||||
return;
|
||||
}
|
||||
|
||||
noInterrupts();
|
||||
// time_ = HAL_GetTick() * 1000 + ((SysTick->LOAD + 1 - SysTick->VAL) * 1000) / SysTick->LOAD + 1;
|
||||
time_ = micros();
|
||||
@ -68,7 +74,7 @@ void IR_DecoderRaw::isr()
|
||||
oldTime = time_;
|
||||
|
||||
FrontStorage edge;
|
||||
edge.dir = digitalRead(isrPin);
|
||||
edge.dir = port->IDR & mask;
|
||||
edge.time = time_;
|
||||
|
||||
subBuffer.push(edge);
|
||||
|
@ -35,14 +35,12 @@ protected:
|
||||
bool availableRaw();
|
||||
|
||||
public:
|
||||
const uint8_t isrPin; // Пин прерывания
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
/// @brief Конструктор
|
||||
/// @param isrPin Номер вывода прерывания/данных от приёмника (2 или 3 для atmega 328p)
|
||||
/// @param pin Номер вывода прерывания/данных от приёмника (2 или 3 для atmega 328p)
|
||||
/// @param addr Адрес приёмника
|
||||
/// @param encPair Указатель на передатчик, работающий в паре
|
||||
IR_DecoderRaw(const uint8_t isrPin, uint16_t addr, IR_Encoder *encPair = nullptr);
|
||||
IR_DecoderRaw(const uint8_t pin, uint16_t addr, IR_Encoder *encPair = nullptr);
|
||||
|
||||
void isr(); // Функция прерывания
|
||||
void tick(); // Обработка приёмника, необходима для работы
|
||||
|
@ -1,5 +1,11 @@
|
||||
#include "IR_config.h"
|
||||
|
||||
void IR_FOX::setPin(uint8_t pin){
|
||||
this->pin = pin;
|
||||
port = digitalPinToPort(pin);
|
||||
mask = digitalPinToBitMask(pin);
|
||||
}
|
||||
|
||||
void IR_FOX::checkAddressRuleApply(uint16_t address, uint16_t id, bool &flag)
|
||||
{
|
||||
flag = false;
|
||||
|
119
IR_config.h
119
IR_config.h
@ -6,7 +6,8 @@
|
||||
|
||||
Для работы в паре положить декодер в энкодер
|
||||
|
||||
*/// Адресация с 1 до 65 499
|
||||
*/
|
||||
// Адресация с 1 до 65 499
|
||||
#define IR_Broadcast 65000 // 65 500 ~ 65 535 - широковещательные пакеты (всем), возможно разделить на 35 типов
|
||||
/*
|
||||
Адрес 0 запрещен и зарезервирован под NULL, либо тесты
|
||||
@ -48,51 +49,51 @@ msg type:
|
||||
#define IR_MSG_ 5U // | 101..... | = ??
|
||||
#define IR_MSG_DATA_NOACCEPT 6U // | 110..... | = данные, не требующие подтверждения
|
||||
#define IR_MSG_DATA_ACCEPT 7U // | 111..... | = данные требующие подтверждения
|
||||
;/* // ----------
|
||||
; /* // ----------
|
||||
|
||||
/``````````````````````````````` подтверждение `````````````````````````````\ /``````````````````````````````````````` запрос ``````````````````````````````````\
|
||||
|
||||
{``````````} [````````````````````````] [``````````````````] [``````````````] {``````````} [````````````````````````] [````````````````````````] [``````````````]
|
||||
{ msg type } [ addr_from uint16_t ] [=== customByte ===] [ CRC Bytes ] { msg type } [ addr_from uint16_t ] [ addr_to uint16_t ] [ CRC Bytes ]
|
||||
{..........} [........................] [..................] [..............] {..........} [........................] [........................] [..............]
|
||||
|
||||
{ 001..... } [addr_from_H][addr_from_L] [=== customByte ===] [ crc1 ][ crc2 ] { 010..... } [addr_from_H][addr_from_L] [addr_from_H][addr_from_L] [ crc1 ][ crc2 ]
|
||||
| 0 1 2 3 4 5 | 0 1 2 3 4 5 6
|
||||
\________________________________________________________________/ | \_____________________________________________________________________/ |
|
||||
| | | |
|
||||
\________________________________________________________________________/ \_____________________________________________________________________________/
|
||||
/``````````````````````````````` подтверждение `````````````````````````````\ /``````````````````````````````````````` запрос ``````````````````````````````````\
|
||||
|
||||
{``````````} [````````````````````````] [``````````````````] [``````````````] {``````````} [````````````````````````] [````````````````````````] [``````````````]
|
||||
{ msg type } [ addr_from uint16_t ] [=== customByte ===] [ CRC Bytes ] { msg type } [ addr_from uint16_t ] [ addr_to uint16_t ] [ CRC Bytes ]
|
||||
{..........} [........................] [..................] [..............] {..........} [........................] [........................] [..............]
|
||||
|
||||
{ 001..... } [addr_from_H][addr_from_L] [=== customByte ===] [ crc1 ][ crc2 ] { 010..... } [addr_from_H][addr_from_L] [addr_from_H][addr_from_L] [ crc1 ][ crc2 ]
|
||||
| 0 1 2 3 4 5 | 0 1 2 3 4 5 6
|
||||
\________________________________________________________________/ | \_____________________________________________________________________/ |
|
||||
| | | |
|
||||
\________________________________________________________________________/ \_____________________________________________________________________________/
|
||||
|
||||
customByte - контрольная сумма принятых данных по poly1
|
||||
customByte - контрольная сумма принятых данных по poly1
|
||||
|
||||
|
||||
|
||||
/`````````````````````` Задний сигнал машинки без адресации ``````````````````````\
|
||||
|
||||
{``````````} [````````````````````````] [````````````````````````] [``````````````]
|
||||
{ msg type } [ addr_from uint16_t ] [====== data bytes ======] [ CRC Bytes ]
|
||||
{..........} [........................] [........................] [..............]
|
||||
|
||||
{ 0000xxxx } [addr_from_H][addr_from_L] [data_H][data_n..][data_L] [ crc1 ][ crc2 ]
|
||||
| 0 1 2 3 | |
|
||||
\_____________________________________________________________________/ |
|
||||
| |
|
||||
\_____________________________________________________________________________/
|
||||
/`````````````````````` Задний сигнал машинки без адресации ``````````````````````\
|
||||
|
||||
{``````````} [````````````````````````] [````````````````````````] [``````````````]
|
||||
{ msg type } [ addr_from uint16_t ] [====== data bytes ======] [ CRC Bytes ]
|
||||
{..........} [........................] [........................] [..............]
|
||||
|
||||
{ 0000xxxx } [addr_from_H][addr_from_L] [data_H][data_n..][data_L] [ crc1 ][ crc2 ]
|
||||
| 0 1 2 3 | |
|
||||
\_____________________________________________________________________/ |
|
||||
| |
|
||||
\_____________________________________________________________________________/
|
||||
|
||||
|
||||
|
||||
/```````````````````````````````````` Задний сигнал машинки с адресацией ````````````````````````````````````\
|
||||
|
||||
{``````````} [````````````````````````] [````````````````````````] [````````````````````````] [``````````````]
|
||||
{ msg type } [ addr_from uint16_t ] [ addr_to uint16_t ] [====== data bytes ======] [ CRC Bytes ]
|
||||
{..........} [........................] [........................] [........................] [..............]
|
||||
|
||||
{ 0001xxxx } [addr_from_H][addr_from_L] [addr_from_H][addr_from_L] [data_H][data_n..][data_L] [ crc1 ][ crc2 ]
|
||||
| 0 1 2 3 4 5 | |
|
||||
\________________________________________________________________________________________________/ |
|
||||
| |
|
||||
\________________________________________________________________________________________________________/
|
||||
/```````````````````````````````````` Задний сигнал машинки с адресацией ````````````````````````````````````\
|
||||
|
||||
{``````````} [````````````````````````] [````````````````````````] [````````````````````````] [``````````````]
|
||||
{ msg type } [ addr_from uint16_t ] [ addr_to uint16_t ] [====== data bytes ======] [ CRC Bytes ]
|
||||
{..........} [........................] [........................] [........................] [..............]
|
||||
|
||||
{ 0001xxxx } [addr_from_H][addr_from_L] [addr_from_H][addr_from_L] [data_H][data_n..][data_L] [ crc1 ][ crc2 ]
|
||||
| 0 1 2 3 4 5 | |
|
||||
\________________________________________________________________________________________________/ |
|
||||
| |
|
||||
\________________________________________________________________________________________________________/
|
||||
|
||||
*/
|
||||
*/
|
||||
|
||||
#define IR_MASK_MSG_TYPE 0b00000111
|
||||
#define IR_MASK_MSG_INFO 0b00011111
|
||||
@ -101,14 +102,14 @@ customByte - контрольная сумма принятых данных п
|
||||
/////////////////////////////////////////////////////////////////////////////////////*/
|
||||
typedef uint16_t crc_t;
|
||||
|
||||
#define BRUTEFORCE_CHECK // Перепроверяет пакет на 1 битные ошибки //TODO: зависает
|
||||
// #define BRUTEFORCE_CHECK // Перепроверяет пакет на 1 битные ошибки //TODO: зависает
|
||||
#define bytePerPack 16 // колличество байтов в пакете
|
||||
#ifndef freeFrec
|
||||
#define freeFrec false
|
||||
#endif
|
||||
|
||||
#ifndef subBufferSize
|
||||
#define subBufferSize 5 //Буфер для складирования фронтов, пока их не обработают (передатчик)
|
||||
#define subBufferSize 50 // Буфер для складирования фронтов, пока их не обработают (передатчик)
|
||||
#endif
|
||||
|
||||
#define preambPulse 3
|
||||
@ -127,26 +128,25 @@ typedef uint16_t crc_t;
|
||||
|
||||
#define dataByteSizeMax (msgBytes + addrBytes + addrBytes + bytePerPack + crcBytes)
|
||||
|
||||
#define preambFronts (preambPulse*2) // количество фронтов преамбулы (Приём)
|
||||
#define preambFronts (preambPulse * 2) // количество фронтов преамбулы (Приём)
|
||||
#define preambToggle ((bitPauseTakts * 2 + bitActiveTakts) * 2 - 1) // колличество переключений преамбулы (Передача)
|
||||
|
||||
#define carrierFrec 38000U // частота несущей (Приём/Передача)
|
||||
#define carrierPeriod (1000000U/carrierFrec) // период несущей в us (Приём)
|
||||
#define carrierPeriod (1000000U / carrierFrec) // период несущей в us (Приём)
|
||||
|
||||
// В процессе работы значения будут отклонятся в соответствии с предыдущим битом
|
||||
#define bitActiveTakts 25U // длительность высокого уровня в тактах
|
||||
#define bitPauseTakts 12U // длительность низкого уровня в тактах
|
||||
|
||||
#define bitTakts (bitActiveTakts+bitPauseTakts) // Общая длительность бита в тактах
|
||||
#define bitTime (bitTakts*carrierPeriod) // Общая длительность бита
|
||||
#define bitTakts (bitActiveTakts + bitPauseTakts) // Общая длительность бита в тактах
|
||||
#define bitTime (bitTakts * carrierPeriod) // Общая длительность бита
|
||||
#define tolerance 300U
|
||||
|
||||
|
||||
|
||||
class IR_FOX {
|
||||
class IR_FOX
|
||||
{
|
||||
public:
|
||||
|
||||
struct PackOffsets {
|
||||
struct PackOffsets
|
||||
{
|
||||
uint8_t msgOffset;
|
||||
uint8_t addrFromOffset;
|
||||
uint8_t addrToOffset;
|
||||
@ -154,36 +154,41 @@ public:
|
||||
uint8_t crcOffset;
|
||||
};
|
||||
|
||||
struct ErrorsStruct {
|
||||
struct ErrorsStruct
|
||||
{
|
||||
uint8_t lowSignal = 0;
|
||||
uint8_t highSignal = 0;
|
||||
uint8_t other = 0;
|
||||
|
||||
void reset() {
|
||||
void reset()
|
||||
{
|
||||
lowSignal = 0;
|
||||
highSignal = 0;
|
||||
other = 0;
|
||||
}
|
||||
uint16_t all() { return lowSignal + highSignal + other; }
|
||||
|
||||
};
|
||||
|
||||
struct PackInfo {
|
||||
uint8_t* buffer = nullptr;
|
||||
struct PackInfo
|
||||
{
|
||||
uint8_t *buffer = nullptr;
|
||||
uint8_t packSize = 0;
|
||||
uint16_t crc = 0;
|
||||
ErrorsStruct err;
|
||||
uint16_t rTime = 0;
|
||||
};
|
||||
|
||||
|
||||
inline uint16_t getId() { return id; }
|
||||
inline void setId(uint16_t id) { this->id = id; }
|
||||
static void checkAddressRuleApply(uint16_t address, uint16_t id, bool& flag);
|
||||
static void checkAddressRuleApply(uint16_t address, uint16_t id, bool &flag);
|
||||
void setPin(uint8_t pin);
|
||||
inline uint8_t getPin(){return pin;};
|
||||
|
||||
protected:
|
||||
uint16_t id;
|
||||
uint8_t pin;
|
||||
GPIO_TypeDef *port;
|
||||
uint16_t mask;
|
||||
ErrorsStruct errors;
|
||||
uint8_t crc8(uint8_t* data, uint8_t start, uint8_t end, uint8_t poly);
|
||||
|
||||
uint8_t crc8(uint8_t *data, uint8_t start, uint8_t end, uint8_t poly);
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user