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

/* 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