From b8a0cdce957313ddd396de27bf4c847c952d5b6e Mon Sep 17 00:00:00 2001 From: Sven Steudte Date: Sun, 3 Sep 2017 01:34:22 +0200 Subject: [PATCH] Fixed redundant TX error, fixed keep-tx-state-after-transmission error --- tracker/software/config.c | 6 +++--- tracker/software/drivers/si4464.c | 8 ++++---- tracker/software/drivers/si4464.h | 5 +++-- tracker/software/radio.c | 14 +++++++------- 4 files changed, 17 insertions(+), 16 deletions(-) diff --git a/tracker/software/config.c b/tracker/software/config.c index 92a5f3c..a52fe62 100644 --- a/tracker/software/config.c +++ b/tracker/software/config.c @@ -190,7 +190,7 @@ void start_user_modules(void) config[0].aprs_conf.tel_enc = TRUE; // Transmit Telemetry encoding information activated config[0].aprs_conf.tel_enc_cycle = 3600; // Transmit Telemetry encoding information every 3600sec chsnprintf(config[0].aprs_conf.tel_comment, 30, "http://ssdv.habhub.org/DL7AD");// Telemetry comment - start_position_thread(&config[0]); + //start_position_thread(&config[0]); // Module POSITION, APRS 2m 2GFSK /*config[1].power = 127; // Power 10 dBm @@ -283,8 +283,8 @@ void start_user_modules(void) chsnprintf(config[5].ssdv_conf.callsign, 7, "DL7AD2"); // SSDV Callsign config[5].ssdv_conf.ram_buffer = ssdv_buffer; // Camera buffer config[5].ssdv_conf.ram_size = sizeof(ssdv_buffer); // Buffer size - config[5].ssdv_conf.res = RES_QVGA; // Resolution VGA - config[5].ssdv_conf.quality = 4; // High quality + config[5].ssdv_conf.res = RES_VGA; // Resolution VGA + config[5].ssdv_conf.quality = 7; // High quality start_image_thread(&config[5]); // Module IMAGE, SSDV 2m 2FSK diff --git a/tracker/software/drivers/si4464.c b/tracker/software/drivers/si4464.c index ab52fc1..890bc29 100644 --- a/tracker/software/drivers/si4464.c +++ b/tracker/software/drivers/si4464.c @@ -284,10 +284,10 @@ void setPowerLevel(int8_t level) { Si4464_write(set_pa_pwr_lvl_property_command, 5); } -void startTx(uint16_t size) { +void startTx(uint16_t size, bool shutdownAfterPhDone) { palClearLine(LINE_IO_LED1); // Set indication LED - uint8_t change_state_command[] = {0x31, 0x00, 0x30, (size >> 8) & 0x1F, size & 0xFF}; + uint8_t change_state_command[] = {0x31, 0x00, (shutdownAfterPhDone ? SI4464_STATE_READY : SI4464_STATE_NOCHANGE) << 4, (size >> 8) & 0x1F, size & 0xFF}; Si4464_write(change_state_command, 5); } @@ -311,7 +311,7 @@ void Si4464_shutdown(void) { * @param shift Shift of FSK in Hz * @param level Transmission power level in dBm */ -bool radioTune(uint32_t frequency, uint16_t shift, int8_t level, uint16_t size) { +bool radioTune(uint32_t frequency, uint16_t shift, int8_t level, uint16_t size, bool shutdownAfterPhDone) { // Tracing TRACE_INFO("SI > Tune Si4464"); @@ -325,7 +325,7 @@ bool radioTune(uint32_t frequency, uint16_t shift, int8_t level, uint16_t size) setShift(shift); // Set shift setPowerLevel(level); // Set power level - startTx(size); + startTx(size, shutdownAfterPhDone); return true; } diff --git a/tracker/software/drivers/si4464.h b/tracker/software/drivers/si4464.h index 6bcdd96..eb07eb3 100644 --- a/tracker/software/drivers/si4464.h +++ b/tracker/software/drivers/si4464.h @@ -9,6 +9,7 @@ #define RADIO_MOD_GPIO(state) palWriteLine(LINE_RADIO_GPIO, state) #define inRadioBand(freq) (RADIO_MIN_FREQ <= (freq) && (freq) <= RADIO_MAX_FREQ) +#define SI4464_STATE_NOCHANGE 0 #define SI4464_STATE_SLEEP 1 #define SI4464_STATE_SPI_ACTIVE 2 #define SI4464_STATE_READY 3 @@ -28,10 +29,10 @@ void setModem2FSK(void); void setModem2GFSK(gfsk_conf_t* conf); void setDeviation(uint32_t deviation); void setPowerLevel(int8_t level); -void startTx(uint16_t size); +void startTx(uint16_t size, bool shutdownAfterPhDone); void stopTx(void); void Si4464_shutdown(void); -bool radioTune(uint32_t frequency, uint16_t shift, int8_t level, uint16_t size); +bool radioTune(uint32_t frequency, uint16_t shift, int8_t level, uint16_t size, bool shutdownAfterPhDone); void Si4464_writeFIFO(uint8_t *msg, uint8_t size); uint8_t Si4464_freeFIFO(void); uint8_t Si4464_getState(void); diff --git a/tracker/software/radio.c b/tracker/software/radio.c index 80e7e66..d957361 100644 --- a/tracker/software/radio.c +++ b/tracker/software/radio.c @@ -41,7 +41,7 @@ void initAFSK(radioMSG_t *msg) { // Initialize radio and tune Si4464_Init(); setModemAFSK(); - radioTune(msg->freq, 0, msg->power, 0); + radioTune(msg->freq, 0, msg->power, 0, false); } void sendAFSK(radioMSG_t *msg) { @@ -77,7 +77,7 @@ void init2GFSK(radioMSG_t *msg) { setModem2GFSK(msg->gfsk_conf); } -void send2GFSK(radioMSG_t *msg) { +void send2GFSK(radioMSG_t *msg, bool shutdown) { uint16_t c = 64; uint16_t all = (msg->bin_len+7)/8; @@ -85,7 +85,7 @@ void send2GFSK(radioMSG_t *msg) { Si4464_writeFIFO(msg->msg, c); // Transmit - radioTune(msg->freq, 0, msg->power, all); + radioTune(msg->freq, 0, msg->power, all, shutdown); while(c < all) { // Do while bytes not written into FIFO completely @@ -164,7 +164,7 @@ void initOOK(radioMSG_t *msg) { // Initialize radio and tune Si4464_Init(); setModemOOK(); - radioTune(msg->freq, 0, msg->power, 0); + radioTune(msg->freq, 0, msg->power, 0, false); } /** @@ -243,7 +243,7 @@ void init2FSK(radioMSG_t *msg) { // Initialize radio and tune Si4464_Init(); setModem2FSK(); - radioTune(msg->freq, msg->fsk_conf->shift, msg->power, 0); + radioTune(msg->freq, msg->fsk_conf->shift, msg->power, 0, false); } void send2FSK(radioMSG_t *msg) { @@ -329,7 +329,7 @@ bool transmitOnRadio(radioMSG_t *msg, bool shutdown) { if(inRadioBand(msg->freq)) { // Frequency in radio radio band // Wait for PH to finish transmission for 2GFSK - if(active_mod == MOD_2GFSK && Si4464_getState() == SI4464_STATE_TX) + while(active_mod == MOD_2GFSK && Si4464_getState() == SI4464_STATE_TX) chThdSleepMilliseconds(5); // Lock interference mutex @@ -349,7 +349,7 @@ bool transmitOnRadio(radioMSG_t *msg, bool shutdown) { case MOD_2GFSK: if(active_mod != msg->mod) init2GFSK(msg); - send2GFSK(msg); + send2GFSK(msg, shutdown); break; case MOD_AFSK: if(active_mod != msg->mod)