void asksin_func(char *in) { #ifndef HAS_ASKSIN_FUP if(in[1] == 'r') { // Reception on #else if((in[1] == 'r') || (in[1] == 'R')) { // Reception on if (in[1] == 'R') { asksin_update_mode = 1; } else { asksin_update_mode = 0; } #endif rf_asksin_init(); asksin_on = 1; } else if(in[1] == 's') { // Send asksin_send(in+1); } else { // Off asksin_on = 0; } }
void it_func(char *in) { if (in[1] == 't') { fromdec (in+2, (uint8_t *)&it_interval); DU(it_interval,0); DNL(); } else if (in[1] == 's') { if (in[2] == 'r') { // Modify Repetition-counter fromdec (in+3, (uint8_t *)&it_repetition); DU(it_repetition,0); DNL(); #ifdef HAS_HOMEEASY } else if (in[2] == 'h') { // HomeEasy it_send (in, DATATYPE_HE); } else if (in[2] == 'e') { // HomeEasy EU it_send (in, DATATYPE_HEEU); #endif } else { it_send (in, DATATYPE_IT); // Sending real data } //sending real data } else if (in[1] == 'r') { // Start of "Set Frequency" (f) #ifdef HAS_ASKSIN if (asksin_on) { restore_asksin = 1; asksin_on = 0; } #endif #ifdef HAS_MORITZ if (moritz_on) { restore_moritz = 1; moritz_on = 0; } #endif it_tunein (); intertechno_on = 1; } else if (in[1] == 'f') { // Set Frequency if (in[2] == '0' ) { it_frequency[0] = 0x10; it_frequency[1] = 0xb0; it_frequency[2] = 0x71; } else { fromhex (in+2, it_frequency, 3); } DC('i');DC('f');DC(':'); DH2(it_frequency[0]); DH2(it_frequency[1]); DH2(it_frequency[2]); DNL(); } else if (in[1] == 'x') { // Reset Frequency back to Eeprom value if(0) { ; #ifdef HAS_ASKSIN } else if (restore_asksin) { restore_asksin = 0; rf_asksin_init(); asksin_on = 1; ccRX(); #endif #ifdef HAS_MORITZ } else if (restore_moritz) { restore_moritz = 0; rf_moritz_init(); #endif } else { ccInitChip(EE_CC1100_CFG); // Set back to Eeprom Values if(tx_report) { // Enable RX ccRX(); } else { ccStrobe(CC1100_SIDLE); } } intertechno_on = 0; } }
void asksin_send(char *in) { uint8_t msg[MAX_ASKSIN_MSG]; uint8_t ctl; uint8_t l; uint32_t ts1, ts2; uint8_t hblen = fromhex(in+1, msg, MAX_ASKSIN_MSG-1); if ((hblen-1) != msg[0]) { // DS_P(PSTR("LENERR\r\n")); return; } // in AskSin mode already? if(!asksin_on) { rf_asksin_init(); my_delay_ms(3); // 3ms: Found by trial and error } ctl = msg[2]; // "crypt" msg[1] = (~msg[1]) ^ 0x89; for (l = 2; l < msg[0]; l++) msg[l] = (msg[l-1] + 0xdc) ^ msg[l]; msg[l] = msg[l] ^ ctl; // enable TX, wait for CCA get_timestamp(&ts1); do { CCSTROBE(CC1100_STX); if (CC1100_READREG(CC1100_MARCSTATE) != MARCSTATE_TX) { get_timestamp(&ts2); if (((ts2 > ts1) && (ts2 - ts1 > ASKSIN_WAIT_TICKS_CCA)) || ((ts2 < ts1) && (ts1 + ASKSIN_WAIT_TICKS_CCA < ts2))) { DS_P(PSTR("ERR:CCA\r\n")); goto out; } } } while (CC1100_READREG(CC1100_MARCSTATE) != MARCSTATE_TX); if (ctl & (1 << 4)) { // BURST-bit set? // According to ELV, devices get activated every 300ms, so send burst for 360ms for(l = 0; l < 3; l++) my_delay_ms(120); // arg is uint_8, so loop } else { my_delay_ms(10); } // send CC1100_ASSERT; cc1100_sendbyte(CC1100_WRITE_BURST | CC1100_TXFIFO); for(uint8_t i = 0; i < hblen; i++) { cc1100_sendbyte(msg[i]); } CC1100_DEASSERT; // wait for TX to finish while(CC1100_READREG( CC1100_MARCSTATE ) == MARCSTATE_TX) ; out: if (CC1100_READREG( CC1100_MARCSTATE ) == MARCSTATE_TXFIFO_UNDERFLOW) { CCSTROBE( CC1100_SFTX ); CCSTROBE( CC1100_SIDLE ); CCSTROBE( CC1100_SNOP ); } if(asksin_on) { do { CCSTROBE(CC1100_SRX); } while (CC1100_READREG(CC1100_MARCSTATE) != MARCSTATE_RX); } else { set_txrestore(); } }
static void it_send (char *in, uint8_t datatype) { //while (rf_isreceiving()) { //_delay_ms(1); //} int8_t i, j, k; LED_ON(); #if defined (HAS_IRRX) || defined (HAS_IRTX) //Blockout IR_Reception for the moment cli(); #endif // If NOT InterTechno mode if(!intertechno_on) { #ifdef HAS_ASKSIN if (asksin_on) { restore_asksin = 1; asksin_on = 0; } #endif #ifdef HAS_MORITZ if(moritz_on) { restore_moritz = 1; moritz_on = 0; } #endif it_tunein(); my_delay_ms(3); // 3ms: Found by trial and error } ccStrobe(CC1100_SIDLE); ccStrobe(CC1100_SFRX ); ccStrobe(CC1100_SFTX ); ccTX(); // Enable TX int8_t sizeOfPackage = strlen(in)-1; // IT-V1 = 14, IT-V3 = 33, IT-V3-Dimm = 37 int8_t mode = 0; // IT V1 //DU(sizeOfPackage, 3); if (sizeOfPackage == 33 || sizeOfPackage == 37) { mode = 1; // IT V3 } for(i = 0; i < it_repetition; i++) { if (datatype == DATATYPE_IT) { if (mode == 1) { send_IT_sync_V3(); send_IT_latch_V3(); } else { // Sync-Bit for IT V1 send before package CC1100_SET_OUT; // High my_delay_us(it_interval); CC1100_CLEAR_OUT; // Low for(k = 0; k < 31; k++) { my_delay_us(it_interval); } } #ifdef HAS_HOMEEASY } else if (datatype == DATATYPE_HE) { send_IT_sync_HE(DATATYPE_HE); } else if (datatype == DATATYPE_HEEU) { send_IT_sync_HE(DATATYPE_HEEU); #endif } uint8_t startCount = 1; #ifdef HAS_HOMEEASY if (datatype == DATATYPE_HE || datatype == DATATYPE_HEEU) { startCount = 2; } #endif for(j = startCount; j < sizeOfPackage; j++) { if(in[j+1] == '0') { if (datatype == DATATYPE_IT) { if (mode == 1) { send_IT_bit_V3(0); } else { send_IT_bit(0); } #ifdef HAS_HOMEEASY } else { send_IT_bit_HE(0, datatype); #endif } } else if (in[j+1] == '1') { if (datatype == DATATYPE_IT) { if (mode == 1) { send_IT_bit_V3(1); } else { send_IT_bit(1); } #ifdef HAS_HOMEEASY } else { send_IT_bit_HE(1, datatype); #endif } } else if (in[j+1] == '2') { send_IT_bit_V3(2); } else { if (mode == 1) { send_IT_bit_V3(3); } else { send_IT_bit(2); } } } //if (mode == 1) { // send_IT_sync_V3(); //} } //Do it n Times if(intertechno_on) { if(tx_report) { // Enable RX ccRX(); } else { ccStrobe(CC1100_SIDLE); } } #ifdef HAS_ASKSIN else if (restore_asksin) { restore_asksin = 0; rf_asksin_init(); asksin_on = 1; ccRX(); } #endif #ifdef HAS_MORITZ else if (restore_moritz) { restore_moritz = 0; rf_moritz_init(); } #endif else { set_txrestore(); } #if defined (HAS_IRRX) || defined (HAS_IRTX) //Activate IR_Reception again sei(); #endif LED_OFF(); DC('i');DC('s'); #ifdef HAS_HOMEEASY if (datatype == DATATYPE_HE) { DC('h'); } else if (datatype == DATATYPE_HEEU) { DC('e'); } #endif for(j = 1; j < sizeOfPackage; j++) { if(in[j+1] == '0') { DC('0'); } else if (in[j+1] == '1') { DC('1'); } else if (in[j+1] == '2') { DC('2'); } else { if (datatype == DATATYPE_IT) { if (mode == 1) { DC('D'); } else { DC('F'); } } } } DNL(); }