summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Reiss <jreiss@multitech.com>2021-02-02 09:09:24 -0600
committerJason Reiss <jreiss@multitech.com>2021-02-19 10:55:16 -0600
commita2f4d0d391b19bc5b7c33ed2e36344f298cacc85 (patch)
treec163f31fa2f28d6ec9a80184103961c4a2051b2b
parent5ea676a443d8c8d2a49dfeb8214027780d459aea (diff)
downloadpacket_forwarder_mtac_full-a2f4d0d391b19bc5b7c33ed2e36344f298cacc85.tar.gz
packet_forwarder_mtac_full-a2f4d0d391b19bc5b7c33ed2e36344f298cacc85.tar.bz2
packet_forwarder_mtac_full-a2f4d0d391b19bc5b7c33ed2e36344f298cacc85.zip
reduce LUT temperature file size4.0.5
-rw-r--r--lora_pkt_fwd/src/lora_pkt_fwd.c136
1 files changed, 68 insertions, 68 deletions
diff --git a/lora_pkt_fwd/src/lora_pkt_fwd.c b/lora_pkt_fwd/src/lora_pkt_fwd.c
index 8e20457..2969053 100644
--- a/lora_pkt_fwd/src/lora_pkt_fwd.c
+++ b/lora_pkt_fwd/src/lora_pkt_fwd.c
@@ -336,12 +336,12 @@ void thread_spectralscan(void);
#define TEMP_LUT_SIZE_MAX 13
+
/**
@struct lgw_tx_alt_gain_s
@brief Structure containing all gains of Tx chain
*/
struct lgw_tx_alt_gain_s {
- float dig_gain[4];/*!> RF power output measured at each dig setting 0-3 */
uint8_t pa_gain; /*!> 2 bits, control of the external PA (SX1301 I/O) */
uint8_t dac_gain; /*!> 2 bits, control of the radio DAC */
uint8_t mix_gain; /*!> 4 bits, control of the radio mixer */
@@ -353,9 +353,9 @@ struct lgw_tx_alt_gain_s {
@brief Structure defining the Tx gain LUT
*/
struct lgw_tx_alt_gain_lut_s {
- struct lgw_tx_alt_gain_s lut[TX_GAIN_LUT_SIZE_MAX]; /*!> Array of Tx gain struct */
- int8_t temp;
- uint8_t size; /*!> Number of LUT indexes */
+ float dig_gain[64];
+ int8_t temp;
+ uint8_t size; /*!> Number of LUT indexes */
};
/**
@@ -363,8 +363,9 @@ struct lgw_tx_alt_gain_lut_s {
@brief Structure defining the Tx gain LUT
*/
struct lgw_tx_temp_lut_s {
- struct lgw_tx_alt_gain_lut_s lut[TEMP_LUT_SIZE_MAX]; /*!> Array of Tx gain struct */
- uint8_t size; /*!> Number of LUT indexes */
+ struct lgw_tx_alt_gain_s base[TX_GAIN_LUT_SIZE_MAX]; /*!> Array of Tx gain struct */
+ struct lgw_tx_alt_gain_lut_s lut[TEMP_LUT_SIZE_MAX]; /*!> Array of Tx gain struct */
+ uint8_t size; /*!> Number of LUT indexes */
};
struct lgw_tx_temp_lut_s tx_temp_lut;
@@ -376,8 +377,8 @@ void lookup_power_settings(float tx_pwr, int8_t* rf_power, int8_t* dig_gain) {
if (i == TEMP_LUT_SIZE_MAX-1 || (tx_temp_lut.lut[i].temp <= temp_comp_value && tx_temp_lut.lut[i+1].temp > temp_comp_value)) {
for (int j = 0; j < TX_GAIN_LUT_SIZE_MAX; j++) {
for (int h = 0; h < 4; h++) {
- if (tx_pwr >= tx_temp_lut.lut[i].lut[j].dig_gain[h] && (tx_pwr - tx_temp_lut.lut[i].lut[j].dig_gain[h]) < min_diff) {
- min_diff = (tx_pwr - tx_temp_lut.lut[i].lut[j].dig_gain[h]);
+ if (tx_pwr >= tx_temp_lut.lut[i].dig_gain[j*4+h] && (tx_pwr - tx_temp_lut.lut[i].dig_gain[j*4+h]) < min_diff) {
+ min_diff = (tx_pwr - tx_temp_lut.lut[i].dig_gain[j*4+h]);
*rf_power = j;
*dig_gain = h;
}
@@ -421,70 +422,69 @@ void load_temp_lookup() {
exit(EXIT_FAILURE);
}
+ /* point to the gateway configuration object */
+ conf_obj = json_object_get_object(json_value_get_object(root_val), "LUT-BASE");
+ if (conf_obj == NULL) {
+ return;
+ }
+
temp_comp_enabled = true;
- int index = 0;
- for (int temp = -60; temp <= 100; temp++) {
- snprintf(param_name, sizeof param_name, "LUT%i", temp); /* compose parameter path inside JSON structure */
- /* point to the gateway configuration object */
- conf_obj = json_object_get_object(json_value_get_object(root_val), param_name);
- if (conf_obj == NULL) {
+ for (i = 0; i < TX_GAIN_LUT_SIZE_MAX; i++) {
+ snprintf(param_name, sizeof param_name, "tx_lut_%i", i); /* compose parameter path inside JSON structure */
+ conf_lut_obj = json_object_get_object(conf_obj, param_name); /* fetch value (if possible) */
+ if (conf_lut_obj == NULL) {
+ MSG("INFO: no configuration for tx gain lut %i\n", i);
continue;
}
+ tx_temp_lut.size++; /* update TX LUT size based on JSON object found in configuration file */
+ /* there is an object to configure that TX gain index, let's parse it */
+ snprintf(param_name, sizeof param_name, "tx_lut_%i.pa_gain", i);
+ val = json_object_dotget_value(conf_obj, param_name);
+ if (json_value_get_type(val) == JSONNumber) {
+ tx_temp_lut.base[i].pa_gain = (uint8_t)json_value_get_number(val);
+ } else {
+ MSG("WARNING: Data type for %s[%d] seems wrong, please check\n", param_name, i);
+ tx_temp_lut.base[i].pa_gain = 0;
+ }
+ snprintf(param_name, sizeof param_name, "tx_lut_%i.dac_gain", i);
+ val = json_object_dotget_value(conf_obj, param_name);
+ if (json_value_get_type(val) == JSONNumber) {
+ tx_temp_lut.base[i].dac_gain = (uint8_t)json_value_get_number(val);
+ } else {
+ tx_temp_lut.base[i].dac_gain = 3; /* This is the only dac_gain supported for now */
+ }
+ snprintf(param_name, sizeof param_name, "tx_lut_%i.mix_gain", i);
+ val = json_object_dotget_value(conf_obj, param_name);
+ if (json_value_get_type(val) == JSONNumber) {
+ tx_temp_lut.base[i].mix_gain = (uint8_t)json_value_get_number(val);
+ } else {
+ MSG("WARNING: Data type for %s[%d] seems wrong, please check\n", param_name, i);
+ tx_temp_lut.base[i].mix_gain = 0;
+ }
+ snprintf(param_name, sizeof param_name, "tx_lut_%i.rf_power", i);
+ val = json_object_dotget_value(conf_obj, param_name);
+ if (json_value_get_type(val) == JSONNumber) {
+ tx_temp_lut.base[i].rf_power = (int8_t)json_value_get_number(val);
+ } else {
+ MSG("WARNING: Data type for %s[%d] seems wrong, please check\n", param_name, i);
+ tx_temp_lut.base[i].rf_power = 0;
+ }
+ }
- tx_temp_lut.lut[index].temp = temp;
-
- for (i = 0; i < TX_GAIN_LUT_SIZE_MAX; i++) {
- snprintf(param_name, sizeof param_name, "tx_lut_%i", i); /* compose parameter path inside JSON structure */
- conf_lut_obj = json_object_get_object(conf_obj, param_name); /* fetch value (if possible) */
- if (conf_lut_obj == NULL) {
- MSG("INFO: no configuration for tx gain lut %i\n", i);
- continue;
- }
- tx_temp_lut.lut[index].size++; /* update TX LUT size based on JSON object found in configuration file */
- /* there is an object to configure that TX gain index, let's parse it */
- snprintf(param_name, sizeof param_name, "tx_lut_%i.pa_gain", i);
- val = json_object_dotget_value(conf_obj, param_name);
- if (json_value_get_type(val) == JSONNumber) {
- tx_temp_lut.lut[index].lut[i].pa_gain = (uint8_t)json_value_get_number(val);
- } else {
- MSG("WARNING: Data type for %s[%d] seems wrong, please check\n", param_name, i);
- tx_temp_lut.lut[index].lut[i].pa_gain = 0;
- }
- snprintf(param_name, sizeof param_name, "tx_lut_%i.dac_gain", i);
- val = json_object_dotget_value(conf_obj, param_name);
- if (json_value_get_type(val) == JSONNumber) {
- tx_temp_lut.lut[index].lut[i].dac_gain = (uint8_t)json_value_get_number(val);
- } else {
- tx_temp_lut.lut[index].lut[i].dac_gain = 3; /* This is the only dac_gain supported for now */
- }
- snprintf(param_name, sizeof param_name, "tx_lut_%i.mix_gain", i);
- val = json_object_dotget_value(conf_obj, param_name);
- if (json_value_get_type(val) == JSONNumber) {
- tx_temp_lut.lut[index].lut[i].mix_gain = (uint8_t)json_value_get_number(val);
- } else {
- MSG("WARNING: Data type for %s[%d] seems wrong, please check\n", param_name, i);
- tx_temp_lut.lut[index].lut[i].mix_gain = 0;
- }
- snprintf(param_name, sizeof param_name, "tx_lut_%i.rf_power", i);
- val = json_object_dotget_value(conf_obj, param_name);
- if (json_value_get_type(val) == JSONNumber) {
- tx_temp_lut.lut[index].lut[i].rf_power = (int8_t)json_value_get_number(val);
- } else {
- MSG("WARNING: Data type for %s[%d] seems wrong, please check\n", param_name, i);
- tx_temp_lut.lut[index].lut[i].rf_power = 0;
- }
-
- conf_array = json_object_get_array(conf_lut_obj, "dig_gain");
- if (conf_array != NULL) {
- for (int j = 0; j < 4; j++) {
- /* Get lut channel configuration object from array */
- tx_temp_lut.lut[index].lut[i].dig_gain[j] = (float)json_array_get_number(conf_array, j);
- }
+ int index = 0;
+ for (int temp = -60; temp <= 100; temp++) {
+ snprintf(param_name, sizeof param_name, "LUT%i", temp); /* compose parameter path inside JSON structure */
+ conf_array = json_object_get_array(json_value_get_object(root_val), param_name);
+ if (conf_array != NULL) {
+ tx_temp_lut.lut[index].temp = temp;
+ for (int j = 0; j < 64; j++) {
+ /* Get lut channel configuration object from array */
+ float val = (float)json_array_get_number(conf_array, j);
+ tx_temp_lut.lut[index].dig_gain[j] = val;
}
+ index++;
}
-
- index++;
}
}
@@ -851,9 +851,9 @@ static int parse_SX1301_configuration(const char * conf_file) {
MSG("INFO: Loading temperature compensated LUT values\n");
for (i = 0; i < TX_GAIN_LUT_SIZE_MAX; i++) {
- txlut.lut[i].rf_power = tx_temp_lut.lut[0].lut[i].rf_power;
- txlut.lut[i].pa_gain = tx_temp_lut.lut[0].lut[i].pa_gain;
- txlut.lut[i].mix_gain = tx_temp_lut.lut[0].lut[i].mix_gain;
+ txlut.lut[i].rf_power = tx_temp_lut.base[i].rf_power;
+ txlut.lut[i].pa_gain = tx_temp_lut.base[i].pa_gain;
+ txlut.lut[i].mix_gain = tx_temp_lut.base[i].mix_gain;
txlut.lut[i].dig_gain = 0;
txlut.lut[i].dac_gain = 3;
MSG("LUT %d RF: %d PA: %d MIX: %d DIG: %d DAC: %d\n", i, txlut.lut[i].rf_power, txlut.lut[i].pa_gain, txlut.lut[i].mix_gain, txlut.lut[i].dig_gain, txlut.lut[i].dac_gain);