Exemple #1
0
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 ();
}
Exemple #2
0
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 ();
}
Exemple #3
0
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();
}
Exemple #4
0
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();
}
Exemple #5
0
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 ();
}
Exemple #6
0
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));
}
Exemple #7
0
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;
}
Exemple #8
0
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;
}
Exemple #9
0
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;
}
Exemple #10
0
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();
}
Exemple #11
0
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();
}
Exemple #12
0
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();
}
Exemple #13
0
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;
}
Exemple #14
0
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;
}
Exemple #15
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();
}