35 #define VANTAGE_RES 128
36 #define VANTAGE_TIMEOUT 2
38 static uint16_t crc_table[] =
40 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad,
41 0xe1ce, 0xf1ef, 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b, 0xa35a,
42 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,
43 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
44 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861,
45 0x2802, 0x3823, 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,
46 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87,
47 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
48 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,
49 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3,
50 0x5004, 0x4025, 0x7046, 0x6067, 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1, 0x1290,
51 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
52 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e,
53 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f,
54 0x99c8, 0x89e9, 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,
55 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
56 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83,
57 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,
58 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,
61 uint16_t
crc16(
const void *c_ptr,
size_t len)
63 const uint8_t *c = (uint8_t *)c_ptr;
67 crc = crc_table[((crc >> 8) ^ *c++)] ^ (crc << 8);
82 return (
const char *)
"Vantage";
90 addParameter(
"WEATHER_TEMPERATURE",
"Temperature (C)", -10, 30, 15);
91 addParameter(
"WEATHER_BAROMETER",
"Barometer (mbar)", 20, 32.5, 15);
92 addParameter(
"WEATHER_WIND_SPEED",
"Wind (kph)", 0, 20, 15);
93 addParameter(
"WEATHER_WIND_DIRECTION",
"Wind Direction", 0, 360, 15);
94 addParameter(
"WEATHER_HUMIDITY",
"Humidity %", 0, 100, 15);
95 addParameter(
"WEATHER_RAIN_RATE",
"Rain (mm/h)", 0, 0, 15);
96 addParameter(
"WEATHER_SOLAR_RADIATION",
"Solar Radiation (w/m^2)", 0, 10000, 15);
117 int nbytes_written = 0, nbytes_read = 0, rc = -1;
128 tcflush(
PortFD, TCIOFLUSH);
148 if (response[0] != 0x06)
150 LOGF_ERROR(
"Expecting 0x06, received %#X", response[0]);
161 uint16_t crc =
crc16(response, 99);
169 uint8_t *loopData = (uint8_t *)response;
173 uint8_t forecastValue = loopData[89];
175 LOGF_DEBUG(
"Raw Forecast (%d)", forecastValue);
177 switch (forecastValue)
181 LOG_INFO(
"Forecast: Mostly Clear.");
186 LOG_INFO(
"Forecast: Partly Cloudy.");
191 LOG_INFO(
"Forecast: Mostly Cloudy.");
196 LOG_INFO(
"Forecast: Mostly Cloudy. Rain within 12 hours.");
201 LOG_INFO(
"Forecast: Mostly Cloudy. Snow within 12 hours.");
206 LOG_INFO(
"Forecast: Mostly Cloudy. Rain or Snow within 12 hours.");
211 LOG_INFO(
"Forecast: Partly Cloudy. Rain within 12 hours.");
216 LOG_INFO(
"Forecast: Partly Cloudy. Snow within 12 hours.");
221 LOG_INFO(
"Forecast: Partly Cloudy. Rain or Snow within 12 hours.");
227 uint16_t temperatureValue = loopData[10] << 8 | loopData[9];
229 setParameterValue(
"WEATHER_TEMPERATURE", ((temperatureValue / 10.0) - 32) / 1.8);
231 LOGF_DEBUG(
"Raw Temperature (%d) [%#4X %#4X]", temperatureValue, loopData[9], loopData[10]);
234 uint8_t humidityValue = loopData[11];
238 LOGF_DEBUG(
"Raw Inside Humidity (%d) [%#X4]", humidityValue, loopData[11]);
241 uint16_t barometerValue = loopData[8] << 8 | loopData[7];
245 LOGF_DEBUG(
"Raw Barometer (%d) [%#4X %#4X]", barometerValue, loopData[7], loopData[8]);
248 uint8_t windValue = loopData[14];
250 LOGF_DEBUG(
"Raw Wind Speed (%d) [%#4X]", windValue, loopData[14]);
255 uint16_t windDir = loopData[17] << 8 | loopData[16];
257 LOGF_DEBUG(
"Raw Wind Direction (%d) [%#4X,%#4X]", windDir, loopData[16], loopData[17]);
262 uint16_t rainRate = loopData[42] << 8 | loopData[41];
264 LOGF_DEBUG(
"Raw Rain Rate (%d) [%#4X,%#4X]", rainRate, loopData[41], loopData[42]);
269 uint16_t solarRadiation = loopData[45] << 8 | loopData[44];
271 LOGF_DEBUG(
"Raw Solar Radiation (%d) [%#4X,%#4X]", solarRadiation, loopData[44], loopData[45]);
273 if (solarRadiation == 32767)
281 bool Vantage::wakeup()
283 int nbytes_written = 0, nbytes_read = 0, rc = -1;
288 tcflush(
PortFD, TCIOFLUSH);
292 for (
int i = 0; i < 3; i++)
307 if (nbytes_read == 2)
320 int nbytes_written = 0, nbytes_read = 0, rc = -1;
333 tcflush(
PortFD, TCIOFLUSH);
354 if (response[1] != 0xD)
356 LOGF_ERROR(
"Expecting 0xD, received %#X", response[1]);
367 response[nbytes_read - 2] = 0;
369 if (strcmp(response,
"OK") != 0)
382 response[nbytes_read - 2] = 0;
void setDefaultBaudRate(BaudRate newRate)
setDefaultBaudRate Set default baud rate. The default baud rate is 9600 unless otherwise changed by t...
void setVersion(uint16_t vMajor, uint16_t vMinor)
Set driver version information to be defined in DRIVER_INFO property as vMajor.vMinor.
void addDebugControl()
Add Debug control to the driver.
void setParameterValue(std::string name, double value)
setParameterValue Update weather parameter value
bool setCriticalParameter(std::string param)
setCriticalParameter Set parameter that is considered critical to the operation of the observatory....
void addParameter(std::string name, std::string label, double numMinOk, double numMaxOk, double percWarning)
addParameter Add a physical weather measurable parameter to the weather driver. The weather value has...
Connection::Serial * serialConnection
virtual bool initProperties() override
Initilize properties initial state and value. The child class must implement this function.
virtual const char * getDefaultName() override
virtual IPState updateWeather() override
updateWeather Update weather conditions from device or service. The function should not change the st...
virtual bool initProperties() override
Initilize properties initial state and value. The child class must implement this function.
virtual bool Handshake() override
perform handshake with device to check communication
int tty_read_section(int fd, char *buf, char stop_char, int timeout, int *nbytes_read)
read buffer from terminal with a delimiter
int tty_write(int fd, const char *buf, int nbytes, int *nbytes_written)
Writes a buffer to fd.
int tty_read(int fd, char *buf, int nbytes, int timeout, int *nbytes_read)
read buffer from terminal
void tty_error_msg(int err_code, char *err_msg, int err_msg_len)
Retrieve the tty error message.
Implementations for common driver routines.
#define LOGF_DEBUG(fmt,...)
#define LOG_ERROR(txt)
Shorter logging macros. In order to use these macros, the function (or method) "getDeviceName()" must...
#define LOGF_ERROR(fmt,...)
std::unique_ptr< Vantage > vantage(new Vantage())
uint16_t crc16(const void *c_ptr, size_t len)