void rfm12_ask_tevion_send(uint8_t * housecode, uint8_t * command, uint8_t delay, uint8_t cnt) { uint8_t code[41]; for(uint8_t i=0;i<3;i++) { rfm12_ask_encode_byte(code, i*8, housecode[i], 8); } code[24]=((housecode[2] & (1<<0))>0 ?6:12); for(uint8_t i=0;i<2;i++) { rfm12_ask_encode_byte(code, (i*8)+25, command[i], 8); } rfm12_prologue (); rfm12_trans(0x8200|(1<<5)|(1<<4)|(1<<3)); // 2. PwrMngt TX on for(uint8_t ii=cnt;ii>0;ii--) // Sequenz cnt send { wdt_kick(); uint8_t rfm12_trigger_level=0; for(uint8_t i=0;i<41;i++) { rfm12_ask_trigger(rfm12_trigger_level^=1,code[i]*delay); } rfm12_ask_trigger(0,24*delay); } rfm12_trans(0x8208); // 2. PwrMngt TX off rfm12_epilogue (); }
void rfm12_ask_2272_send(uint8_t *command, uint8_t delay, uint8_t cnt) { uint8_t code[49]; for(uint8_t i=0;i<3;i++) { rfm12_ask_encode_tribit(code, i*16, command[i], 8); } code[48]=7; //sync rfm12_prologue (); rfm12_trans(0x8200|(1<<5)|(1<<4)|(1<<3)); // 2. PwrMngt TX on for(uint8_t ii=cnt;ii>0;ii--) // Sequenz cnt send { wdt_kick(); uint8_t rfm12_trigger_level=0; for(uint8_t i=0;i<49;i++) { rfm12_ask_trigger(rfm12_trigger_level^=1,code[i]*delay); } rfm12_ask_trigger(0,24*delay); } rfm12_trans(0x8208); // 2. PwrMngt TX off rfm12_epilogue (); }
static void rfm12_txstart_hard(void) { rfm12_status = RFM12_TX; #ifdef STATUSLED_RFM12_TX_SUPPORT PIN_SET(STATUSLED_RFM12_TX); #endif ACTIVITY_LED_RFM12_TX; rfm12_index = 0; rfm12_prologue(RFM12_MODULE_IP); rfm12_trans(RFM12_CMD_PWRMGT | RFM12_PWRMGT_ET | RFM12_PWRMGT_ES | RFM12_PWRMGT_EX); rfm12_epilogue(); /* Force interrupts active no matter what. * * If we're forwarding a packet from say Ethernet, uip_buf_unlock won't * unlock since there's an active RFM12 transfer, but it'd leave * the RFM12 interrupt disabled as well. */ _uip_buf_lock = 8; rfm12_int_enable(); }
void rfm12_ask_external_filter_init(void) { rfm12_prologue(); rfm12_trans(RFM12_CMD_PWRMGT | RFM12_PWRMGT_ER | RFM12_PWRMGT_EBB); rfm12_trans(RFM12_CMD_DATAFILTER | RFM12_DATAFILTER_S); rfm12_epilogue(); }
void rfm12_ask_external_filter_init() { rfm12_prologue (); rfm12_trans(0x82C0); // 2. PwrMngt TX off, enable whole receiver chain rfm12_trans(0xC238); // 6. Data Filter Command rfm12_epilogue (); }
int16_t parse_cmd_rfm12_status(char *cmd, char *output, uint16_t len) { uint16_t s; rfm12_prologue(RFM12_MODUL_IP); s = rfm12_get_status(); rfm12_epilogue(); return ECMD_FINAL(snprintf_P(output, len, PSTR("rfm12 status: %04x"), s)); }
int16_t parse_cmd_rfm12_setmod(char *cmd, char *output, uint16_t len) { (void) output; (void) len; uint8_t mod; if (1 != sscanf_P(cmd, PSTR("%hhu"), &mod)) return ECMD_ERR_PARSE_ERROR; rfm12_prologue(RFM12_MODUL_IP); rfm12_setpower(0, mod); rfm12_epilogue(); return ECMD_FINAL_OK; }
int16_t parse_cmd_rfm12_setgain(char *cmd, char *output, uint16_t len) { (void) output; (void) len; uint8_t gain; if (1 != sscanf_P(cmd, PSTR("%hhu"), &gain)) return ECMD_ERR_PARSE_ERROR; rfm12_prologue(RFM12_MODUL_IP); rfm12_setbandwidth(rfm12_modul->rfm12_bandwidth, gain, rfm12_modul->rfm12_drssi); rfm12_epilogue(); return ECMD_FINAL_OK; }
int16_t parse_cmd_rfm12_setbaud(char *cmd, char *output, uint16_t len) { (void) output; (void) len; uint16_t baud; cmd[strlen(cmd) - 2] = 0; if (1 != sscanf_P(cmd, PSTR("%u"), &baud)) return ECMD_ERR_PARSE_ERROR; rfm12_prologue(RFM12_MODUL_IP); rfm12_setbaud(baud); rfm12_epilogue(); return ECMD_FINAL_OK; }
static void rfm12_ask_2272_1527_send(uint8_t * command, uint8_t delay, uint8_t cnt, const uint8_t * duty_factor) { uint8_t code[49]; uint8_t *p = code; for (uint8_t i = 0; i < 3; i++) { uint8_t byte = command[i]; for (uint8_t mask = 0x80; mask; mask >>= 1) { if (byte & mask) { *p++ = pgm_read_byte(duty_factor); *p++ = pgm_read_byte(duty_factor + 1); } else { *p++ = pgm_read_byte(duty_factor + 2); *p++ = pgm_read_byte(duty_factor + 3); } } } *p = 7; // sync rfm12_prologue(); rfm12_trans(RFM12_CMD_PWRMGT | RFM12_PWRMGT_ET | RFM12_PWRMGT_ES | RFM12_PWRMGT_EX); for (uint8_t ii = cnt; ii > 0; ii--) { wdt_kick(); uint8_t rfm12_trigger_level = 0; for (uint8_t i = 0; i < 49; i++) { rfm12_ask_trigger(rfm12_trigger_level ^= 1, code[i] * delay); } rfm12_ask_trigger(0, 24 * delay); } rfm12_trans(RFM12_CMD_PWRMGT | RFM12_PWRMGT_EX); rfm12_epilogue(); }
void rfm12_ask_tevion_send(uint8_t * housecode, uint8_t * command, uint8_t delay, uint8_t cnt) { uint8_t code[41]; uint8_t *p = code; for (uint8_t i = 0; i < 3; i++) { uint8_t byte = housecode[i]; for (uint8_t mask = 0x80; mask; mask >>= 1) { *p++ = byte & mask ? 12 : 6; } } *p++ = housecode[2] & 1 ? 6 : 12; for (uint8_t i = 0; i < 2; i++) { uint8_t byte = command[i]; for (uint8_t mask = 0x80; mask; mask >>= 1) { *p++ = byte & mask ? 12 : 6; } } rfm12_prologue(); rfm12_trans(RFM12_CMD_PWRMGT | RFM12_PWRMGT_ET | RFM12_PWRMGT_ES | RFM12_PWRMGT_EX); for (uint8_t ii = cnt; ii > 0; ii--) { wdt_kick(); uint8_t rfm12_trigger_level = 0; for (uint8_t i = 0; i < 41; i++) { rfm12_ask_trigger(rfm12_trigger_level ^= 1, code[i] * delay); } rfm12_ask_trigger(0, 24 * delay); } rfm12_trans(RFM12_CMD_PWRMGT | RFM12_PWRMGT_EX); rfm12_epilogue(); }
void rfm12_ask_intertechno_send(uint8_t family, uint8_t group, uint8_t device, uint8_t command) { union { struct { uint16_t family:4; uint16_t device:2; uint16_t group:2; uint16_t command:4; } bits; uint16_t raw; } code; family -= 1; code.bits.family = family; device -= 1; code.bits.device = device; group -= 1; code.bits.group = group; code.bits.command = command ? 0x0E : 0x06; rfm12_prologue(); rfm12_trans(RFM12_CMD_PWRMGT | RFM12_PWRMGT_ET | RFM12_PWRMGT_ES | RFM12_PWRMGT_EX); for (uint8_t j = 6; j > 0; j--) { wdt_kick(); uint16_t c = code.raw; for (uint8_t i = 12; i; i--) { rfm12_ask_intertechno_send_bit(c & 1); c >>= 1; } rfm12_ask_intertechno_send_sync(); } rfm12_trans(RFM12_CMD_PWRMGT | RFM12_PWRMGT_EX); rfm12_epilogue(); }
static uint8_t rfm12_rxstop(void) { uint8_t result = 1; rfm12_prologue(RFM12_MODULE_IP); if (rfm12_status > RFM12_RX || (rfm12_status == RFM12_RX && rfm12_index > 0)) goto out; /* module not idle */ rfm12_trans(RFM12_CMD_PWRMGT); /* now turn off the oscillator */ result = 0; rfm12_status = RFM12_OFF; rfm12_int_disable(); out:; rfm12_epilogue(); return result; }
uint8_t rfm12_rxstart(void) { if (rfm12_status != RFM12_OFF) { return 1; /* rfm12 is not free for RX or now in RX */ } rfm12_prologue(RFM12_MODULE_IP); rfm12_trans(RFM12_CMD_PWRMGT | RFM12_PWRMGT_ER | RFM12_PWRMGT_EBB | RFM12_PWRMGT_EX); rfm12_trans(RFM12_CMD_FIFORESET | 0x80 | RFM12_FIFORESET_DR); rfm12_trans(RFM12_CMD_FIFORESET | 0x80 | RFM12_FIFORESET_FF | RFM12_FIFORESET_DR); rfm12_epilogue(); rfm12_index = 0; rfm12_status = RFM12_RX; rfm12_int_enable(); return 0; }
void rfm12_net_init(void) { /* wait until POR done */ for (uint8_t i = 15; i; i--) _delay_ms(10); rfm12_prologue(RFM12_MODULE_IP); rfm12_trans(RFM12_CMD_LBDMCD | 0xE0); rfm12_trans(RFM12BAND(CONF_RFM12_FREQ)); rfm12_trans(RFM12_CMD_DATAFILTER | RFM12_DATAFILTER_AL | 0x03); rfm12_trans(RFM12_CMD_FIFORESET | 0x80 | RFM12_FIFORESET_DR); rfm12_trans(RFM12_CMD_WAKEUP); rfm12_trans(RFM12_CMD_DUTYCYCLE); rfm12_trans(RFM12_CMD_AFC | 0xF7); #ifdef CONF_RFM12B_SUPPORT rfm12_trans(0xCED4); /* Set Sync=2DD4 */ rfm12_trans(0xCC16); /* pll bandwitdh 0: max bitrate 86.2kHz */ #endif #ifdef DEBUG uint16_t result = rfm12_trans(RFM12_CMD_STATUS); RFM12_DEBUG("rfm12_net/init: %x", result); #endif #ifdef RFM12_DISABLE rfm12_trans(RFM12_CMD_PWRMGT); #else #ifdef TEENSY_SUPPORT rfm12_trans(RFM12_CMD_FREQUENCY | RFM12FREQ(CONF_RFM12_FREQ)); rfm12_trans(RFM12_CMD_RXCTRL | 0x04ac); rfm12_trans(RFM12_CMD_DATARATE | 0x10); rfm12_trans(RFM12_CMD_TXCONF | 0x20); #else rfm12_setfreq(RFM12FREQ(CONF_RFM12_FREQ)); rfm12_setbandwidth(5, 1, 4); rfm12_setbaud(CONF_RFM12_BAUD / 100); rfm12_setpower(0, 2); #endif /* not TEENSY_SUPPORT */ #ifdef STATUSLED_RFM12_RX_SUPPORT PIN_CLEAR(STATUSLED_RFM12_RX); #endif #ifdef STATUSLED_RFM12_TX_SUPPORT PIN_CLEAR(STATUSLED_RFM12_TX); #endif rfm12_status = RFM12_OFF; rfm12_int_enable(); rfm12_rxstart(); #ifdef DEBUG result = rfm12_trans(RFM12_CMD_STATUS); RFM12_DEBUG("rfm12_net/init'd: %x", result); #endif #endif /* !RFM12_DISABLE */ rfm12_epilogue(); }