From 0e6e19cb6b9d5ab5c75867e33dba9d627f7539ee Mon Sep 17 00:00:00 2001 From: Hydra Date: Sat, 1 Apr 2017 18:33:18 +0100 Subject: [PATCH] CF/BF - Cleanup transponder config after Arctimer merge. See https://github.com/cleanflight/cleanflight/pull/2580 --- src/main/drivers/transponder_ir.c | 7 ++-- src/main/drivers/transponder_ir.h | 7 ++-- src/main/fc/fc_msp.c | 53 ++++++++++++++----------------- src/main/io/transponder_ir.c | 5 +-- src/main/io/transponder_ir.h | 3 +- 5 files changed, 37 insertions(+), 38 deletions(-) diff --git a/src/main/drivers/transponder_ir.c b/src/main/drivers/transponder_ir.c index 6f87185ec5..08d9b0a0c1 100644 --- a/src/main/drivers/transponder_ir.c +++ b/src/main/drivers/transponder_ir.c @@ -151,7 +151,7 @@ void transponderIrHardwareInit(ioTag_t ioTag, transponder_t *transponder) DMA_ITConfig(dmaRef, DMA_IT_TC, ENABLE); } -bool transponderIrInit(const TransponderProvider* transponderProvider) +bool transponderIrInit(const transponderProvider_e provider) { ioTag_t ioTag = IO_TAG_NONE; for (int i = 0; i < USABLE_TIMER_CHANNEL_COUNT; i++) { @@ -165,14 +165,15 @@ bool transponderIrInit(const TransponderProvider* transponderProvider) return false; } - uint8_t transponderProviderLocal = *transponderProvider; - switch(transponderProviderLocal){ + switch (provider) { case ARCITIMER: transponderIrInitArcitimer(&transponder); break; case ILAP: transponderIrInitIlap(&transponder); break; + default: + return false; } transponderIrHardwareInit(ioTag, &transponder); diff --git a/src/main/drivers/transponder_ir.h b/src/main/drivers/transponder_ir.h index c3bf07f271..41dc0a5856 100644 --- a/src/main/drivers/transponder_ir.h +++ b/src/main/drivers/transponder_ir.h @@ -79,16 +79,17 @@ typedef struct transponder_s { const struct transponderVTable *vTable; } transponder_t; -typedef enum TransponderProvider{ +typedef enum { + NONE, ARCITIMER, ILAP -} TransponderProvider; +} transponderProvider_e; struct transponderVTable { void (*updateTransponderDMABuffer)(transponder_t *transponder, const uint8_t* transponderData); }; -bool transponderIrInit(const TransponderProvider* transponderProvider); +bool transponderIrInit(const transponderProvider_e provider); void transponderIrDisable(void); void transponderIrHardwareInit(ioTag_t ioTag, transponder_t *transponder); diff --git a/src/main/fc/fc_msp.c b/src/main/fc/fc_msp.c index 8c05408496..7062f8f3a3 100755 --- a/src/main/fc/fc_msp.c +++ b/src/main/fc/fc_msp.c @@ -1085,30 +1085,28 @@ static bool mspFcProcessOutCommand(uint8_t cmdMSP, sbuf_t *dst, mspPostProcessFn serializeSDCardSummaryReply(dst); break; - case MSP_TRANSPONDER_CONFIG: - { + + case MSP_TRANSPONDER_CONFIG: { + +#define TRANSPONDER_SUPPORTED_MASK 0x01 // 00000001 +#define TRANSPONDER_PROVIDER_MASK 0x0E // 00001110 +#define TRANSPONDER_DATA_SIZE_MASK 0xF0 // 11110000 +#define TRANSPONDER_PROVIDER_OFFSET 1 +#define TRANSPONDER_DATA_SIZE_OFFSET 4 + #ifdef TRANSPONDER - uint8_t header = 1; //transponder supported + uint8_t header = 0; - switch(transponderConfig()->provider){ - case ILAP: - header |= 0x02; - break; - case ARCITIMER: - header |= 0x04; - break; - default: - break; - } - - header |= (sizeof(transponderConfig()->data) << 4); + header |= 1 & TRANSPONDER_SUPPORTED_MASK; + header |= (transponderConfig()->provider << TRANSPONDER_PROVIDER_OFFSET) & TRANSPONDER_PROVIDER_MASK; + header |= ((sizeof(transponderConfig()->data) << TRANSPONDER_DATA_SIZE_OFFSET) & TRANSPONDER_DATA_SIZE_MASK); sbufWriteU8(dst, header); for (unsigned int i = 0; i < sizeof(transponderConfig()->data); i++) { sbufWriteU8(dst, transponderConfig()->data[i]); } #else - sbufWriteU8(dst, 0); // Transponder not supported + sbufWriteU8(dst, 0 & TRANSPONDER_SUPPORTED_MASK); #endif break; } @@ -1625,27 +1623,24 @@ static mspResult_e mspFcProcessInCommand(uint8_t cmdMSP, sbuf_t *src) case MSP_SET_TRANSPONDER_CONFIG: { uint8_t tmp = sbufReadU8(src); + uint8_t bytesRemaining = dataSize - 1; - uint8_t type; - switch(tmp){ - case 0x02: - type = ILAP; - break; - case 0x04: - type = ARCITIMER; - break; - } + uint8_t provider = (tmp & TRANSPONDER_PROVIDER_MASK) >> TRANSPONDER_PROVIDER_OFFSET; + uint8_t transponderDataSize = (tmp & TRANSPONDER_DATA_SIZE_MASK) >> TRANSPONDER_DATA_SIZE_OFFSET; - if(type != transponderConfig()->provider){ + if(provider != transponderConfig()->provider) { transponderStopRepeating(); } - transponderConfigMutable()->provider = type; + transponderConfigMutable()->provider = provider; - if (dataSize != sizeof(transponderConfig()->data) + 1) { + if (bytesRemaining != transponderDataSize || transponderDataSize > sizeof(transponderConfig()->data)) { return MSP_RESULT_ERROR; } - for (unsigned int i = 0; i < sizeof(transponderConfig()->data); i++) { + + memset(transponderConfigMutable()->data, 0, sizeof(transponderConfig()->data)); + + for (unsigned int i = 0; i < transponderDataSize; i++) { transponderConfigMutable()->data[i] = sbufReadU8(src); } transponderUpdateData(); diff --git a/src/main/io/transponder_ir.c b/src/main/io/transponder_ir.c index 1a1b0ec753..892ce79004 100644 --- a/src/main/io/transponder_ir.c +++ b/src/main/io/transponder_ir.c @@ -40,8 +40,9 @@ PG_REGISTER_WITH_RESET_TEMPLATE(transponderConfig_t, transponderConfig, PG_TRANSPONDER_CONFIG, 0); PG_RESET_TEMPLATE(transponderConfig_t, transponderConfig, + .provider = ILAP, + .reserved = 0, .data = { 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0x0, 0x0, 0x0 }, // Note, this is NOT a valid transponder code, it's just for testing production hardware - .provider = ILAP ); static bool transponderInitialised = false; @@ -86,7 +87,7 @@ void transponderUpdate(timeUs_t currentTimeUs) void transponderInit(void) { - transponderInitialised = transponderIrInit(&(transponderConfig()->provider)); + transponderInitialised = transponderIrInit(transponderConfig()->provider); if (!transponderInitialised) { return; } diff --git a/src/main/io/transponder_ir.h b/src/main/io/transponder_ir.h index afb603b4ab..4463648c78 100644 --- a/src/main/io/transponder_ir.h +++ b/src/main/io/transponder_ir.h @@ -21,7 +21,8 @@ #include "config/parameter_group.h" typedef struct transponderConfig_s { - TransponderProvider provider; + transponderProvider_e provider; + uint8_t reserved; uint8_t data[9]; } transponderConfig_t;