mirror of
https://github.com/D4C1-Labs/Flipper-ARF.git
synced 2026-08-28 15:34:07 +00:00
99 lines
2.5 KiB
C++
99 lines
2.5 KiB
C++
#pragma once
|
|
|
|
#include "PagerDecoder.hpp"
|
|
|
|
#define TD165_ACTION_RING 0
|
|
#define TD165_ACTION_MUTE 1
|
|
#define TD165_PAGER_TURN_OFF_ALL 1005
|
|
|
|
// Retekess TD165/T119
|
|
class Td165Decoder : public PagerDecoder {
|
|
private:
|
|
const uint32_t stationMask = 0b111111111111100000000000; // leading 13 bits (of 24) are station
|
|
const uint32_t pagerMask = 0b11111111110; // next 10 bits are pager
|
|
const uint32_t actionMask = 0b1; // and the last 1 bit is action
|
|
|
|
const uint8_t stationBitCount = 13;
|
|
const uint8_t stationOffset = 11;
|
|
|
|
const uint8_t pagerBitCount = 10;
|
|
const uint8_t pagerOffset = 1;
|
|
|
|
public:
|
|
const char* GetShortName() {
|
|
return "TD165";
|
|
}
|
|
|
|
uint16_t GetStation(uint32_t data) {
|
|
uint32_t stationReversed = (data & stationMask) >> stationOffset;
|
|
return reverseBits(stationReversed, stationBitCount);
|
|
}
|
|
|
|
uint16_t GetPager(uint32_t data) {
|
|
uint32_t pagerReversed = (data & pagerMask) >> pagerOffset;
|
|
return reverseBits(pagerReversed, pagerBitCount);
|
|
}
|
|
|
|
uint8_t GetActionValue(uint32_t data) {
|
|
return data & actionMask;
|
|
}
|
|
|
|
PagerAction GetAction(uint32_t data) {
|
|
switch(GetActionValue(data)) {
|
|
case TD165_ACTION_RING:
|
|
if(GetPager(data) == TD165_PAGER_TURN_OFF_ALL) {
|
|
return TURN_OFF_ALL;
|
|
}
|
|
return RING;
|
|
|
|
case TD165_ACTION_MUTE:
|
|
return MUTE;
|
|
|
|
default:
|
|
return UNKNOWN;
|
|
}
|
|
}
|
|
|
|
uint32_t SetPager(uint32_t data, uint16_t pagerNum) {
|
|
uint32_t pagerCleared = data & ~pagerMask;
|
|
return pagerCleared | (reverseBits(pagerNum, pagerBitCount) << pagerOffset);
|
|
}
|
|
|
|
uint32_t SetActionValue(uint32_t data, uint8_t actionValue) {
|
|
return (data & ~actionMask) | actionValue;
|
|
}
|
|
|
|
uint32_t SetAction(uint32_t data, PagerAction action) {
|
|
switch(action) {
|
|
case RING:
|
|
return SetActionValue(data, TD165_ACTION_RING);
|
|
|
|
case MUTE:
|
|
return SetActionValue(data, TD165_ACTION_MUTE);
|
|
|
|
case TURN_OFF_ALL:
|
|
return SetActionValue(SetPager(data, TD165_PAGER_TURN_OFF_ALL), TD165_ACTION_RING);
|
|
|
|
default:
|
|
return data;
|
|
}
|
|
}
|
|
|
|
bool IsSupported(PagerAction action) {
|
|
switch(action) {
|
|
case RING:
|
|
case MUTE:
|
|
case TURN_OFF_ALL:
|
|
return true;
|
|
|
|
default:
|
|
return false;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
uint8_t GetActionsCount() {
|
|
return actionMask + 1;
|
|
}
|
|
};
|