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); }
static void binding_ok_cb(u8 state, void * data) { (void)state; (void)data; PROTOCOL_SetBindState(0); // interrupt the binding dialog = NULL; }
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; }
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); }
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); }
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); }
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 }
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; }
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 }
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; }