コード例 #1
0
ファイル: corona_cc2500.c プロジェクト: silpstream/deviation
static void initialize(u8 bind)
{
  CLOCK_StopTimer();

  if (bind) {
      switch (Model.proto_opts[PROTO_OPTS_FORMAT]) {
      case FORMAT_V1:
        PROTOCOL_SetBindState(5000);
        bind_counter = 1400;    // Stay in bind mode for 5s
        break;
      case FORMAT_V2:
        PROTOCOL_SetBindState(5000);
        bind_counter = 187;     // Stay in bind mode for 5s
        break;
      case FORMAT_FDV3:
        PROTOCOL_SetBindState(10000);
        bind_counter = 2000;    // Stay in bind mode for 10s
        break;
      }
  } else {
      bind_counter = 0;
  }
  state = 400;            // Used by V2 to send RF channels + ID for 2.65s at startup
  hopping_frequency_no = 0;
  fdv3_id_send = 0;

  CORONA_init();
  CORONA_rf_init();

  CLOCK_StartTimer(10, corona_cb);
}
コード例 #2
0
ファイル: dialogs.c プロジェクト: F-D-R/deviation
static void binding_ok_cb(u8 state, void * data)
{
    (void)state;
    (void)data;
    PROTOCOL_SetBindState(0); // interrupt the binding
    dialog = NULL;
}
コード例 #3
0
static u16 frsky_cb()
{
    if (state < FRSKY_BIND_DONE) {
        build_bind_packet_1way();
        CC2500_Strobe(CC2500_SIDLE);
        CC2500_WriteReg(CC2500_0A_CHANNR, 0x00);
        CC2500_WriteData(packet, packet[0]+1);
        state++;
        return 53460;
    }
    if (state == FRSKY_BIND_DONE) {
        state++;
        PROTOCOL_SetBindState(0);
    }
    if (state >= FRSKY_DATA1) {
        u8 chan = calc_channel();
        CC2500_Strobe(CC2500_SIDLE);
        CC2500_WriteReg(CC2500_0A_CHANNR, chan * 5 + 6);
        build_data_packet_1way();
        CC2500_WriteData(packet, packet[0]+1);
        state++;
        if (state > FRSKY_DATA5)
            state = FRSKY_DATA1;
        return 9006;
    }
        
    return 0;
}
コード例 #4
0
void initASSAN(u8 bind)
{
    CLOCK_StopTimer();
    initialize_txid();
    init();
    tx_power = Model.tx_power;
    hopping_frequency_no = 0;

    if(bind) {
        state=BIND0;
        PROTOCOL_SetBindState(0xffffffff);
    }
    else {
        state=DATA0;
        PROTOCOL_SetBindState(0);
    }
    CLOCK_StartTimer(50000, ASSAN_callback);
}
コード例 #5
0
static void initialize(int bind)
{
    CLOCK_StopTimer();
    frsky_init();
    seed = 1;
    fixed_id = 0x1257;
    if (bind) {
        PROTOCOL_SetBindState(0xFFFFFFFF);
        state = FRSKY_BIND;
    } else {
        state = FRSKY_DATA1;
    }
    CLOCK_StartTimer(10000, frsky_cb);
}
コード例 #6
0
static void initialize()
{
    CLOCK_StopTimer();
    tx_power = Model.tx_power;
    phase = initialize_rx_tx_addr();
    telemetry_setup_state = CFLIE_TELEM_SETUP_STATE_INIT;
    packet_counter = 0;

    int delay = cflie_init();

    dbgprintf("cflie init\n");
    if (phase == CFLIE_INIT_SEARCH) {
        PROTOCOL_SetBindState(0xFFFFFFFF);
    }
    CLOCK_StartTimer(delay, cflie_callback);
}
コード例 #7
0
ファイル: cflie_nrf24l01.c プロジェクト: F-D-R/deviation
MODULE_CALLTYPE
static u16 cflie_callback()
{
    switch (phase) {
    case CFLIE_INIT_SEARCH:
        send_search_packet();
        phase = CFLIE_SEARCH;
        break;
    case CFLIE_INIT_CRTP_LOG:
        if (crtp_log_setup_state_machine()) {
            phase = CFLIE_INIT_DATA;
        }
        break;
    case CFLIE_INIT_DATA:
        send_cmd_packet();
        phase = CFLIE_DATA;
        break;
    case CFLIE_SEARCH:
        switch (packet_ack()) {
        case PKT_PENDING:
            return PACKET_CHKTIME;                 // packet send not yet complete
        case PKT_ACKED:
            phase = CFLIE_DATA;
            PROTOCOL_SetBindState(0);
            MUSIC_Play(MUSIC_DONE_BINDING);
            break;
        case PKT_TIMEOUT:
            send_search_packet();
            counter = BIND_COUNT;
        }
        break;

    case CFLIE_DATA:
        if (Model.proto_opts[PROTOOPTS_TELEMETRY] == TELEM_ON_CRTPLOG) {
            update_telemetry_crtplog();
        } else if (Model.proto_opts[PROTOOPTS_TELEMETRY] == TELEM_ON_ACKPKT) {
            update_telemetry_ackpkt();
        }

        if (packet_ack() == PKT_PENDING)
            return PACKET_CHKTIME;         // packet send not yet complete
        send_cmd_packet();
        break;
    }
    return PACKET_PERIOD;                  // Packet at standard protocol interval
}
コード例 #8
0
ファイル: corona_cc2500.c プロジェクト: silpstream/deviation
MODULE_CALLTYPE
static u16 corona_cb() {
  // Tune frequency if it has been changed
  if (fine != (s8)Model.proto_opts[PROTO_OPTS_FREQFINE]) {
      fine = (s8)Model.proto_opts[PROTO_OPTS_FREQFINE];
      CC2500_WriteReg(CC2500_0C_FSCTRL0, fine);
  }

  if (bind_counter) {
      if (bind_counter-- == 0) PROTOCOL_SetBindState(0);
      packet_period = CORONA_build_bind_pkt();
  } else {
      packet_period = CORONA_build_packet();
  }

  // Send packet
  CC2500_WriteData(packet, packet[0]+2);
  return packet_period;
}
コード例 #9
0
ファイル: cflie_nrf24l01.c プロジェクト: phantom-8/deviation
MODULE_CALLTYPE
static u16 cflie_callback()
{
    switch (phase) {
    case CFLIE_INIT_SEARCH:
        send_search_packet();
        phase = CFLIE_SEARCH;
        break;
    case CFLIE_INIT_TELEMETRY:
        if (telemetry_setup_state_machine()) {
            phase = CFLIE_INIT_DATA;
        }
        break;
    case CFLIE_INIT_DATA:
        send_cmd_packet();
        phase = CFLIE_DATA;
        break;
    case CFLIE_SEARCH:
        switch (packet_ack()) {
        case PKT_PENDING:
            return PACKET_CHKTIME;                 // packet send not yet complete
        case PKT_ACKED:
            phase = CFLIE_DATA;
            PROTOCOL_SetBindState(0);
            MUSIC_Play(MUSIC_DONE_BINDING);
            break;
        case PKT_TIMEOUT:
            send_search_packet();
            counter = BIND_COUNT;
        }
        break;

    case CFLIE_DATA:
        update_telemetry();
        if (packet_ack() == PKT_PENDING)
            return PACKET_CHKTIME;         // packet send not yet complete
        send_cmd_packet();
        break;
    }
    return PACKET_PERIOD;                  // Packet at standard protocol interval
}
コード例 #10
0
u16 ASSAN_callback()
{
    switch (state)
    {
    // Bind
        case BIND0:
            //Config RX @1M
            NRF24L01_WriteReg(NRF24L01_05_RF_CH, RF_BIND_CHANNEL);
            NRF24L01_SetBitrate(NRF24L01_BR_1M);                    // 1Mbps
            NRF24L01_SetTxRxMode(RX_EN);
            state = BIND1;
            /* FALLTHROUGH */
        case BIND1:
            //Wait for receiver to send the frames
            if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & BV(NRF24L01_07_RX_DR))
            { //Something has been received
                NRF24L01_ReadPayload(packet, PACKET_SIZE);
                if(packet[19]==0x13)
                { //Last frame received
                    state = BIND2 | WAIT;
                    //Switch to TX
                    NRF24L01_SetTxRxMode(TXRX_OFF);
                    NRF24L01_SetTxRxMode(TX_EN);
                    //Prepare bind packet
                    memset(packet,0x05,PACKET_SIZE-5);
                    packet[15]=0x99;
                    for(u8 i=0;i<4;i++)
                        packet[16+i]=packet[23-i];
                    packet_count=0;
                    return 10000;
                }
            }
            return 1000;
        case BIND2|WAIT:
            if(++packet_count == 27) // Wait 270ms in total...
            {
                packet_count = 0;
                state &= ~WAIT;
            }
            return 10000;
        case BIND2:
            // Send 20 packets
            packet_count++;
            if(packet_count==20)
                packet[15]=0x13;    // different value for last packet
            NRF24L01_WritePayload(packet, PACKET_SIZE);
            if(packet_count==20)
            {
                state = DATA0 | WAIT;
                packet_count = 0;
            }
            return 22520;
        case DATA0|WAIT:
            if(++packet_count == 217)
                state &= ~WAIT;
            return 10000;
    // Normal operation
        case DATA0:
            // Bind Done
            PROTOCOL_SetBindState(0);
            NRF24L01_SetBitrate(NRF24L01_BR_250K);                  // 250Kbps
            NRF24L01_SetTxRxMode(TXRX_OFF);
            NRF24L01_SetTxRxMode(TX_EN);
            /* FALLTHROUGH */
        case DATA1:
        case DATA4:
            // Change ID and RF channel
            NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, packet+20+4*hopping_frequency_no, ADDRESS_LENGTH);
            NRF24L01_WriteReg(NRF24L01_05_RF_CH, hopping_frequency[hopping_frequency_no]);
            hopping_frequency_no^=0x01;
            state=DATA2;
            return 2000;
        case DATA2:
        case DATA3:
            send_packet();
            state++;    // DATA 3 or 4
            return 5000;
    }
    return 0;
}