27 #define MYDEWHEATERPRO_TIMEOUT 3
28 #define BOARD_FAN_TAB "Board Fan"
29 #define TEMPERATURE_OFFSETS_TAB "Temperature/Tracking Offsets"
30 #define LCD_DISPLAY_TAB "LCD Display"
42 DefaultDevice::initProperties();
45 OutputsNP[DEW_STRAP_ONE_POWER].
fill(
"CHANNEL1",
"Strap 1",
"%4.0f %%", 0., 100., 1., 0.);
46 OutputsNP[DEW_STRAP_TWO_POWER].
fill(
"CHANNEL2",
"Strap 2",
"%4.0f %%", 0., 100., 1., 0.);
47 OutputsNP[DEW_STRAP_THREE_POWER].
fill(
"CHANNEL3",
"Strap 3",
"%4.0f %%", 0., 100., 1., 0.);
50 FanSpeedNP[0].
fill(
"Fan Power",
"Fan Speed",
"%4.0f %%", 0., 100., 1., 0.);
53 FanModeSP[BOARD_TEMP].
fill(
"Board Temp",
"Board Temp Sensor",
ISS_OFF);
54 FanModeSP[MANUAL_FAN].
fill(
"Manual",
"Manual",
ISS_ON);
57 EEPROMSP[RESET_EEPROM].
fill(
"Reset EEPROM",
"Reset EEPROM to Defaults",
ISS_OFF);
58 EEPROMSP[SAVE_TO_EEPROM].
fill(
"Save to EEPROM",
"Save to EEPROM",
ISS_OFF);
61 FanTempTriggerNP[FANTEMPOFF].
fill(
"Board_Temp_Off",
"Board Fan Temp Off",
"%4.0f \u2103", 0., 100., 1., 0.);
62 FanTempTriggerNP[FANTEMPON].
fill(
"Board_Temp_On",
"Board Fan Temp On",
"%4.0f \u2103", 0., 100., 1., 0.);
65 LCDPageRefreshNP[0].
fill(
"Page Refresh Rate",
"Page Refresh Rate",
"%4.0f ms", 500., 5000., 500., 0.);
68 LCDDisplayTempUnitsSP[CELCIUS].
fill(
"Celsius",
"Celsius",
ISS_ON);
69 LCDDisplayTempUnitsSP[FAHRENHEIT].
fill(
"Fahrenheit",
"Fahrenheit",
ISS_OFF);
72 EnableLCDDisplaySP[DISABLE_LCD].
fill(
"Disabled",
"Disabled",
ISS_ON);
73 EnableLCDDisplaySP[ENABLE_LCD].
fill(
"Enabled",
"Enabled",
ISS_OFF);
79 CH1CH2BoostSP[CH1_BOOST_100].
fill(
"BOOST_CH1",
"Strap 1 Boost 100%",
ISS_OFF);
80 CH1CH2BoostSP[CH2_BOOST_100].
fill(
"BOOST_CH2",
"Strap 2 Boost 100%",
ISS_OFF);
83 CH3_ModeSP[DISABLED_STRAP].
fill(
"STRAP_DISABLED",
"Strap Disabled",
ISS_ON);
84 CH3_ModeSP[DEWSTRAP_ONE].
fill(
"SHADOW STRAP 1",
"Shadow Strap 1",
ISS_OFF);
85 CH3_ModeSP[DEWSTRAP_TWO].
fill(
"SHADOW STRAP 2",
"Shadow Strap 2",
ISS_OFF);
86 CH3_ModeSP[MANUAL_STRAP].
fill(
"Manual",
"Manual",
ISS_OFF);
87 CH3_ModeSP[TEMP_PROBE_THREE].
fill(
"TEMP_PROBE",
"Temp Probe",
ISS_OFF);
90 CH3_Manual_PowerNP[0].
fill(
"MANUAL_POWER",
"Strap 3 Manual Power",
"%4.0f %%", 0., 100., 1., 0.);
96 TemperaturesNP[PROBE_1].
fill(
"CHANNEL1",
"Strap 1",
"%3.2f \u2103", -50., 70., 0., 0.);
97 TemperaturesNP[PROBE_2].
fill(
"CHANNEL2",
"Strap 2",
"%3.2f \u2103", -50., 70., 0., 0.);
98 TemperaturesNP[PROBE_3].
fill(
"CHANNEL3",
"Strap 3",
"%3.2f \u2103", -50., 70., 0., 0.);
99 TemperaturesNP[AMBIENT_PROBE].
fill(
"AMBIENT",
"Ambient",
"%3.2f \u2103", -50., 70., 0., 0.);
100 TemperaturesNP[BOARD_PROBE].
fill(
"BOARD Temp",
"Board",
"%3.2f \u2103", -50., 100., 0., 0.);
104 HumidityNP[0].
fill(
"HUMIDITY",
"Humidity",
"%3.2f %%", 0., 100., 0., 0.);
108 DewpointNP[0].
fill(
"DEWPOINT",
"Dew point",
"%3.2f \u2103", -50., 70., 0., 0.);
112 TemperatureOffsetsNP[TEMP_PROBE_ONE_OFFSET].
fill(
"CHANNEL1",
"Strap 1",
"%1.0f \u2103", -10., 10., 1., 0.);
113 TemperatureOffsetsNP[TEMP_PROBE_TWO_OFFSET].
fill(
"CHANNEL2",
"Strap 2",
"%1.0f \u2103", -10., 10., 1., 0.);
114 TemperatureOffsetsNP[TEMP_PROBE_THREE_OFFSET].
fill(
"CHANNEL3",
"Strap 3",
"%1.0f \u2103", -10., 10., 1., 0.);
115 TemperatureOffsetsNP[AMBIENT_TEMP_PROBE_OFFSET].
fill(
"AMBIENT",
"Ambient",
"%4.0f \u2103", -4, 3, 1, 0);
118 ZeroTempOffsetsSP[0].
fill(
"Zero_Temp",
"Zero Temperature Offsets",
ISS_OFF);
123 TrackingModeSP[AMBIENT].
fill(
"AMBIENT",
"Ambient",
ISS_OFF);
124 TrackingModeSP[DEWPOINT].
fill(
"DEWPOINT",
"Dew Point",
ISS_ON);
125 TrackingModeSP[MIDPOINT].
fill(
"MIDPOINT",
"Mid Point",
ISS_OFF);
128 TrackingModeOffsetNP[0].
fill(
"Offset",
"Offset",
"%4.0f \u2103", -4, 3, 1, 0);
131 FWVersionNP[0].
fill(
"FIRMWARE",
"Firmware Version",
"%4.0f", 0., 65535., 1., 0.);
156 bool myDewControllerPro::cancelOutputBoost()
170 DefaultDevice::updateProperties();
198 if (!readMainValues()) {
199 LOG_INFO(
"Reading Main Values Error");
201 if (!readLCDDisplayValues()) {
202 LOG_INFO(
"Reading LCD Display Values Error");
204 if (!readBoardFanValues()) {
205 LOG_INFO(
"Reading Board Fan Values Error");
207 if (!readOffsetValues()) {
208 LOG_INFO(
"Reading Offset Values Error");
210 LOG_INFO(
"myDewControllerPro parameters updated, device ready for use.");
241 return "myDewContollerPro";
244 bool myDewControllerPro::sendCommand(
const char *
cmd,
char *resp)
246 int nbytes_written = 0, nbytes_read = 0, rc = -1;
250 tcflush(PortFD, TCIOFLUSH);
263 LOGF_ERROR(
"Error reading response for command %s: %s.",
cmd, errstr);
272 bool myDewControllerPro::Handshake()
281 LOG_INFO(
"myDewControllerPro is online. Getting device parameters...");
284 LOG_INFO(
"Error retrieving data from myDewControllerPro, trying resync...");
293 bool myDewControllerPro::Ack()
296 tcflush(PortFD, TCIOFLUSH);
303 snprintf(resp, 40,
"Firmware Version: %d", firmware);
308 LOGF_ERROR(
"myDewControllerPro not properly identified! Answer was: %s.", resp);
311 if (firmware < 340) {
312 LOG_INFO(
"Please update myDewControllerPro firmware");
313 LOG_INFO(
"https://sourceforge.net/projects/arduinonanodewcontrollerpro/files/myDewControllerPro%20v300%203channel/CODE%20ARDUINO/");
316 int numberProbes = 0;
319 sscanf(resp,
"g%u$", &numberProbes);
320 snprintf(resp, 40,
"The number of Temperature Probes are: %d", numberProbes);
322 if (numberProbes < 1) {
323 LOG_INFO(
"Warning no temperature probes detected");
326 FWVersionNP[0].setValue(firmware);
334 bool myDewControllerPro::setOutputBoost(
unsigned int channel)
341 }
else if (channel == 1) {
350 bool myDewControllerPro::setInt(
int mode,
const char *mask,
const char *errMessage)
355 if (!sendCommand(
cmd,
nullptr)) {
364 bool myDewControllerPro::setChoice(
int testInt,
const char *positiveChoice,
const char *negativeChoice,
const char *errMessage)
366 const char* mask = testInt == 1 ? positiveChoice : negativeChoice;
367 if (!sendCommand(mask,
nullptr)) {
377 bool myDewControllerPro::setTempCalibrations(
float ch1,
float ch2,
float ch3,
int ambient)
383 if (!sendCommand(
cmd,
nullptr)) {
384 LOG_INFO(
"Failed to set CH1 offset");
389 if (!sendCommand(
cmd,
nullptr)) {
390 LOG_INFO(
"Failed to set CH2 offset");
395 if (!sendCommand(
cmd,
nullptr)) {
396 LOG_INFO(
"Failed to set CH3 offset");
402 if (!sendCommand(
cmd,
nullptr)) {
403 LOG_INFO(
"Failed to set CH3 offset");
413 bool myDewControllerPro::setFanTempTrigger(
int tempOn,
int tempOff)
419 if (!sendCommand(
cmd,
nullptr)) {
425 if (!sendCommand(
cmd,
nullptr)) {
426 LOG_INFO(
"Failed to set CH2 offset");
437 bool myDewControllerPro::zeroTempCalibrations() {
440 LOG_INFO(
"Failed to zero temp offset");
444 if (!sendCommand(
"e0#",
nullptr)) {
445 LOG_INFO(
"Failed to zero ambtemp offset");
468 CH1CH2BoostSP.
update( states, names, n);
471 if (CH1CH2BoostSP[CH1_BOOST_100].getState() ==
ISS_ON) {
472 setOutputBoost(CH1_BOOST_100);
474 if (CH1CH2BoostSP[CH2_BOOST_100].getState() ==
ISS_ON) {
475 setOutputBoost(CH2_BOOST_100);
478 CH1CH2BoostSP.
apply();
486 CH3_ModeSP.
update(states, names, n);
499 ZeroTempOffsetsSP.
update(states, names, n);
501 zeroTempCalibrations();
504 ZeroTempOffsetsSP.
apply();
511 TrackingModeSP.
update(states, names, n);
516 TrackingModeSP.
apply();
523 FanModeSP.
update(states, names, n);
529 readBoardFanValues();
535 EnableLCDDisplaySP.
update(states, names, n);
540 EnableLCDDisplaySP.
apply();
541 readLCDDisplayValues();
548 LCDDisplayTempUnitsSP.
update(states, names, n);
553 LCDDisplayTempUnitsSP.
apply();
554 readLCDDisplayValues();
561 EEPROMSP.
update(states, names, n);
566 const char* message = mode == 1 ?
"Saved to EEPPROM Successfully" :
"Reset EEPROM to Default";
571 readBoardFanValues();
572 readLCDDisplayValues();
589 CH3_Manual_PowerNP.
update(values, names, n);
591 int power = CH3_Manual_PowerNP[0].getValue();
594 CH3_Manual_PowerNP.
apply();
596 LOG_INFO(
"Power can only be manually adjusted in Strap 3 manual mode");
604 TemperatureOffsetsNP.
update(values, names, n);
606 int ch1 = TemperatureOffsetsNP[TEMP_PROBE_ONE_OFFSET].getValue();
607 int ch2 = TemperatureOffsetsNP[TEMP_PROBE_TWO_OFFSET].getValue();
608 int ch3 = TemperatureOffsetsNP[TEMP_PROBE_THREE_OFFSET].getValue();
609 int ambient = TemperatureOffsetsNP[AMBIENT_TEMP_PROBE_OFFSET].getValue();
610 setTempCalibrations(ch1, ch2, ch3, ambient);
612 TemperatureOffsetsNP.
apply();
620 TrackingModeOffsetNP.
update(values, names, n);
622 int offset = TrackingModeOffsetNP[0].getValue();
625 TrackingModeOffsetNP.
apply();
632 FanTempTriggerNP.
update(values, names, n);
634 int tempOn = FanTempTriggerNP[FANTEMPON].getValue();
635 int tempOff = FanTempTriggerNP[FANTEMPOFF].getValue();
636 setFanTempTrigger(tempOn, tempOff);
638 FanTempTriggerNP.
apply();
639 readBoardFanValues();
645 FanSpeedNP.
update(values, names, n);
647 int speed = FanSpeedNP[0].getValue();
651 readBoardFanValues();
657 LCDPageRefreshNP.
update(values, names, n);
659 int time = LCDPageRefreshNP[0].getValue();
662 LCDPageRefreshNP.
apply();
663 readLCDDisplayValues();
671 bool myDewControllerPro::readMainValues()
675 float temp1, temp2, temp3, temp_ambient, dewpoint, humidity;
684 TemperaturesNP[PROBE_1].setValue(temp1);
685 TemperaturesNP[PROBE_2].setValue(temp2);
686 TemperaturesNP[PROBE_3].setValue(temp3);
688 TemperaturesNP.
apply();
697 TemperaturesNP[AMBIENT_PROBE].setValue(temp_ambient);
699 TemperaturesNP.
apply();
708 TemperaturesNP[BOARD_PROBE].setValue(temp_ambient);
710 TemperaturesNP.
apply();
720 HumidityNP[0].setValue(humidity);
733 DewpointNP[0].setValue(dewpoint);
738 int power1, power2, power3;
746 OutputsNP[DEW_STRAP_ONE_POWER].setValue(power1);
747 OutputsNP[DEW_STRAP_TWO_POWER].setValue(power2);
748 OutputsNP[DEW_STRAP_THREE_POWER].setValue(power3);
751 CH3_Manual_PowerNP[0].setValue(power3);
752 CH3_Manual_PowerNP.
apply();
779 if (sscanf(resp,
"F%d$", &fanSpeed) == 1) {
780 FanSpeedNP[0].setValue(fanSpeed);
788 bool myDewControllerPro::readOffsetValues()
791 float temp1, temp2, temp3;
800 TemperatureOffsetsNP[TEMP_PROBE_ONE_OFFSET].setValue(temp1);
801 TemperatureOffsetsNP[TEMP_PROBE_TWO_OFFSET].setValue(temp2);
802 TemperatureOffsetsNP[TEMP_PROBE_THREE_OFFSET].setValue(temp3);
804 TemperatureOffsetsNP.
apply();
813 TemperatureOffsetsNP[AMBIENT_TEMP_PROBE_OFFSET].setValue(atBias);
815 TemperatureOffsetsNP.
apply();
824 TrackingModeSP.
reset();
827 TrackingModeSP.
apply();
836 if (sscanf(resp,
"y%d$", &toffset) == 1) {
837 TrackingModeOffsetNP[0].setValue(toffset);
839 TrackingModeOffsetNP.
apply();
845 bool myDewControllerPro::readBoardFanValues()
855 if (sscanf(resp,
"F%d$", &fanSpeed) == 1) {
856 FanSpeedNP[0].setValue(fanSpeed);
881 FanTempTriggerNP[FANTEMPON].setValue(fanTemp);
883 FanTempTriggerNP.
apply();
892 FanTempTriggerNP[FANTEMPOFF].setValue(fanTemp);
894 FanTempTriggerNP.
apply();
900 bool myDewControllerPro::readLCDDisplayValues()
910 LCDPageRefreshNP[0].setValue(value);
912 LCDPageRefreshNP.
apply();
921 EnableLCDDisplaySP.
reset();
924 EnableLCDDisplaySP.
apply();
933 LCDDisplayTempUnitsSP.
reset();
936 LCDDisplayTempUnitsSP.
apply();
void registerHandshake(std::function< bool()> callback)
registerHandshake Register a handshake function to be called once the intial connection to the device...
The Serial class manages connection with serial devices including Bluetooth. Serial communication is ...
void setDefaultBaudRate(BaudRate newRate)
setDefaultBaudRate Set default baud rate. The default baud rate is 9600 unless otherwise changed by t...
const char * getDeviceName() const
void addPollPeriodControl()
Add Polling period control to the driver.
void addConfigurationControl()
Add Configuration control to the driver.
virtual bool ISNewSwitch(const char *dev, const char *name, ISState *states, char *names[], int n)
Process the client newSwitch command.
void registerConnection(Connection::Interface *newConnection)
registerConnection Add new connection plugin to the existing connection pool. The connection type sha...
void setDefaultPollingPeriod(uint32_t msec)
setDefaultPollingPeriod Change the default polling period to call TimerHit() function in the driver.
void setVersion(uint16_t vMajor, uint16_t vMinor)
Set driver version information to be defined in DRIVER_INFO property as vMajor.vMinor.
virtual bool loadConfig(bool silent=false, const char *property=nullptr)
Load the last saved configuration file.
virtual bool deleteProperty(const char *propertyName)
Delete a property and unregister it. It will also be deleted from all clients.
void defineProperty(INumberVectorProperty *property)
uint32_t getCurrentPollingPeriod() const
getCurrentPollingPeriod Return the current polling period.
virtual bool ISNewNumber(const char *dev, const char *name, double values[], char *names[], int n)
Process the client newNumber command.
void setDriverInterface(uint16_t value)
setInterface Set driver interface. By default the driver interface is set to GENERAL_DEVICE....
int SetTimer(uint32_t ms)
Set a timer to call the function TimerHit after ms milliseconds.
void addDebugControl()
Add Debug control to the driver.
void setState(IPState state)
void apply(const char *format,...) const ATTRIBUTE_FORMAT_PRINTF(2
bool isNameMatch(const char *otherName) const
bool update(const double values[], const char *const names[], int n)
void fill(const char *device, const char *name, const char *label, const char *group, IPerm permission, double timeout, IPState state)
bool update(const ISState states[], const char *const names[], int n)
int findOnSwitchIndex() const
void fill(const char *device, const char *name, const char *label, const char *group, IPerm permission, ISRule rule, double timeout, IPState state)
virtual bool updateProperties() override
updateProperties is called whenever there is a change in the CONNECTION status of the driver....
virtual const char * getDefaultName() override
virtual bool ISNewSwitch(const char *dev, const char *name, ISState *states, char *names[], int n) override
Process the client newSwitch command.
virtual void TimerHit() override
Callback function to be called once SetTimer duration elapses.
virtual bool ISNewNumber(const char *dev, const char *name, double values[], char *names[], int n) override
Process the client newNumber command.
virtual bool initProperties() override
Initilize properties initial state and value. The child class must implement this function.
const char * MAIN_CONTROL_TAB
MAIN_CONTROL_TAB Where all the primary controls for the device are located.
const char * OPTIONS_TAB
OPTIONS_TAB Where all the driver's options are located. Those may include auxiliary controls,...
int tty_write(int fd, const char *buf, int nbytes, int *nbytes_written)
Writes a buffer to fd.
void tty_error_msg(int err_code, char *err_msg, int err_msg_len)
Retrieve the tty error message.
int tty_nread_section(int fd, char *buf, int nsize, char stop_char, int timeout, int *nbytes_read)
read buffer from terminal with a delimiter
Implementations for common driver routines.
#define LOGF_DEBUG(fmt,...)
#define LOGF_ERROR(fmt,...)
#define MYDEWHEATERPRO_TIMEOUT
std::unique_ptr< myDewControllerPro > mydewcontrollerpro(new myDewControllerPro())
#define TEMPERATURE_OFFSETS_TAB
#define MDCP_GET_TEMP_DISPLAY_RESPONSE
#define MDCP_GET_PROBE_TEMPS
#define MDCP_GET_AMB_TEMP_OFFSET
#define MDCP_GET_FAN_ON_TEMP_RESPONSE
#define MDCP_SET_TRACKING_MODE
#define MDCP_SET_TRACKING_MODE_OFFSET
#define MDCP_SAVE_TO_EEPROM
#define MDCP_GET_TRACKING_MODE
#define MDCP_GET_CH3_SETTINGS_RESPONSE
#define MDCP_GET_TRACKING_MODE_OFFSET
#define MDCP_GET_BOARD_TEMP_RESPONSE
#define MDCP_GET_CHANNEL_POWER_RESPONSE
#define MDCP_GET_FAN_OFF_TEMP_RESPONSE
#define MDCP_GET_AMB_TEMP
#define MDCP_GET_FAN_OFF_TEMP
#define MDCP_CLEAR_TEMP_OFFSETS
#define MDCP_GET_TEMP_DISPLAY
#define MDCP_GET_REL_HUMIDITY_REPSONSE
#define MDCP_GET_REL_HUMIDITY
#define MDCP_GET_TEMP_OFFSETS
#define MDCP_GET_FAN_MODE_RESPONSE
#define MDCP_CANCEL_BOOST
#define MDCP_GET_NUMBER_OF_PROBES
#define MDCP_LCD_DISPLAY_CELSIUS
#define MDCP_SET_LCD_DISPLAY_TIME
#define MDCP_LCD_DISPLAY_FAHRENHEIT
#define MDCP_SET_CH3_SETTINGS
#define MDCP_GET_LCD_STATE
#define MDCP_SET_CH3_MANUAL_POWER
#define MDCP_GET_FAN_SPEED
#define MDCP_GET_AMB_TEMP_REPSONSE
#define MDCP_GET_DEW_POINT_RESPONSE
#define MDCP_GET_AMB_TEMP_OFFSET_RESPONSE
#define MDCP_SET_TEMP_CH1_OFFSET
#define MDCP_IDENTIFY_RESPONSE
#define MDCP_GET_LCD_DISPLAY_TIME
#define MDCP_SET_FAN_SPEED
#define MDCP_SET_TEMP_CH2_OFFSET
#define MDCP_GET_CHANNEL_POWER
#define MDCP_GET_LCD_STATE_RESPONSE
#define MDCP_GET_FAN_ON_TEMP
#define MDCP_GET_FAN_MODE
#define MDCP_GET_TEMP_RESPONSE
#define MDCP_SET_FAN_MODE
#define MDCP_GET_LCD_DISPLAY_TIME_RESPONSE
#define MDCP_GET_BOARD_TEMP
#define MDCP_GET_TRACKING_MODE_RESPONSE
#define MDCP_SET_FAN_ON_TEMP
#define MDCP_GET_CH3_SETTINGS
#define MDCP_GET_DEW_POINT
#define MDCP_SET_TEMP_CH3_OFFSET
#define MDCP_SET_FAN_OFF_TEMP
#define MDCP_RESET_EEPROM_TO_DEFAULT
#define MDCP_GET_TEMP_OFFSETS_RESPONSE
#define MDCP_SET_AMB_TEMP_OFFSET
@ value
the parser finished reading a JSON value