Driver for the SX1280 RF Transceiver
Dependents: SX1280PingPong RangignMaster RangingSlave MSNV2-Terminal_V1-6 ... more
RangingCorrection.cpp@12:c4f110f3fe3e, 2018-11-08 (annotated)
- Committer:
- mverdy
- Date:
- Thu Nov 08 10:08:44 2018 +0000
- Revision:
- 12:c4f110f3fe3e
Synchronze driver on v1.3.1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mverdy | 12:c4f110f3fe3e | 1 | #include "RangingCorrection.h" |
mverdy | 12:c4f110f3fe3e | 2 | |
mverdy | 12:c4f110f3fe3e | 3 | #include "rangingCorrection/rangingCorrectionSF5BW0400.h" |
mverdy | 12:c4f110f3fe3e | 4 | #include "rangingCorrection/rangingCorrectionSF6BW0400.h" |
mverdy | 12:c4f110f3fe3e | 5 | #include "rangingCorrection/rangingCorrectionSF7BW0400.h" |
mverdy | 12:c4f110f3fe3e | 6 | #include "rangingCorrection/rangingCorrectionSF8BW0400.h" |
mverdy | 12:c4f110f3fe3e | 7 | #include "rangingCorrection/rangingCorrectionSF9BW0400.h" |
mverdy | 12:c4f110f3fe3e | 8 | #include "rangingCorrection/rangingCorrectionSF10BW0400.h" |
mverdy | 12:c4f110f3fe3e | 9 | #include "rangingCorrection/rangingCorrectionSF5BW0800.h" |
mverdy | 12:c4f110f3fe3e | 10 | #include "rangingCorrection/rangingCorrectionSF6BW0800.h" |
mverdy | 12:c4f110f3fe3e | 11 | #include "rangingCorrection/rangingCorrectionSF7BW0800.h" |
mverdy | 12:c4f110f3fe3e | 12 | #include "rangingCorrection/rangingCorrectionSF8BW0800.h" |
mverdy | 12:c4f110f3fe3e | 13 | #include "rangingCorrection/rangingCorrectionSF9BW0800.h" |
mverdy | 12:c4f110f3fe3e | 14 | #include "rangingCorrection/rangingCorrectionSF10BW0800.h" |
mverdy | 12:c4f110f3fe3e | 15 | #include "rangingCorrection/rangingCorrectionSF5BW1600.h" |
mverdy | 12:c4f110f3fe3e | 16 | #include "rangingCorrection/rangingCorrectionSF6BW1600.h" |
mverdy | 12:c4f110f3fe3e | 17 | #include "rangingCorrection/rangingCorrectionSF7BW1600.h" |
mverdy | 12:c4f110f3fe3e | 18 | #include "rangingCorrection/rangingCorrectionSF8BW1600.h" |
mverdy | 12:c4f110f3fe3e | 19 | #include "rangingCorrection/rangingCorrectionSF9BW1600.h" |
mverdy | 12:c4f110f3fe3e | 20 | #include "rangingCorrection/rangingCorrectionSF10BW1600.h" |
mverdy | 12:c4f110f3fe3e | 21 | |
mverdy | 12:c4f110f3fe3e | 22 | const double* RangingCorrectionPerSfBwGain[6][3] = { |
mverdy | 12:c4f110f3fe3e | 23 | { &RangingCorrectionSF5BW0400[0], &RangingCorrectionSF5BW0800[0], &RangingCorrectionSF5BW1600[0] }, |
mverdy | 12:c4f110f3fe3e | 24 | { &RangingCorrectionSF6BW0400[0], &RangingCorrectionSF6BW0800[0], &RangingCorrectionSF6BW1600[0] }, |
mverdy | 12:c4f110f3fe3e | 25 | { &RangingCorrectionSF7BW0400[0], &RangingCorrectionSF7BW0800[0], &RangingCorrectionSF7BW1600[0] }, |
mverdy | 12:c4f110f3fe3e | 26 | { &RangingCorrectionSF8BW0400[0], &RangingCorrectionSF8BW0800[0], &RangingCorrectionSF8BW1600[0] }, |
mverdy | 12:c4f110f3fe3e | 27 | { &RangingCorrectionSF9BW0400[0], &RangingCorrectionSF9BW0800[0], &RangingCorrectionSF9BW1600[0] }, |
mverdy | 12:c4f110f3fe3e | 28 | { &RangingCorrectionSF10BW0400[0], &RangingCorrectionSF10BW0800[0], &RangingCorrectionSF10BW1600[0] }, |
mverdy | 12:c4f110f3fe3e | 29 | }; |
mverdy | 12:c4f110f3fe3e | 30 | |
mverdy | 12:c4f110f3fe3e | 31 | const RangingCorrectionPolynomes_t* RangingCorrectionPolynomesPerSfBw[6][3] = { |
mverdy | 12:c4f110f3fe3e | 32 | { &correctionRangingPolynomeSF5BW0400, &correctionRangingPolynomeSF5BW0800, &correctionRangingPolynomeSF5BW1600 }, |
mverdy | 12:c4f110f3fe3e | 33 | { &correctionRangingPolynomeSF6BW0400, &correctionRangingPolynomeSF6BW0800, &correctionRangingPolynomeSF6BW1600 }, |
mverdy | 12:c4f110f3fe3e | 34 | { &correctionRangingPolynomeSF7BW0400, &correctionRangingPolynomeSF7BW0800, &correctionRangingPolynomeSF7BW1600 }, |
mverdy | 12:c4f110f3fe3e | 35 | { &correctionRangingPolynomeSF8BW0400, &correctionRangingPolynomeSF8BW0800, &correctionRangingPolynomeSF8BW1600 }, |
mverdy | 12:c4f110f3fe3e | 36 | { &correctionRangingPolynomeSF9BW0400, &correctionRangingPolynomeSF9BW0800, &correctionRangingPolynomeSF9BW1600 }, |
mverdy | 12:c4f110f3fe3e | 37 | { &correctionRangingPolynomeSF10BW0400, &correctionRangingPolynomeSF10BW0800, &correctionRangingPolynomeSF10BW1600 }, |
mverdy | 12:c4f110f3fe3e | 38 | }; |
mverdy | 12:c4f110f3fe3e | 39 | |
mverdy | 12:c4f110f3fe3e | 40 | double Sx1280RangingCorrection::GetRangingCorrectionPerSfBwGain( const RadioLoRaSpreadingFactors_t sf, const RadioLoRaBandwidths_t bw, const int8_t gain){ |
mverdy | 12:c4f110f3fe3e | 41 | uint8_t sf_index, bw_index; |
mverdy | 12:c4f110f3fe3e | 42 | |
mverdy | 12:c4f110f3fe3e | 43 | switch(sf){ |
mverdy | 12:c4f110f3fe3e | 44 | case LORA_SF5: |
mverdy | 12:c4f110f3fe3e | 45 | sf_index = 0; |
mverdy | 12:c4f110f3fe3e | 46 | break; |
mverdy | 12:c4f110f3fe3e | 47 | case LORA_SF6: |
mverdy | 12:c4f110f3fe3e | 48 | sf_index = 1; |
mverdy | 12:c4f110f3fe3e | 49 | break; |
mverdy | 12:c4f110f3fe3e | 50 | case LORA_SF7: |
mverdy | 12:c4f110f3fe3e | 51 | sf_index = 2; |
mverdy | 12:c4f110f3fe3e | 52 | break; |
mverdy | 12:c4f110f3fe3e | 53 | case LORA_SF8: |
mverdy | 12:c4f110f3fe3e | 54 | sf_index = 3; |
mverdy | 12:c4f110f3fe3e | 55 | break; |
mverdy | 12:c4f110f3fe3e | 56 | case LORA_SF9: |
mverdy | 12:c4f110f3fe3e | 57 | sf_index = 4; |
mverdy | 12:c4f110f3fe3e | 58 | break; |
mverdy | 12:c4f110f3fe3e | 59 | case LORA_SF10: |
mverdy | 12:c4f110f3fe3e | 60 | sf_index = 5; |
mverdy | 12:c4f110f3fe3e | 61 | break; |
mverdy | 12:c4f110f3fe3e | 62 | } |
mverdy | 12:c4f110f3fe3e | 63 | switch(bw){ |
mverdy | 12:c4f110f3fe3e | 64 | case LORA_BW_0400: |
mverdy | 12:c4f110f3fe3e | 65 | bw_index = 0; |
mverdy | 12:c4f110f3fe3e | 66 | break; |
mverdy | 12:c4f110f3fe3e | 67 | case LORA_BW_0800: |
mverdy | 12:c4f110f3fe3e | 68 | bw_index = 1; |
mverdy | 12:c4f110f3fe3e | 69 | break; |
mverdy | 12:c4f110f3fe3e | 70 | case LORA_BW_1600: |
mverdy | 12:c4f110f3fe3e | 71 | bw_index = 2; |
mverdy | 12:c4f110f3fe3e | 72 | break; |
mverdy | 12:c4f110f3fe3e | 73 | } |
mverdy | 12:c4f110f3fe3e | 74 | |
mverdy | 12:c4f110f3fe3e | 75 | double correction = RangingCorrectionPerSfBwGain[sf_index][bw_index][gain]; |
mverdy | 12:c4f110f3fe3e | 76 | return correction; |
mverdy | 12:c4f110f3fe3e | 77 | } |
mverdy | 12:c4f110f3fe3e | 78 | |
mverdy | 12:c4f110f3fe3e | 79 | double Sx1280RangingCorrection::ComputeRangingCorrectionPolynome(const RadioLoRaSpreadingFactors_t sf, const RadioLoRaBandwidths_t bw, const double median){ |
mverdy | 12:c4f110f3fe3e | 80 | uint8_t sf_index, bw_index; |
mverdy | 12:c4f110f3fe3e | 81 | |
mverdy | 12:c4f110f3fe3e | 82 | switch(sf){ |
mverdy | 12:c4f110f3fe3e | 83 | case LORA_SF5: |
mverdy | 12:c4f110f3fe3e | 84 | sf_index = 0; |
mverdy | 12:c4f110f3fe3e | 85 | break; |
mverdy | 12:c4f110f3fe3e | 86 | case LORA_SF6: |
mverdy | 12:c4f110f3fe3e | 87 | sf_index = 1; |
mverdy | 12:c4f110f3fe3e | 88 | break; |
mverdy | 12:c4f110f3fe3e | 89 | case LORA_SF7: |
mverdy | 12:c4f110f3fe3e | 90 | sf_index = 2; |
mverdy | 12:c4f110f3fe3e | 91 | break; |
mverdy | 12:c4f110f3fe3e | 92 | case LORA_SF8: |
mverdy | 12:c4f110f3fe3e | 93 | sf_index = 3; |
mverdy | 12:c4f110f3fe3e | 94 | break; |
mverdy | 12:c4f110f3fe3e | 95 | case LORA_SF9: |
mverdy | 12:c4f110f3fe3e | 96 | sf_index = 4; |
mverdy | 12:c4f110f3fe3e | 97 | break; |
mverdy | 12:c4f110f3fe3e | 98 | case LORA_SF10: |
mverdy | 12:c4f110f3fe3e | 99 | sf_index = 5; |
mverdy | 12:c4f110f3fe3e | 100 | break; |
mverdy | 12:c4f110f3fe3e | 101 | } |
mverdy | 12:c4f110f3fe3e | 102 | switch(bw){ |
mverdy | 12:c4f110f3fe3e | 103 | case LORA_BW_0400: |
mverdy | 12:c4f110f3fe3e | 104 | bw_index = 0; |
mverdy | 12:c4f110f3fe3e | 105 | break; |
mverdy | 12:c4f110f3fe3e | 106 | case LORA_BW_0800: |
mverdy | 12:c4f110f3fe3e | 107 | bw_index = 1; |
mverdy | 12:c4f110f3fe3e | 108 | break; |
mverdy | 12:c4f110f3fe3e | 109 | case LORA_BW_1600: |
mverdy | 12:c4f110f3fe3e | 110 | bw_index = 2; |
mverdy | 12:c4f110f3fe3e | 111 | break; |
mverdy | 12:c4f110f3fe3e | 112 | } |
mverdy | 12:c4f110f3fe3e | 113 | const RangingCorrectionPolynomes_t *polynome = RangingCorrectionPolynomesPerSfBw[sf_index][bw_index]; |
mverdy | 12:c4f110f3fe3e | 114 | double correctedValue = 0.0; |
mverdy | 12:c4f110f3fe3e | 115 | double correctionCoeff = 0; |
mverdy | 12:c4f110f3fe3e | 116 | for(uint8_t order = 0; order < polynome->order; order++){ |
mverdy | 12:c4f110f3fe3e | 117 | correctionCoeff = polynome->coefficients[order] * pow(median, polynome->order - order - 1); |
mverdy | 12:c4f110f3fe3e | 118 | correctedValue += correctionCoeff; |
mverdy | 12:c4f110f3fe3e | 119 | } |
mverdy | 12:c4f110f3fe3e | 120 | return correctedValue; |
mverdy | 12:c4f110f3fe3e | 121 | } |