RadarSettings.cpp
  1  #include "RadarSettings.h"
  2  #include <cstring>
  3  
  4  RadarSettings::RadarSettings() {
  5      resetToDefaults();
  6  }
  7  
  8  void RadarSettings::resetToDefaults() {
  9      system_frequency = 10.0e9;    // 10 GHz
 10      chirp_duration_1 = 30.0e-6;   // 30 �s
 11      chirp_duration_2 = 0.5e-6;    // 0.5 �s
 12      chirps_per_position = 32;
 13      freq_min = 10.0e6;           // 10 MHz
 14      freq_max = 30.0e6;           // 30 MHz
 15      prf1 = 1000.0;               // 1 kHz
 16      prf2 = 2000.0;               // 2 kHz
 17      max_distance = 50000.0;      // 50 km
 18      map_size = 50000.0;          // 50 km
 19      
 20      settings_valid = true;
 21  }
 22  
 23  bool RadarSettings::parseFromUSB(const uint8_t* data, uint32_t length) {
 24      // Minimum packet size: "SET" + 8 doubles + 1 uint32_t + "END" = 3 + 8*8 + 4 + 3 = 74 bytes
 25      if (data == nullptr || length < 74) {
 26          settings_valid = false;
 27          return false;
 28      }
 29      
 30      // Check for start marker "SET"
 31      if (memcmp(data, "SET", 3) != 0) {
 32          settings_valid = false;
 33          return false;
 34      }
 35      
 36      // Check for end marker "END"
 37      if (memcmp(data + length - 3, "END", 3) != 0) {
 38          settings_valid = false;
 39          return false;
 40      }
 41      
 42      uint32_t offset = 3;  // Skip "SET"
 43      
 44      // Extract all parameters in order
 45      system_frequency = extractDouble(data + offset);
 46      offset += 8;
 47      
 48      chirp_duration_1 = extractDouble(data + offset);
 49      offset += 8;
 50      
 51      chirp_duration_2 = extractDouble(data + offset);
 52      offset += 8;
 53      
 54      chirps_per_position = extractUint32(data + offset);
 55      offset += 4;
 56      
 57      freq_min = extractDouble(data + offset);
 58      offset += 8;
 59      
 60      freq_max = extractDouble(data + offset);
 61      offset += 8;
 62      
 63      prf1 = extractDouble(data + offset);
 64      offset += 8;
 65      
 66      prf2 = extractDouble(data + offset);
 67      offset += 8;
 68      
 69      max_distance = extractDouble(data + offset);
 70      offset += 8;
 71      
 72      map_size = extractDouble(data + offset);
 73      
 74      // Validate the received settings
 75      settings_valid = validateSettings();
 76      
 77      return settings_valid;
 78  }
 79  
 80  bool RadarSettings::validateSettings() {
 81      // Check for reasonable value ranges
 82      if (system_frequency < 1e9 || system_frequency > 100e9) return false;
 83      if (chirp_duration_1 < 1e-6 || chirp_duration_1 > 1000e-6) return false;
 84      if (chirp_duration_2 < 0.1e-6 || chirp_duration_2 > 10e-6) return false;
 85      if (chirps_per_position < 1 || chirps_per_position > 256) return false;
 86      if (freq_min < 1e6 || freq_min > 100e6) return false;
 87      if (freq_max <= freq_min || freq_max > 100e6) return false;
 88      if (prf1 < 100 || prf1 > 10000) return false;
 89      if (prf2 < 100 || prf2 > 10000) return false;
 90      if (max_distance < 100 || max_distance > 100000) return false;
 91      if (map_size < 1000 || map_size > 200000) return false;
 92      
 93      return true;
 94  }
 95  
 96  double RadarSettings::extractDouble(const uint8_t* data) {
 97      uint64_t bits = 0;
 98      for (int i = 0; i < 8; i++) {
 99          bits = (bits << 8) | data[i];
100      }
101      
102      double value;
103      memcpy(&value, &bits, sizeof(double));
104      return value;
105  }
106  
107  uint32_t RadarSettings::extractUint32(const uint8_t* data) {
108      uint32_t value = 0;
109      for (int i = 0; i < 4; i++) {
110          value = (value << 8) | data[i];
111      }
112      return value;
113  }