You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
2.7 KiB
73 lines
2.7 KiB
5 years ago
|
/* IRLib_P02_Sony.h
|
||
|
* Part of IRLib Library for Arduino receiving, decoding, and sending
|
||
|
* infrared signals. See COPYRIGHT.txt and LICENSE.txt for more information.
|
||
|
*/
|
||
|
/*
|
||
|
* Sony is backwards from most protocols. It uses a variable length mark and a fixed length
|
||
|
* space rather than a fixed mark and a variable space. Our generic send will still work
|
||
|
* however we need a custom decoding routine because it's difficult to get the generic
|
||
|
* decoder to handle a variable length mark without cluttering up the code to much.
|
||
|
* According to the protocol you must send Sony commands at least three times so we
|
||
|
* automatically do it here. Sony can be 8, 12, 15, or 20 bits in length.
|
||
|
* The 8 bit version uses a shorter trailing space at the end. The signal is modulated
|
||
|
* at 40 kHz however most 38 kHz receivers are broad enough to receive it.
|
||
|
*/
|
||
|
|
||
|
#ifndef IRLIB_PROTOCOL_02_H
|
||
|
#define IRLIB_PROTOCOL_02_H
|
||
|
#define IR_SEND_PROTOCOL_02 case 2: IRsendSony::send(data,data2); break;
|
||
|
#define IR_DECODE_PROTOCOL_02 if(IRdecodeSony::decode()) return true;
|
||
|
#ifdef IRLIB_HAVE_COMBO
|
||
|
#define PV_IR_DECODE_PROTOCOL_02 ,public virtual IRdecodeSony
|
||
|
#define PV_IR_SEND_PROTOCOL_02 ,public virtual IRsendSony
|
||
|
#else
|
||
|
#define PV_IR_DECODE_PROTOCOL_02 public virtual IRdecodeSony
|
||
|
#define PV_IR_SEND_PROTOCOL_02 public virtual IRsendSony
|
||
|
#endif
|
||
|
|
||
|
#ifdef IRLIBSENDBASE_H
|
||
|
class IRsendSony: public virtual IRsendBase {
|
||
|
public:
|
||
|
void send(uint32_t data, uint8_t nbits) {
|
||
|
for(uint8_t i=0; i<3;i++){
|
||
|
sendGeneric(data,nbits, 600*4, 600, 600*2, 600, 600, 600, 40, false,45000);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
#endif //IRLIBSENDBASE_H
|
||
|
|
||
|
#ifdef IRLIBDECODEBASE_H
|
||
|
class IRdecodeSony: public virtual IRdecodeBase {
|
||
|
public:
|
||
|
virtual bool decode(void) {
|
||
|
IRLIB_ATTEMPT_MESSAGE(F("Sony"));
|
||
|
resetDecoder();//This used to be in the receiver getResults.
|
||
|
if(recvGlobal.decodeLength!=2*8+2 && recvGlobal.decodeLength!=2*12+2 && recvGlobal.decodeLength!=2*15+2
|
||
|
&& recvGlobal.decodeLength!=2*20+2) return RAW_COUNT_ERROR;
|
||
|
if(!ignoreHeader) {
|
||
|
if (!MATCH(recvGlobal.decodeBuffer[1],600*4)) return HEADER_MARK_ERROR(600*4);
|
||
|
}
|
||
|
offset=2;//skip initial gap plus header Mark.
|
||
|
while (offset < recvGlobal.decodeLength) {
|
||
|
if (!MATCH(recvGlobal.decodeBuffer[offset],600)) return DATA_SPACE_ERROR(600);
|
||
|
offset++;
|
||
|
if (MATCH(recvGlobal.decodeBuffer[offset],600*2)) {
|
||
|
value = (value << 1) | 1;
|
||
|
}
|
||
|
else if (MATCH(recvGlobal.decodeBuffer[offset],600)) {
|
||
|
value <<= 1;
|
||
|
}
|
||
|
else return DATA_MARK_ERROR(600);
|
||
|
offset++;
|
||
|
}
|
||
|
bits = (offset - 1) / 2;
|
||
|
protocolNum = SONY;
|
||
|
return true;
|
||
|
}
|
||
|
};
|
||
|
#endif //IRLIBDECODEBASE_H
|
||
|
|
||
|
#define IRLIB_HAVE_COMBO
|
||
|
|
||
|
#endif //IRLIB_PROTOCOL_02_H
|