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 }