Use char buffer for probeResponse

This commit is contained in:
Ben Meadors 2025-09-05 07:15:12 -05:00
parent 3df3c876cc
commit d095b6b92e

View File

@ -1370,34 +1370,42 @@ GnssModel_t GPS::probe(int serialSpeed)
GnssModel_t GPS::getProbeResponse(unsigned long timeout, const std::vector<ChipInfo> &responseMap) GnssModel_t GPS::getProbeResponse(unsigned long timeout, const std::vector<ChipInfo> &responseMap)
{ {
String response = ""; char response[256] = {0}; // Fixed buffer instead of String
uint16_t responseLen = 0;
unsigned long start = millis(); unsigned long start = millis();
while (millis() - start < timeout) { while (millis() - start < timeout) {
if (_serial_gps->available()) { if (_serial_gps->available()) {
response += (char)_serial_gps->read(); char c = _serial_gps->read();
if (response.endsWith(",") || response.endsWith("\r\n")) { // Add char to buffer if there's space
if (responseLen < sizeof(response) - 1) {
response[responseLen++] = c;
response[responseLen] = '\0';
}
if (c == ',' || (responseLen >= 2 && response[responseLen - 2] == '\r' && response[responseLen - 1] == '\n')) {
#ifdef GPS_DEBUG #ifdef GPS_DEBUG
LOG_DEBUG(response.c_str()); LOG_DEBUG(response);
#endif #endif
// check if we can see our chips // check if we can see our chips
for (const auto &chipInfo : responseMap) { for (const auto &chipInfo : responseMap) {
if (strstr(response.c_str(), chipInfo.detectionString.c_str()) != nullptr) { if (strstr(response, chipInfo.detectionString.c_str()) != nullptr) {
LOG_INFO("%s detected", chipInfo.chipName.c_str()); LOG_INFO("%s detected", chipInfo.chipName.c_str());
return chipInfo.driver; return chipInfo.driver;
} }
} }
} }
if (response.endsWith("\r\n")) { if (responseLen >= 2 && response[responseLen - 2] == '\r' && response[responseLen - 1] == '\n') {
response.trim(); // Reset the response buffer for the next potential message
response = ""; // Reset the response string for the next potential message responseLen = 0;
response[0] = '\0';
} }
} }
} }
#ifdef GPS_DEBUG #ifdef GPS_DEBUG
LOG_DEBUG(response.c_str()); LOG_DEBUG(response);
#endif #endif
return GNSS_MODEL_UNKNOWN; // Return empty string on timeout return GNSS_MODEL_UNKNOWN; // Return unknown on timeout
} }
GPS *GPS::createGps() GPS *GPS::createGps()