|
|
#include "hmp110.hpp"
#include "stm32basic/modbus/modbus_block_host.hpp"
using namespace iflytop;
#define TAG "HMP110"
void HMP110::init(ModbusBlockHost* modbusBlockHost) { m_modbusBlockHost = modbusBlockHost; m_id = 240;
m_cache_lock.init(); m_chlock.init(); }
bool HMP110::readReg03(uint8_t slaveAddr, uint16_t regAddr, uint16_t* regVal, int overtimems) { //
zlock_guard lck(m_chlock); // ZLOGI(TAG, "=============== readReg03 %d %d", slaveAddr, regAddr);
bool ret = m_modbusBlockHost->readReg03(slaveAddr, regAddr, regVal, overtimems); // ZLOGI(TAG, "=============== END%d", ret);
return ret; } bool HMP110::readReg03Muti(uint8_t slaveAddr, uint16_t regAddr, uint16_t* regVal, int regNum, int overtimems) { //
zlock_guard lck(m_chlock); // ZLOGI(TAG, "=============== readReg03Muti %d %d %d", slaveAddr, regAddr, regNum);
bool ret = m_modbusBlockHost->readReg03Muti(slaveAddr, regAddr, regVal, regNum, overtimems); // ZLOGI(TAG, "=============== END%d", ret);
return ret; } bool HMP110::ping(int id) { int16_t val = 0; return readReg03(id, 0x1F00, (uint16_t*)&val, 300); }
void HMP110::setid(int32_t id) { m_id = id; }
void HMP110::read_calibration_date(int32_t* year, int32_t* month, int32_t* day) { // TODO
*year = 1; *month = 2; *day = 3; } int32_t HMP110::read_errorcode() { int16_t val = 0; bool suc = readReg03(m_id, 0x0200, (uint16_t*)&val, 300); if (!suc) { return -1; }
if (val == 1) { return 0; } uint16_t ecodebuf[2]; suc = readReg03Muti(m_id, 0x0203, ecodebuf, 2, 300);
uint32_t ecode = ecodebuf[0] | (((uint32_t)ecodebuf[1]) << 16); return ecode; }
bool HMP110::read_reg(int32_t add, uint16_t* val, size_t len) { // ZLOGI(TAG, "read_reg %x %d", add, len);
bool suc = readReg03Muti(m_id, add, val, len, 300); // if (suc)
// for (size_t i = 0; i < len; i++) {
// ZLOGI(TAG, "val[%d] = %d", i, val[i]);
// }
// else
// ZLOGE(TAG, "read_reg failed");
return suc; }
bool HMP110::read_sensor_data(hmp110_sensordata_t* sensordata) { uint16_t buf[7]; bool suc = readReg03Muti(m_id, 0x0100, buf, 7, 300); if (!suc) { return false; }
sensordata->rh = buf[0]; sensordata->temp = buf[1]; sensordata->df_ptemp = buf[2]; sensordata->ah = buf[3]; sensordata->mr = buf[4]; sensordata->wet_bulb_temp = buf[5]; sensordata->enthalpy = buf[6]; return true; }
void HMP110::updateSensorDataAndErrorcode() { bool suc = read_sensor_data(&m_rdbuf); osDelay(100); int32_t errorcode = read_errorcode(); if (errorcode != 0) { ZLOGE(TAG, "errorcode: %d", errorcode); } if (!suc) { ZLOGE(TAG, "read_sensor_data failed"); errorcode = -1; }
{ zlock_guard lck(m_cache_lock); m_cachedata = m_rdbuf; m_cache_errorcode = errorcode; } }
int32_t HMP110::read_cache_errorcode() { zlock_guard lck(m_cache_lock); return m_cache_errorcode; } bool HMP110::read_cache_sensor_data(hmp110_sensordata_t* sensordata) { zlock_guard lck(m_cache_lock); *sensordata = m_cachedata; return true; }
|