Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <IRremote.h>
- #define PROTO_RAW 0x0
- #define PROTO_NEC 0x1
- #define PROTO_SONY 0x2
- #define PROTO_RC5 0x3
- #define PROTO_RC6 0x4
- #define PROTO_DISH 0x5
- #define PROTO_SHARP 0x6
- #define PROTO_JVC 0x7
- #define PROTO_SANYO 0x8
- #define PROTO_MITSUBISHI 0x9
- #define PROTO_SAMSUNG 0xa
- #define PROTO_LG 0xb
- #define PROTO_WHYNTER 0xc
- #define PROTO_AIWA_RC_T501 0xd
- #define PROTO_PANASONIC 0xe
- #define PROTO_DENON 0xf
- #define POSTAMBLE "\x5a\x5a"
- int recvPin = 4;
- IRrecv irrecv(recvPin);
- IRsend irsend;
- typedef struct EtatFirmware {
- char current_proto = PROTO_RAW;
- unsigned int *raw = NULL;
- unsigned int raw_length = 0;
- unsigned int current_freq = 38; // (38kHz)
- unsigned int current_code_length = 0;
- unsigned long current_code = 0;
- } EtatFirmware;
- EtatFirmware etatcourant;
- void reset() {
- etatcourant.current_proto = 0x0;
- etatcourant.raw = NULL;
- etatcourant.raw_length = 0;
- etatcourant.current_freq = 38;
- etatcourant.current_code = 0;
- etatcourant.current_code_length = 0;
- }
- void setup() {
- Serial.begin(200000);
- irrecv.enableIRIn();
- reset();
- }
- int send(char proto,char *datas,unsigned int data_length) {
- if (proto == PROTO_RAW) {
- unsigned int *irSignal = malloc(data_length);
- unsigned int khz = etatcourant.current_freq;
- for (int i=0,j=0;i<data_length;i+=2,j++) {
- irSignal[j] = char2uint(datas+i);
- }
- /*
- for (int i=0;i<data_length/2;i++) {
- Serial.println(irSignal[i]);
- }
- */
- irsend.sendRaw(irSignal, data_length / sizeof(unsigned int), khz);
- return 0;
- }
- else if (proto == PROTO_NEC) {
- unsigned long code = char2ulong(datas);
- irsend.sendNEC(code,data_length);
- return 0;
- }
- else {
- return 1;
- }
- }
- void setFrequency(unsigned int khz){
- etatcourant.current_freq = khz;
- }
- unsigned int getFrequency(){
- return etatcourant.current_freq;
- }
- char encoding (decode_results *results)
- {
- switch (results->decode_type) {
- default:
- case UNKNOWN: return PROTO_RAW; break ;
- case NEC: return PROTO_NEC; break ;
- case SONY: return PROTO_SONY; break ;
- case RC5: return PROTO_RC5; break ;
- case RC6: return PROTO_RC6; break ;
- case DISH: return PROTO_DISH; break ;
- case SHARP: return PROTO_SHARP; break ;
- case JVC: return PROTO_JVC; break ;
- case SANYO: return PROTO_SANYO; break ;
- case MITSUBISHI: return PROTO_MITSUBISHI; break ;
- case SAMSUNG: return PROTO_SAMSUNG; break ;
- case LG: return PROTO_LG; break ;
- case WHYNTER: return PROTO_WHYNTER; break ;
- case AIWA_RC_T501: return PROTO_AIWA_RC_T501; break ;
- case PANASONIC: return PROTO_PANASONIC; break ;
- case DENON: return PROTO_DENON; break ;
- }
- }
- unsigned long ircode (decode_results *results)
- {
- // Serial.println(results->value, HEX);
- return results->value;
- }
- void setInfo (decode_results *results)
- {
- // Check if the buffer overflowed
- if (results->overflow) {
- return;
- }
- unsigned int current_proto = encoding(results);
- unsigned long current_code = ircode(results);
- if (!(current_code == 0xFFFFFFFF and current_proto == 1) ){
- etatcourant.current_code = current_code;
- etatcourant.current_proto = current_proto;
- etatcourant.current_code_length = results->bits;
- etatcourant.raw_length = results->rawlen - 1;
- if (etatcourant.raw != NULL) {
- free(etatcourant.raw);
- }
- unsigned int *raw = malloc(sizeof(unsigned int) * etatcourant.raw_length);
- for (int i = 1; i < results->rawlen; i++) {
- raw[i-1] = results->rawbuf[i] * USECPERTICK;
- }
- etatcourant.raw = raw;
- }
- }
- char* uint2char(unsigned int num){
- char *p = (char *)malloc(sizeof(unsigned int));
- p[0] = (num >> 8) & 0xFF;
- p[1] = (num) & 0xFF;
- return p;
- }
- unsigned int char2uint(char *p) {
- unsigned int num =(unsigned int)((0xFF00 & (p[0] << 8)) | (p[1] & 0x00FF));
- return num ;
- }
- char* ulong2char(unsigned long num){
- char *p = malloc(sizeof(char)*sizeof(unsigned long));
- p[0] = (num >> 24) & 0xFF;
- p[1] = (num >> 16) & 0xFF;
- p[2] = (num >> 8) & 0xFF;
- p[3] = (num) & 0xFF;
- return p;
- }
- char* char2ulong(char *p) {
- return ((unsigned long)((p[0] << 24) & 0xFF000000)|((p[1] << 16) & 0x00FF0000) | ((p[2] << 8) & 0x0000FF00) | (p[3] & 0x000000FF) );
- }
- void writeReset() {
- char ack = 0x01;
- char opcode = 0x00;
- char length[2] = {0x00, 0x00};
- Serial.write(ack);
- Serial.write(opcode);
- Serial.write(length,2);
- Serial.write(POSTAMBLE,2);
- }
- void writeFrequency() {
- char ack = 0x01;
- char opcode = 0x01;
- char length[2] = {0x00, 0x02};
- unsigned int freq = getFrequency();
- char *freqparam = uint2char(freq);
- Serial.write(ack);
- Serial.write(opcode);
- Serial.write(length,2);
- Serial.write(freqparam,2);
- free(freqparam);
- Serial.write(POSTAMBLE,2);
- }
- void writeRecv() {
- char ack = 0x01;
- char opcode = 0x03;
- unsigned int *total_length = sizeof(unsigned int) * etatcourant.raw_length;
- if (etatcourant.current_proto > 0) {
- total_length += 1 + (etatcourant.current_code_length / 8) + 2;
- }
- char *lengthparam = uint2char(total_length);
- Serial.write(ack);
- Serial.write(opcode);
- Serial.write(lengthparam,2);
- free(lengthparam);
- char *rawlength = uint2char(etatcourant.raw_length*2);
- Serial.write(rawlength, 2);
- free(rawlength);
- for (int i=0;i<etatcourant.raw_length;i++) {
- char *rawvalue = uint2char(etatcourant.raw[i]);
- Serial.write(rawvalue,2);
- free(rawvalue);
- }
- if (etatcourant.current_proto != 0x0) {
- Serial.write(etatcourant.current_proto);
- char *code_length = uint2char(etatcourant.current_code_length);
- Serial.write(code_length,2);
- free(code_length);
- char *code = ulong2char(etatcourant.current_code);
- Serial.write(code,4);
- free(code);
- }
- Serial.write(POSTAMBLE,2);
- }
- void parseRequest(char *buffer, unsigned int length) {
- // Parse Header
- char ack = buffer[0];
- char opcode = buffer[1];
- unsigned int size = char2uint(buffer+2);
- if (opcode == 0x00) {
- reset();
- writeReset();
- }
- else if (opcode == 0x01) {
- if (size != 0) {
- unsigned int freq = char2uint(buffer+4);
- setFrequency(freq);
- }
- writeFrequency();
- }
- else if (opcode == 0x02) {
- char protocol = buffer[4];
- Serial.write(buffer[5]);
- Serial.write(buffer[6]);
- unsigned int data_size = char2uint(buffer+5);
- send(protocol,buffer+7,data_size);
- Serial.write(POSTAMBLE,2);
- }
- else if (opcode == 0x03) {
- writeRecv();
- }
- }
- void loop() {
- decode_results results;
- if (irrecv.decode(&results)) {
- setInfo(&results);
- irrecv.resume();
- }
- if (Serial.available()>0) {
- char buffer[256];
- unsigned int length = Serial.readBytes(buffer,256);
- parseRequest(buffer,length);
- }
- //delay(500);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement