diff --git a/latest/Firmware/Bootloader/.cproject b/latest/Firmware/Bootloader/.cproject
index 5526861..e479ff3 100644
--- a/latest/Firmware/Bootloader/.cproject
+++ b/latest/Firmware/Bootloader/.cproject
@@ -189,8 +189,8 @@
-
-
+
+
@@ -241,7 +241,7 @@
-
+
@@ -264,10 +264,11 @@
-
+
+
@@ -625,6 +626,7 @@
+
diff --git a/latest/Firmware/Transponder/Inc/RFIC.hpp b/latest/Firmware/Transponder/Inc/RFIC.hpp
index 76e0c09..a51ede0 100644
--- a/latest/Firmware/Transponder/Inc/RFIC.hpp
+++ b/latest/Firmware/Transponder/Inc/RFIC.hpp
@@ -48,12 +48,13 @@ public:
void setRSSIAdjustment(short rssiAdj);
uint16_t partNumber();
+ bool isResponsive();
protected:
virtual void configure();
bool sendCmd(uint8_t cmd, void* params, uint8_t paramLen, void* result, uint8_t resultLen);
bool sendCmdNoWait(uint8_t cmd, void* params, uint8_t paramLen);
bool isInitialized();
- void powerOnReset();
+ bool powerOnReset();
bool isReceiving();
uint8_t readRSSI();
bool checkStatus();
@@ -76,6 +77,7 @@ protected:
uint32_t mChipID;
bool mCTSPending = false;
uint16_t mPartNumber;
+ bool mPORSuccess = false;
};
#endif /* RFIC_HPP_ */
diff --git a/latest/Firmware/Transponder/Inc/RadioManager.hpp b/latest/Firmware/Transponder/Inc/RadioManager.hpp
index 579c284..d43ce6a 100644
--- a/latest/Firmware/Transponder/Inc/RadioManager.hpp
+++ b/latest/Firmware/Transponder/Inc/RadioManager.hpp
@@ -54,6 +54,7 @@ private:
RadioManager();
void spiOff();
void configureInterrupts();
+ void reportError(int chipId);
private:
Transceiver *mTransceiverIC;
Receiver *mReceiverIC;
diff --git a/latest/Firmware/Transponder/Inc/config.h b/latest/Firmware/Transponder/Inc/config.h
index 7bb65fe..81011a0 100644
--- a/latest/Firmware/Transponder/Inc/config.h
+++ b/latest/Firmware/Transponder/Inc/config.h
@@ -25,7 +25,7 @@
#include "TXPowerSettings.h"
-#define FW_REV "4.1.0"
+#define FW_REV "4.2.0"
/*
diff --git a/latest/Firmware/Transponder/Src/RFIC.cpp b/latest/Firmware/Transponder/Src/RFIC.cpp
index a19fb0c..00880ea 100644
--- a/latest/Firmware/Transponder/Src/RFIC.cpp
+++ b/latest/Firmware/Transponder/Src/RFIC.cpp
@@ -49,7 +49,11 @@ RFIC::RFIC(GPIO_TypeDef *sdnPort,
mChipID = chipID;
if ( !isInitialized() )
- powerOnReset();
+ {
+ mPORSuccess = powerOnReset();
+ }
+ else
+ mPORSuccess = true;
}
@@ -67,6 +71,11 @@ inline void RFIC::spiOff()
HAL_GPIO_WritePin(mCSPort, mCSPin, GPIO_PIN_SET);
}
+bool RFIC::isResponsive()
+{
+ return mPORSuccess;
+}
+
bool RFIC::sendCmd(uint8_t cmd, void* params, uint8_t paramLen, void* result, uint8_t resultLen)
{
if ( mCTSPending )
@@ -205,7 +214,7 @@ bool RFIC::isInitialized()
}
}
-void RFIC::powerOnReset()
+bool RFIC::powerOnReset()
{
// Pull SDN high to shut down the IC
HAL_GPIO_WritePin(mSDNP, mSDNPin, GPIO_PIN_SET);
@@ -216,8 +225,14 @@ void RFIC::powerOnReset()
// Pull SDN low and poll the status of GPIO1
HAL_GPIO_WritePin(mSDNP, mSDNPin, GPIO_PIN_RESET);
- while ( HAL_GPIO_ReadPin(mDataPort, mDataPin) == GPIO_PIN_RESET )
- ;
+ uint32_t start = HAL_GetTick();
+ while ( HAL_GetTick() - start < 1000 )
+ {
+ if ( HAL_GPIO_ReadPin(mDataPort, mDataPin) == GPIO_PIN_SET )
+ return true;
+ }
+
+ return false;
}
/**
diff --git a/latest/Firmware/Transponder/Src/RadioManager.cpp b/latest/Firmware/Transponder/Src/RadioManager.cpp
index 2e863ce..eb7b339 100644
--- a/latest/Firmware/Transponder/Src/RadioManager.cpp
+++ b/latest/Firmware/Transponder/Src/RadioManager.cpp
@@ -55,15 +55,31 @@ void RadioManager::init()
CS1_PORT, CS1_PIN,
TRX_IC_DATA_PORT, TRX_IC_DATA_PIN,
TRX_IC_CLK_PORT, TRX_IC_CLK_PIN, 0);
- mTransceiverIC->init();
+
+ if ( mTransceiverIC->isResponsive() )
+ {
+ mTransceiverIC->init();
+ }
+ else
+ {
+ reportError(1);
+ }
mReceiverIC = new Receiver(SDN2_PORT, SDN2_PIN,
CS2_PORT, CS2_PIN,
RX_IC_DATA_PORT, RX_IC_DATA_PIN,
RX_IC_CLK_PORT, RX_IC_CLK_PIN, 1);
- mReceiverIC->init();
+ if ( mReceiverIC->isResponsive() )
+ {
+ mReceiverIC->init();
+ }
+ else
+ {
+ reportError(2);
+ }
- mInitializing = false;
+ if ( mReceiverIC->isResponsive() && mTransceiverIC->isResponsive() )
+ mInitializing = false;
}
void RadioManager::transmitCW(VHFChannel channel)
@@ -88,6 +104,16 @@ void RadioManager::stop()
// TODO: Implement this
}
+void RadioManager::reportError(int chipId)
+{
+ Event *e = EventPool::instance().newEvent(PROPR_NMEA_SENTENCE);
+ if ( !e )
+ return;
+
+ sprintf(e->nmeaBuffer.sentence, "$PAIERR,RFIC,%d*", chipId);
+ Utils::completeNMEA(e->nmeaBuffer.sentence);
+ EventQueue::instance().push(e);
+}
void RadioManager::configureInterrupts()
{
diff --git a/latest/Firmware/Transponder/Src/main.cpp b/latest/Firmware/Transponder/Src/main.cpp
index 621d523..daa3429 100644
--- a/latest/Firmware/Transponder/Src/main.cpp
+++ b/latest/Firmware/Transponder/Src/main.cpp
@@ -65,8 +65,11 @@ void mainLoop()
if ( !cliBootMode )
{
- GPS::instance().enable();
- RadioManager::instance().start();
+ if ( RadioManager::instance().initialized() )
+ {
+ GPS::instance().enable();
+ RadioManager::instance().start();
+ }
}
else
{