diff --git a/flight/PipXtreme/Makefile b/flight/PipXtreme/Makefile index 0dc7b8e2a..b05faff07 100644 --- a/flight/PipXtreme/Makefile +++ b/flight/PipXtreme/Makefile @@ -129,6 +129,7 @@ SRC += $(PIOSSTM32F10X)/pios_irq.c SRC += $(PIOSSTM32F10X)/pios_adc.c SRC += $(PIOSSTM32F10X)/pios_gpio.c SRC += $(PIOSSTM32F10X)/pios_spi.c +SRC += $(PIOSSTM32F10X)/pios_ppm.c # PIOS USB related files (seperated to make code maintenance more easy) ifeq ($(USE_USB), YES) diff --git a/flight/PipXtreme/api_config.c b/flight/PipXtreme/api_config.c index 15bb173ad..201d8f8b3 100644 --- a/flight/PipXtreme/api_config.c +++ b/flight/PipXtreme/api_config.c @@ -30,6 +30,8 @@ #include "api_config.h" #include "rfm22b.h" #include "packet_handler.h" +#include "stream.h" +#include "ppm.h" #include "saved_settings.h" #include "crc.h" #include "main.h" @@ -344,6 +346,8 @@ void apiconfig_processInputPacket(void *buf, uint16_t len) if (header->serial_number == serial_number_crc32) { // the packet is meant for us + booting = true; + ph_set_remote_serial_number(0, 0); // stop the packet handler trying to communicate // ****** @@ -384,59 +388,53 @@ void apiconfig_processInputPacket(void *buf, uint16_t len) break; } - if (saved_settings.mode != MODE_SCAN_SPECTRUM) - { - if (saved_settings.mode == MODE_STREAM_TX || saved_settings.mode == MODE_PPM_TX) - rfm22_init_tx_stream(saved_settings.min_frequency_Hz, saved_settings.max_frequency_Hz); - else - if (saved_settings.mode == MODE_STREAM_RX || saved_settings.mode == MODE_PPM_RX) - rfm22_init_rx_stream(saved_settings.min_frequency_Hz, saved_settings.max_frequency_Hz); - else - rfm22_init_normal(saved_settings.min_frequency_Hz, saved_settings.max_frequency_Hz, rfm22_freqHopSize()); - - rfm22_setFreqCalibration(saved_settings.rf_xtal_cap); - ph_setNominalCarrierFrequency(saved_settings.frequency_Hz); - ph_setDatarate(saved_settings.max_rf_bandwidth); - ph_setTxPower(saved_settings.max_tx_power); - - ph_set_remote_encryption(0, saved_settings.aes_enable, (const void *)saved_settings.aes_key); - ph_set_remote_serial_number(0, saved_settings.destination_id); - } - else - { - rfm22_init_scan_spectrum(saved_settings.min_frequency_Hz, saved_settings.max_frequency_Hz); - rfm22_setFreqCalibration(saved_settings.rf_xtal_cap); - apiconfig_spec_start_freq = saved_settings.min_frequency_Hz; - apiconfig_spec_freq = apiconfig_spec_start_freq; - apiconfig_spec_buffer_wr = 0; - apiconfig_ss_timer = 0; - } - switch (saved_settings.mode) { - case MODE_NORMAL: // normal 2-way packet mode + case MODE_NORMAL: // normal 2-way packet mode + ph_init(serial_number_crc32); // initialise the packet handler break; - case MODE_STREAM_TX: // 1-way continuous tx packet mode - rfm22_setTxStream(); // TEST ONLY + + case MODE_STREAM_TX: // 1-way continuous tx packet mode + case MODE_STREAM_RX: // 1-way continuous rx packet mode + stream_init(serial_number_crc32); // initialise the continuous packet stream module break; - case MODE_STREAM_RX: // 1-way continuous rx packet mode - break; - case MODE_PPM_TX: // PPM tx mode - rfm22_setTxStream(); // TEST ONLY - break; - case MODE_PPM_RX: // PPM rx mode + + case MODE_PPM_TX: // PPM tx mode + case MODE_PPM_RX: // PPM rx mode + ppm_init(serial_number_crc32); // initialise the PPM module break; + case MODE_SCAN_SPECTRUM: // scan the receiver over the whole band + rfm22_init_scan_spectrum(saved_settings.min_frequency_Hz, saved_settings.max_frequency_Hz); + rfm22_setFreqCalibration(saved_settings.rf_xtal_cap); + apiconfig_spec_start_freq = saved_settings.min_frequency_Hz; + apiconfig_spec_freq = apiconfig_spec_start_freq; + apiconfig_spec_buffer_wr = 0; + apiconfig_ss_timer = 0; break; + case MODE_TX_BLANK_CARRIER_TEST: // blank carrier Tx mode (for calibrating the carrier frequency say) + rfm22_init_normal(saved_settings.min_frequency_Hz, saved_settings.max_frequency_Hz, rfm22_freqHopSize()); + rfm22_setFreqCalibration(saved_settings.rf_xtal_cap); + rfm22_setNominalCarrierFrequency(saved_settings.frequency_Hz); + rfm22_setDatarate(saved_settings.max_rf_bandwidth, TRUE); + rfm22_setTxPower(saved_settings.max_tx_power); rfm22_setTxCarrierMode(); break; + case MODE_TX_SPECTRUM_TEST: // pseudo random Tx data mode (for checking the Tx carrier spectrum) + rfm22_init_normal(saved_settings.min_frequency_Hz, saved_settings.max_frequency_Hz, rfm22_freqHopSize()); + rfm22_setFreqCalibration(saved_settings.rf_xtal_cap); + rfm22_setNominalCarrierFrequency(saved_settings.frequency_Hz); + rfm22_setDatarate(saved_settings.max_rf_bandwidth, TRUE); + rfm22_setTxPower(saved_settings.max_tx_power); rfm22_setTxPNMode(); break; } // ****** + + booting = false; } break; diff --git a/flight/PipXtreme/inc/packet_handler.h b/flight/PipXtreme/inc/packet_handler.h index 9f7c9a163..694d21cd6 100644 --- a/flight/PipXtreme/inc/packet_handler.h +++ b/flight/PipXtreme/inc/packet_handler.h @@ -68,7 +68,7 @@ void ph_set_AES128_key(const void *key); int ph_set_remote_serial_number(int connection_index, uint32_t sn); void ph_set_remote_encryption(int connection_index, bool enabled, const void *key); -void ph_init(uint32_t our_sn, uint32_t datarate_bps, uint8_t tx_power); +void ph_init(uint32_t our_sn); // ***************************************************************************** diff --git a/flight/PipXtreme/inc/pios_config.h b/flight/PipXtreme/inc/pios_config.h index 7fac02079..f29822eab 100644 --- a/flight/PipXtreme/inc/pios_config.h +++ b/flight/PipXtreme/inc/pios_config.h @@ -40,5 +40,6 @@ #define PIOS_INCLUDE_GPIO #define PIOS_INCLUDE_EXTI #define PIOS_INCLUDE_USB_HID +//#define PIOS_INCLUDE_PPM #endif /* PIOS_CONFIG_H */ diff --git a/flight/PipXtreme/inc/ppm.h b/flight/PipXtreme/inc/ppm.h index ead92b434..48a3b9aa1 100644 --- a/flight/PipXtreme/inc/ppm.h +++ b/flight/PipXtreme/inc/ppm.h @@ -32,7 +32,7 @@ void ppm_1ms_tick(void); void ppm_process(void); -void ppm_init(void); +void ppm_init(uint32_t our_sn); // ************************************************************* diff --git a/flight/PipXtreme/inc/rfm22b.h b/flight/PipXtreme/inc/rfm22b.h index b450cdb11..351f02874 100644 --- a/flight/PipXtreme/inc/rfm22b.h +++ b/flight/PipXtreme/inc/rfm22b.h @@ -575,7 +575,8 @@ enum { RX_SCAN_SPECTRUM = 0, // ************************************ -typedef void ( *t_rfm22_TxDataCallback ) (uint8_t *data, uint16_t len); +typedef int16_t ( *t_rfm22_TxDataByteCallback ) (void); +typedef bool ( *t_rfm22_RxDataByteCallback ) (uint8_t b); // ************************************ @@ -629,7 +630,8 @@ bool rfm22_txReady(void); void rfm22_1ms_tick(void); void rfm22_process(void); -void rfm22_TxData_SetCallback(t_rfm22_TxDataCallback new_function); +void rfm22_TxDataByte_SetCallback(t_rfm22_TxDataByteCallback new_function); +void rfm22_RxDataByte_SetCallback(t_rfm22_RxDataByteCallback new_function); int rfm22_init_scan_spectrum(uint32_t min_frequency_hz, uint32_t max_frequency_hz); int rfm22_init_tx_stream(uint32_t min_frequency_hz, uint32_t max_frequency_hz); diff --git a/flight/PipXtreme/inc/stream.h b/flight/PipXtreme/inc/stream.h index 4958216c2..bdb243975 100644 --- a/flight/PipXtreme/inc/stream.h +++ b/flight/PipXtreme/inc/stream.h @@ -32,7 +32,7 @@ void stream_1ms_tick(void); void stream_process(void); -void stream_init(void); +void stream_init(uint32_t our_sn); // ************************************************************* diff --git a/flight/PipXtreme/main.c b/flight/PipXtreme/main.c index 53d6f9187..a23d5abf1 100644 --- a/flight/PipXtreme/main.c +++ b/flight/PipXtreme/main.c @@ -1,3 +1,4 @@ + /** ****************************************************************************** * @@ -391,9 +392,9 @@ void init_RF_module(void) } rfm22_setFreqCalibration(saved_settings.rf_xtal_cap); - ph_setNominalCarrierFrequency(saved_settings.frequency_Hz); - ph_setDatarate(saved_settings.max_rf_bandwidth); - ph_setTxPower(saved_settings.max_tx_power); + rfm22_setNominalCarrierFrequency(saved_settings.frequency_Hz); + rfm22_setDatarate(saved_settings.max_rf_bandwidth, TRUE); + rfm22_setTxPower(saved_settings.max_tx_power); } // ***************************************************************************** @@ -553,12 +554,10 @@ int main() // ************* - random32 ^= serial_number_crc32; // try to randomize the random number -// random32 ^= serial_number_crc32 ^ CRC_IDR; // try to randomize the random number + random32 ^= serial_number_crc32; // try to randomise the random number +// random32 ^= serial_number_crc32 ^ CRC_IDR; // try to randomise the random number - ph_init(serial_number_crc32, 128000, 0); // initialise the packet handler - - trans_init(); // initialise the tranparent communications module + trans_init(); // initialise the transparent communications module // api_init(); // initialise the API communications module apiconfig_init(); // initialise the API communications module @@ -728,41 +727,57 @@ int main() init_RF_module(); // initialise the RF module - stream_init(); // initialise the continuous packet stream module + // ************* - ppm_init(); // initialise the ppm module + #if defined(PIOS_COM_DEBUG) + DEBUG_PRINTF("\r\n"); + DEBUG_PRINTF("RF datarate: %dbps\r\n", ph_getDatarate()); + DEBUG_PRINTF("RF frequency: %dHz\r\n", rfm22_getNominalCarrierFrequency()); + DEBUG_PRINTF("RF TX power: %d\r\n", ph_getTxPower()); - saved_settings_save(); + DEBUG_PRINTF("\r\nUnit mode: "); + switch (saved_settings.mode) + { + case MODE_NORMAL: DEBUG_PRINTF("NORMAL\r\n"); break; + case MODE_STREAM_TX: DEBUG_PRINTF("STREAM-TX\r\n"); break; + case MODE_STREAM_RX: DEBUG_PRINTF("STREAM-RX\r\n"); break; + case MODE_PPM_TX: DEBUG_PRINTF("PPM-TX\r\n"); break; + case MODE_PPM_RX: DEBUG_PRINTF("PPM-RX\r\n"); break; + case MODE_SCAN_SPECTRUM: DEBUG_PRINTF("SCAN-SPECTRUM\r\n"); break; + case MODE_TX_BLANK_CARRIER_TEST: DEBUG_PRINTF("TX-BLANK-CARRIER\r\n"); break; + case MODE_TX_SPECTRUM_TEST: DEBUG_PRINTF("TX_SPECTRUM\r\n"); break; + default: DEBUG_PRINTF("UNKNOWN [%u]\r\n", saved_settings.mode); break; + } + #endif - booting = FALSE; + switch (saved_settings.mode) + { + case MODE_NORMAL: + ph_init(serial_number_crc32); // initialise the packet handler + break; + + case MODE_STREAM_TX: + case MODE_STREAM_RX: + stream_init(serial_number_crc32); // initialise the continuous packet stream module + break; + + case MODE_PPM_TX: + case MODE_PPM_RX: + ppm_init(serial_number_crc32); // initialise the ppm module + break; + + case MODE_SCAN_SPECTRUM: + case MODE_TX_BLANK_CARRIER_TEST: + case MODE_TX_SPECTRUM_TEST: + break; + } // ************* // Main executive loop - #if defined(PIOS_COM_DEBUG) - DEBUG_PRINTF("\r\n"); - DEBUG_PRINTF("RF datarate: %dbps\r\n", ph_getDatarate()); - DEBUG_PRINTF("RF frequency: %dHz\r\n", rfm22_getNominalCarrierFrequency()); - DEBUG_PRINTF("RF TX power: %d\r\n", ph_getTxPower()); + saved_settings_save(); - DEBUG_PRINTF("\r\nUnit mode: "); - switch (saved_settings.mode) - { - case MODE_NORMAL: DEBUG_PRINTF("NORMAL\r\n"); break; - case MODE_STREAM_TX: DEBUG_PRINTF("STREAM-TX\r\n"); break; - case MODE_STREAM_RX: DEBUG_PRINTF("STREAM-RX\r\n"); break; - case MODE_PPM_TX: DEBUG_PRINTF("PPM-TX\r\n"); break; - case MODE_PPM_RX: DEBUG_PRINTF("PPM-RX\r\n"); break; - case MODE_SCAN_SPECTRUM: DEBUG_PRINTF("SCAN-SPECTRUM\r\n"); break; - case MODE_TX_BLANK_CARRIER_TEST: DEBUG_PRINTF("TX-BLANK-CARRIER\r\n"); break; - case MODE_TX_SPECTRUM_TEST: DEBUG_PRINTF("TX_SPECTRUM\r\n"); break; - default: DEBUG_PRINTF("UNKNOWN [%u]\r\n", saved_settings.mode); break; - } - #endif - - // start a remote connection going to another modem - ph_set_remote_encryption(0, saved_settings.aes_enable, (const void *)saved_settings.aes_key); - ph_set_remote_serial_number(0, saved_settings.destination_id); + booting = FALSE; for (;;) { diff --git a/flight/PipXtreme/packet_handler.c b/flight/PipXtreme/packet_handler.c index 28f786666..bc77c344b 100644 --- a/flight/PipXtreme/packet_handler.c +++ b/flight/PipXtreme/packet_handler.c @@ -348,10 +348,23 @@ int ph_startConnect(int connection_index, uint32_t sn) } // ***************************************************************************** +// return a byte for the tx packet transmission. +// +// return value < 0 if no more bytes available, otherwise return byte to be sent -void rfm22_TxDataCallback(uint8_t *data, uint16_t len) +int16_t ph_TxDataByteCallback(void) { + return -1; +} +// ************************************************************* +// we are being given a received byte +// +// return TRUE to continue current packet receive, otherwise return FALSe to halt current packet reception + +bool ph_RxDataByteCallback(uint8_t b) +{ + return true; } // ***************************************************************************** @@ -1518,8 +1531,6 @@ int ph_set_remote_serial_number(int connection_index, uint32_t sn) fifoBuf_init(&conn->tx_fifo_buffer, conn->tx_buffer, PH_FIFO_BUFFER_SIZE); fifoBuf_init(&conn->rx_fifo_buffer, conn->rx_buffer, PH_FIFO_BUFFER_SIZE); - rfm22_TxData_SetCallback(rfm22_TxDataCallback); - return connection_index; } @@ -1542,6 +1553,8 @@ void ph_set_remote_encryption(int connection_index, bool enabled, const void *ke void ph_1ms_tick(void) { + if (booting) return; + if (saved_settings.mode == MODE_NORMAL) { // help randomize the encryptor cbc bytes @@ -1597,6 +1610,8 @@ void ph_1ms_tick(void) void ph_process(void) { + if (booting) return; + if (saved_settings.mode == MODE_NORMAL) { ph_processRxPacket(); @@ -1612,7 +1627,7 @@ void ph_process(void) // ***************************************************************************** -void ph_init(uint32_t our_sn, uint32_t datarate_bps, uint8_t tx_power) +void ph_init(uint32_t our_sn) { our_serial_number = our_sn; // remember our own serial number @@ -1665,20 +1680,33 @@ void ph_init(uint32_t our_sn, uint32_t datarate_bps, uint8_t tx_power) conn->rx_afc_Hz = 0; } - ph_setDatarate(datarate_bps); - - ph_setTxPower(tx_power); - // set the AES encryption key using the default AES key ph_set_AES128_key(default_aes_key); - // try too randomize the tx AES CBC bytes + // try too randomise the tx AES CBC bytes for (uint32_t j = 0, k = 0; j < 123 + (random32 & 1023); j++) { random32 = updateCRC32(random32, 0xff); enc_cbc[k] ^= random32 >> 3; if (++k >= sizeof(enc_cbc)) k = 0; } + + // ****** + + rfm22_init_normal(saved_settings.min_frequency_Hz, saved_settings.max_frequency_Hz, rfm22_freqHopSize()); + + rfm22_TxDataByte_SetCallback(ph_TxDataByteCallback); + rfm22_RxDataByte_SetCallback(ph_RxDataByteCallback); + + rfm22_setFreqCalibration(saved_settings.rf_xtal_cap); + ph_setNominalCarrierFrequency(saved_settings.frequency_Hz); + ph_setDatarate(saved_settings.max_rf_bandwidth); + ph_setTxPower(saved_settings.max_tx_power); + + ph_set_remote_encryption(0, saved_settings.aes_enable, (const void *)saved_settings.aes_key); + ph_set_remote_serial_number(0, saved_settings.destination_id); + + // ****** } // ***************************************************************************** diff --git a/flight/PipXtreme/ppm.c b/flight/PipXtreme/ppm.c index fbee8e258..42e51b855 100644 --- a/flight/PipXtreme/ppm.c +++ b/flight/PipXtreme/ppm.c @@ -40,6 +40,8 @@ void ppm_1ms_tick(void) { + if (booting) return; + if (saved_settings.mode == MODE_PPM_TX) { } @@ -49,11 +51,33 @@ void ppm_1ms_tick(void) } } +// ************************************************************* +// return a byte for the tx packet transmission. +// +// return value < 0 if no more bytes available, otherwise return byte to be sent + +int16_t ppm_TxDataByteCallback(void) +{ + return -1; +} + +// ************************************************************* +// we are being given a received byte +// +// return TRUE to continue current packet receive, otherwise return FALSe to halt current packet reception + +bool ppm_RxDataByteCallback(uint8_t b) +{ + return true; +} + // ************************************************************* // call this from the main loop (not interrupt) as often as possible void ppm_process(void) { + if (booting) return; + if (saved_settings.mode == MODE_PPM_TX) { } @@ -65,12 +89,27 @@ void ppm_process(void) // ************************************************************* -void ppm_init(void) +void ppm_init(uint32_t our_sn) { #if defined(PPM_DEBUG) DEBUG_PRINTF("\r\nPPM init\r\n"); #endif + if (saved_settings.mode == MODE_PPM_TX) + rfm22_init_tx_stream(saved_settings.min_frequency_Hz, saved_settings.max_frequency_Hz); + else + if (saved_settings.mode == MODE_PPM_RX) + rfm22_init_rx_stream(saved_settings.min_frequency_Hz, saved_settings.max_frequency_Hz); + + rfm22_TxDataByte_SetCallback(ppm_TxDataByteCallback); + rfm22_RxDataByte_SetCallback(ppm_RxDataByteCallback); + + rfm22_setFreqCalibration(saved_settings.rf_xtal_cap); + rfm22_setNominalCarrierFrequency(saved_settings.frequency_Hz); + rfm22_setDatarate(saved_settings.max_rf_bandwidth, FALSE); + rfm22_setTxPower(saved_settings.max_tx_power); + + rfm22_setTxStream(); // TEST ONLY } // ************************************************************* diff --git a/flight/PipXtreme/rfm22b.c b/flight/PipXtreme/rfm22b.c index 482081687..b04fdb57c 100644 --- a/flight/PipXtreme/rfm22b.c +++ b/flight/PipXtreme/rfm22b.c @@ -287,7 +287,8 @@ uint16_t timeout_ms = 20000; // uint16_t timeout_sync_ms = 3; // uint16_t timeout_data_ms = 20; // -t_rfm22_TxDataCallback tx_data_callback_function; +t_rfm22_TxDataByteCallback tx_data_byte_callback_function; +t_rfm22_RxDataByteCallback rx_data_byte_callback_function; // ************************************ // SPI read/write @@ -922,6 +923,10 @@ void rfm22_setTxMode(uint8_t mode) // add some data for (uint16_t j = wr - rd; j > 0; j--) { +// int16_t b = -1; +// if (tx_data_byte_callback_function) +// b = tx_data_byte_callback_function(); + rfm22_burstWrite(tx_data_addr[rd++]); if (++i >= max_bytes) break; } @@ -1082,6 +1087,12 @@ void rfm22_processRxInt(void) for (register uint16_t i = RX_FIFO_HI_WATERMARK; i > 0; i--) { register uint8_t b = rfm22_burstRead(); // read a byte from the rf modules RX FIFO buffer + + if (rx_data_byte_callback_function) + { + rx_data_byte_callback_function(b); + } + if (wr < sizeof(rx_buffer)) rx_buffer[wr++] = b; // save the byte into our rx buffer } @@ -1151,11 +1162,18 @@ void rfm22_processRxInt(void) { // their must still be data in the RX FIFO we need to get rfm22_startBurstRead(RFM22_fifo_access); - while (wr < len) - { - if (wr >= sizeof(rx_buffer)) break; - rx_buffer[wr++] = rfm22_burstRead(); - } + while (wr < len) + { + register uint8_t b = rfm22_burstRead(); + + if (rx_data_byte_callback_function) + { + rx_data_byte_callback_function(b); + } + + if (wr >= sizeof(rx_buffer)) break; + rx_buffer[wr++] = b; + } rfm22_endBurstRead(); rx_buffer_wr = wr; @@ -1220,6 +1238,10 @@ uint8_t rfm22_topUpRFTxFIFO(void) // add some data for (uint16_t j = wr - rd; j > 0; j--) { +// int16_t b = -1; +// if (tx_data_byte_callback_function) +// b = tx_data_byte_callback_function(); + rfm22_burstWrite(tx_data_addr[rd++]); if (++i >= max_bytes) break; } @@ -1794,9 +1816,8 @@ uint8_t rfm22_getFreqCalibration(void) void rfm22_1ms_tick(void) { // call this once every ms - - if (!initialized) - return; // we haven't yet been initialized + if (booting) return; + if (!initialized) return; // we haven't yet been initialized if (rf_mode != RX_SCAN_SPECTRUM) { @@ -1809,8 +1830,8 @@ void rfm22_1ms_tick(void) void rfm22_process(void) { - if (!initialized) - return; // we haven't yet been initialized + if (booting) return; + if (!initialized) return; // we haven't yet been initialized #if !defined(RFM22_EXT_INT_USE) if (rf_mode != RX_SCAN_SPECTRUM) @@ -1942,9 +1963,14 @@ void rfm22_process(void) // ************************************ -void rfm22_TxData_SetCallback(t_rfm22_TxDataCallback new_function) +void rfm22_TxDataByte_SetCallback(t_rfm22_TxDataByteCallback new_function) { - tx_data_callback_function = new_function; + tx_data_byte_callback_function = new_function; +} + +void rfm22_RxDataByte_SetCallback(t_rfm22_RxDataByteCallback new_function) +{ + rx_data_byte_callback_function = new_function; } // ************************************ @@ -2028,7 +2054,8 @@ int rfm22_resetModule(uint8_t mode, uint32_t min_frequency_hz, uint32_t max_freq rssi = 0; rssi_dBm = -200; - tx_data_callback_function = NULL; + tx_data_byte_callback_function = NULL; + rx_data_byte_callback_function = NULL; rx_buffer_current = 0; rx_buffer_wr = 0; diff --git a/flight/PipXtreme/stream.c b/flight/PipXtreme/stream.c index f354cdc61..512cec886 100644 --- a/flight/PipXtreme/stream.c +++ b/flight/PipXtreme/stream.c @@ -43,6 +43,8 @@ void stream_1ms_tick(void) { + if (booting) return; + if (saved_settings.mode == MODE_STREAM_TX) { } @@ -52,11 +54,33 @@ void stream_1ms_tick(void) } } +// ************************************************************* +// return a byte for the tx packet transmission. +// +// return value < 0 if no more bytes available, otherwise return byte to be sent + +int16_t stream_TxDataByteCallback(void) +{ + return -1; +} + +// ************************************************************* +// we are being given a received byte +// +// return TRUE to continue current packet receive, otherwise return FALSe to halt current packet reception + +bool stream_RxDataByteCallback(uint8_t b) +{ + return true; +} + // ************************************************************* // call this from the main loop (not interrupt) as often as possible void stream_process(void) { + if (booting) return; + if (saved_settings.mode == MODE_STREAM_TX) { } @@ -68,12 +92,27 @@ void stream_process(void) // ************************************************************* -void stream_init(void) +void stream_init(uint32_t our_sn) { #if defined(STREAM_DEBUG) DEBUG_PRINTF("\r\nSTREAM init\r\n"); #endif + if (saved_settings.mode == MODE_STREAM_TX) + rfm22_init_tx_stream(saved_settings.min_frequency_Hz, saved_settings.max_frequency_Hz); + else + if (saved_settings.mode == MODE_STREAM_RX) + rfm22_init_rx_stream(saved_settings.min_frequency_Hz, saved_settings.max_frequency_Hz); + + rfm22_TxDataByte_SetCallback(stream_TxDataByteCallback); + rfm22_RxDataByte_SetCallback(stream_RxDataByteCallback); + + rfm22_setFreqCalibration(saved_settings.rf_xtal_cap); + rfm22_setNominalCarrierFrequency(saved_settings.frequency_Hz); + rfm22_setDatarate(saved_settings.max_rf_bandwidth, FALSE); + rfm22_setTxPower(saved_settings.max_tx_power); + + rfm22_setTxStream(); // TEST ONLY } // *************************************************************