void wh1080GetReadings (WVIEWD_WORK *work) { WH1080_IF_DATA* ifWorkData = (WH1080_IF_DATA*)work->stationData; if (readStationData(work) == OK) { // populate the LOOP structure: ifWorkData->wh1080Readings = wh1080Work.sensorData; storeLoopPkt (work, &work->loopPkt, &ifWorkData->wh1080Readings); // indicate the LOOP packet is done radProcessEventsSend (NULL, STATION_LOOP_COMPLETE_EVENT, 0); } }
void wmr918ReadData (WVIEWD_WORK *work) { // process received packets: readStationData (work); }
int wmr918Init (WVIEWD_WORK *work) { WMR918_IF_DATA* ifWorkData = (WMR918_IF_DATA*)work->stationData; fd_set rfds; struct timeval tv; int i, length, retVal; time_t nowTime = time(NULL) - (WV_SECONDS_IN_HOUR/(60/WMR918_RAIN_RATE_PERIOD)); ARCHIVE_PKT recordStore; char outString[128]; memset (&wmr918Work, 0, sizeof(wmr918Work)); // Create the rain accumulator (WMR918_RAIN_RATE_PERIOD minute age) // so we can compute rain rate: ifWorkData->rainRateAccumulator = sensorAccumInit(WMR918_RAIN_RATE_PERIOD); // Populate the accumulator with the last WMR918_RAIN_RATE_PERIOD minutes: while ((nowTime = dbsqliteArchiveGetNextRecord(nowTime, &recordStore)) != ERROR) { sensorAccumAddSample(ifWorkData->rainRateAccumulator, recordStore.dateTime, recordStore.value[DATA_INDEX_rain]); } radMsgLog (PRI_MEDIUM, "wmr918Init: waiting for first sensor packets (this may take some time):"); while ((wmr918Work.dataRXMask != WMR918_SENSOR_ALL) && (! work->exiting)) { // Log what we are waiting for: length = 0; for (i = 0; i < 4; i ++) { if (! (wmr918Work.dataRXMask & (1 << i))) { length += sprintf(&outString[length], "%s ", WMRSensorNames[i]); } } radMsgLog (PRI_MEDIUM, "wmr918Init: waiting for sensors: %s", outString); tv.tv_sec = 2; tv.tv_usec = 0; FD_ZERO(&rfds); FD_SET(work->medium.fd, &rfds); if (select (work->medium.fd + 1, &rfds, NULL, NULL, &tv) > 0) { retVal = readStationData (work); switch (retVal) { case WMR918GROUP0: radMsgLog (PRI_MEDIUM, "received WIND packet..."); break; case WMR918GROUP1: radMsgLog (PRI_MEDIUM, "received RAIN packet..."); break; case WMR918GROUP2: radMsgLog (PRI_MEDIUM, "received EXTRA TEMP packet..."); break; case WMR918GROUP3: radMsgLog (PRI_MEDIUM, "received OUT TEMP packet..."); break; case WMR918GROUP4: radMsgLog (PRI_MEDIUM, "received POOL TEMP packet..."); break; case WMR918GROUP5: case WMR918GROUP6: radMsgLog (PRI_MEDIUM, "received IN TEMP packet..."); break; default: break; } } } if (! work->exiting) { radMsgLog (PRI_MEDIUM, "wmr918Init: first sensor packets received."); } // populate the LOOP structure: ifWorkData->wmr918Readings = wmr918Work.sensorData; storeLoopPkt (work, &work->loopPkt, &ifWorkData->wmr918Readings); // we must indicate successful completion here - // even though we are synchronous, the daemon wants to see this event radProcessEventsSend (NULL, STATION_INIT_COMPLETE_EVENT, 0); return OK; }
int wh1080Init (WVIEWD_WORK *work) { WH1080_IF_DATA* ifWorkData = (WH1080_IF_DATA*)work->stationData; fd_set rfds; struct timeval tv; int ret; time_t nowTime = time(NULL) - (WV_SECONDS_IN_HOUR/(60/WH1080_RAIN_RATE_PERIOD)); ARCHIVE_PKT recordStore; unsigned char controlBlock[WH1080_BUFFER_CHUNK]; memset (&wh1080Work, 0, sizeof(wh1080Work)); // Create the rain accumulator (WH1080_RAIN_RATE_PERIOD minute age) // so we can compute rain rate: ifWorkData->rainRateAccumulator = sensorAccumInit(WH1080_RAIN_RATE_PERIOD); // Populate the accumulator with the last WH1080_RAIN_RATE_PERIOD minutes: while ((nowTime = dbsqliteArchiveGetNextRecord(nowTime, &recordStore)) != ERROR) { sensorAccumAddSample(ifWorkData->rainRateAccumulator, recordStore.dateTime, recordStore.value[DATA_INDEX_rain]); } if ((*(work->medium.usbhidInit))(&work->medium) != OK) { return ERROR; } // Set the station to log data once per minute: while ((!work->exiting) && (readFixedBlock(work, controlBlock) != OK)) { radMsgLog (PRI_HIGH, "WH1080: Initial fixed block read failed"); (*(work->medium.usbhidExit))(&work->medium); radUtilsSleep(5000); (*(work->medium.usbhidInit))(&work->medium); radMsgLog (PRI_HIGH, "WH1080: Retrying initial fixed block read"); } // For some reason the WH1080 wants the IF closed between a read and a write: (*(work->medium.usbhidExit))(&work->medium); if (work->exiting) { return ERROR; } controlBlock[WH1080_SAMPLING_INTERVAL] = 1; (*(work->medium.usbhidInit))(&work->medium); if (writeFixedBlock(work, controlBlock) == ERROR) { (*(work->medium.usbhidExit))(&work->medium); return ERROR; } radUtilsSleep(2000); (*(work->medium.usbhidExit))(&work->medium); radUtilsSleep(1000); wh1080Work.lastRecord = -1; // populate the LOOP structure: radMsgLog (PRI_HIGH, "Waiting for the next weather record to be ready " "in the console to populate initial wview sensor readings " "(this could take some time);"); radMsgLog (PRI_HIGH, "While waiting be sure you are receiving all sensors on the console;"); radMsgLog (PRI_HIGH, "if not, you may need to relocate the sensors or the console."); while ((!work->exiting) && (readStationData(work) != OK)) { radUtilsSleep(1000); } if (work->exiting) { return ERROR; } ifWorkData->wh1080Readings = wh1080Work.sensorData; storeLoopPkt (work, &work->loopPkt, &ifWorkData->wh1080Readings); // we must indicate successful completion here - // even though we are synchronous, the daemon wants to see this event: radProcessEventsSend (NULL, STATION_INIT_COMPLETE_EVENT, 0); return OK; }