diff --git a/src/libMeter/Fluke8842.cpp b/src/libMeter/Fluke8842.cpp index 87e01222d93edd29feb34b3ebad250511442c041..dfdf6fb71a169477fb2a639823e3a604a14bfacf 100644 --- a/src/libMeter/Fluke8842.cpp +++ b/src/libMeter/Fluke8842.cpp @@ -12,7 +12,8 @@ bool Fluke8842::ping(unsigned dev) { std::string result = ""; if (dev == 0) { logger(logDEBUG) << "ping the multimeter....."; - result = this->sendreceive("G8\r\n"); + result = this->sendreceive("G7"); + logger(logDEBUG) << "last error message in buffer :" << result; } else { throw std::runtime_error("Other channels not implemented! "); } @@ -21,6 +22,17 @@ bool Fluke8842::ping(unsigned dev) { std::string Fluke8842::identify() { std::string idn = this->sendreceive("G8"); + + if (idn == "+1.0071E+21") { + // The version of this model at LBNL does not respond to the G8 command, + // hence hardcode model here + logger(logINFO) << "In your specific model of meter, G8 command " + "does not work, by-passing it"; + // reset PS otherwise it gets stuck + this->reset(); + idn = "FLUKE,8842A"; + } + return idn; } @@ -131,34 +143,40 @@ void Fluke8842::SetMode(enum FlukeMode mode) { } void Fluke8842::checkCompatibilityList() { - // get model connected to the meter - // std::string idn = this->identify(); - std::string idn = "FLUKE,8842A,0,V4.0 CR LF"; + std::string idn = identify(); + // get list of models std::vector<std::string> models = IMeter::getListOfModels(); - logger(logWARNING) << "Get meter identification command not working. " - "Bypassing identification check."; if (models.empty()) { - logger(logINFO) << "No model identifier implemented for this meter. No " - "check is performed."; + logger(logINFO) << "No model identifier implemented for this meter. " + "No check is performed."; return; } - std::size_t pos = m_name.find("Fluke"); - std::string brand = m_name.substr(pos, pos + 5); - std::string type = m_name.substr(pos + 5, pos + 9); + std::string idn_lower = idn; + std::transform(idn_lower.begin(), idn_lower.end(), idn_lower.begin(), + [](unsigned char c) { return std::tolower(c); }); - for (int i = 0; i < brand.length(); i++) { - brand[i] = toupper(brand[i]); + std::size_t pos = idn_lower.find("fluke"); + if (pos == std::string::npos) { + logger(logERROR) << "Not a fluke meter: " << idn; + throw std::runtime_error("Not a fluke meter: " + idn); } + std::string brand = idn_lower.substr(pos, 5); + std::string type = idn_lower.substr(pos + 6, 4); for (const std::string& model : models) { - if (idn.find(brand) != std::string::npos && - idn.find(type) != std::string::npos) + std::string model_lower = model; + std::transform(model_lower.begin(), model_lower.end(), + model_lower.begin(), + [](unsigned char c) { return std::tolower(c); }); + + if (model_lower.find(brand) != std::string::npos && + model_lower.find(type) != std::string::npos) return; } - logger(logERROR) << "Unknown meter: " << idn; + logger(logERROR) << "Unknown meter: " << idn; throw std::runtime_error("Unknown meter: " + idn); -} \ No newline at end of file +}