float wvutilsGetWindSpeed(float mph) { float RetVal = -1; switch (WVU_WindUnits) { case HTML_WINDUNITS_MPH: RetVal = mph; break; case HTML_WINDUNITS_MS: RetVal = wvutilsConvertMPHToMPS(mph); break; case HTML_WINDUNITS_KNOTS: RetVal = wvutilsConvertMPHToKnots(mph); break; case HTML_WINDUNITS_KMH: RetVal = wvutilsConvertMPHToKPH(mph); break; } return RetVal; }
static void processAlarms (LOOP_PKT *loopData) { WVIEW_ALARM *alarm; float tempFloat; // process the local alarms: for (alarm = (WVIEW_ALARM *) radListGetFirst (&alarmsWork.alarmList); alarm != NULL; alarm = (WVIEW_ALARM *) radListGetNext (&alarmsWork.alarmList, (NODE_PTR)alarm)) { // first check to see if we are in abatement if (alarm->triggered) { if ((radTimeGetSECSinceEpoch () - alarm->abateStart) < alarm->abateSecs) { // abatement - go to the next alarm continue; } else { // clear trigger for future alarms alarm->triggered = FALSE; } } // switch on alarm type switch (alarm->type) { case Barometer: if (alarmsWork.isMetric) { tempFloat = wvutilsConvertINHGToHPA(loopData->barometer); } else { tempFloat = loopData->barometer; } break; case InsideTemp: if (alarmsWork.isMetric) { tempFloat = wvutilsConvertFToC(loopData->inTemp); } else { tempFloat = loopData->inTemp; } break; case InsideHumidity: tempFloat = (float)loopData->inHumidity; break; case OutsideTemp: if (alarmsWork.isMetric) { tempFloat = wvutilsConvertFToC(loopData->outTemp); } else { tempFloat = loopData->outTemp; } break; case WindSpeed: if (alarmsWork.isMetric) { tempFloat = wvutilsConvertMPHToKPH((float)loopData->windSpeed); } else { tempFloat = (float)loopData->windSpeed; } break; case TenMinuteAvgWindSpeed: if (alarmsWork.isMetric) { tempFloat = wvutilsConvertMPHToKPH((float)loopData->tenMinuteAvgWindSpeed); } else { tempFloat = (float)loopData->tenMinuteAvgWindSpeed; } break; case WindDirection: tempFloat = (float)loopData->windDir; break; case OutsideHumidity: tempFloat = (float)loopData->outHumidity; break; case RainRate: if (alarmsWork.isMetric) { tempFloat = wvutilsConvertRainINToMetric(loopData->rainRate); } else { tempFloat = loopData->rainRate; } break; case StormRain: if (alarmsWork.isMetric) { tempFloat = wvutilsConvertRainINToMetric(loopData->stormRain); } else { tempFloat = loopData->stormRain; } break; case DayRain: if (alarmsWork.isMetric) { tempFloat = wvutilsConvertRainINToMetric(loopData->dayRain); } else { tempFloat = loopData->dayRain; } break; case MonthRain: if (alarmsWork.isMetric) { tempFloat = wvutilsConvertRainINToMetric(loopData->monthRain); } else { tempFloat = loopData->monthRain; } break; case YearRain: if (alarmsWork.isMetric) { tempFloat = wvutilsConvertRainINToMetric(loopData->yearRain); } else { tempFloat = loopData->yearRain; } break; case TxBatteryStatus: tempFloat = (float)loopData->txBatteryStatus; break; case ConsoleBatteryVoltage: tempFloat = (((float)loopData->consBatteryVoltage * 300)/512)/100; break; case DewPoint: if (alarmsWork.isMetric) { tempFloat = wvutilsConvertFToC(loopData->dewpoint); } else { tempFloat = loopData->dewpoint; } break; case WindChill: if (alarmsWork.isMetric) { tempFloat = wvutilsConvertFToC(loopData->windchill); } else { tempFloat = loopData->windchill; } break; case HeatIndex: if (alarmsWork.isMetric) { tempFloat = wvutilsConvertFToC(loopData->heatindex); } else { tempFloat = loopData->heatindex; } break; case Radiation: tempFloat = (float)loopData->radiation; break; case UV: tempFloat = (float)loopData->UV; break; case ET: if (alarmsWork.isMetric) { tempFloat = wvutilsConvertRainINToMetric(loopData->dayET); } else { tempFloat = loopData->dayET; } break; case ExtraTemp1: if (alarmsWork.isMetric) { tempFloat = wvutilsConvertFToC(loopData->extraTemp1); } else { tempFloat = loopData->extraTemp1; } break; case ExtraTemp2: if (alarmsWork.isMetric) { tempFloat = wvutilsConvertFToC(loopData->extraTemp2); } else { tempFloat = loopData->extraTemp2; } break; case ExtraTemp3: if (alarmsWork.isMetric) { tempFloat = wvutilsConvertFToC(loopData->extraTemp3); } else { tempFloat = loopData->extraTemp3; } break; case SoilTemp1: if (alarmsWork.isMetric) { tempFloat = wvutilsConvertFToC(loopData->soilTemp1); } else { tempFloat = loopData->soilTemp1; } break; case SoilTemp2: if (alarmsWork.isMetric) { tempFloat = wvutilsConvertFToC(loopData->soilTemp2); } else { tempFloat = loopData->soilTemp2; } break; case SoilTemp3: if (alarmsWork.isMetric) { tempFloat = wvutilsConvertFToC(loopData->soilTemp3); } else { tempFloat = loopData->soilTemp3; } break; case SoilTemp4: if (alarmsWork.isMetric) { tempFloat = wvutilsConvertFToC(loopData->soilTemp4); } else { tempFloat = loopData->soilTemp4; } break; case LeafTemp1: if (alarmsWork.isMetric) { tempFloat = wvutilsConvertFToC(loopData->leafTemp1); } else { tempFloat = loopData->leafTemp1; } break; case LeafTemp2: if (alarmsWork.isMetric) { tempFloat = wvutilsConvertFToC(loopData->leafTemp2); } else { tempFloat = loopData->leafTemp2; } break; case ExtraHumid1: tempFloat = (float)loopData->extraHumid1; break; case ExtraHumid2: tempFloat = (float)loopData->extraHumid2; break; case Wxt510Hail: if (alarmsWork.isMetric) { tempFloat = wvutilsConvertRainINToMetric(loopData->wxt510Hail); } else { tempFloat = loopData->wxt510Hail; } break; case Wxt510Hailrate: if (alarmsWork.isMetric) { tempFloat = wvutilsConvertRainINToMetric(loopData->wxt510Hailrate); } else { tempFloat = loopData->wxt510Hailrate; } break; case Wxt510HeatingTemp: if (alarmsWork.isMetric) { tempFloat = wvutilsConvertFToC(loopData->wxt510HeatingTemp); } else { tempFloat = loopData->wxt510HeatingTemp; } break; case Wxt510HeatingVoltage: tempFloat = loopData->wxt510HeatingVoltage; break; case Wxt510SupplyVoltage: tempFloat = loopData->wxt510SupplyVoltage; break; case Wxt510ReferenceVoltage: tempFloat = loopData->wxt510ReferenceVoltage; break; default: // no match, blow it off continue; } // see if we tripped the breaker here if (alarm->isMax) { if (tempFloat >= alarm->bound) { // we did! alarm->triggered = TRUE; alarm->triggerValue = tempFloat; alarm->abateStart = radTimeGetSECSinceEpoch (); // run user script here statusIncrementStat(ALARM_STATS_SCRIPTS_RUN); if (executeScript (alarm) != 0) { radMsgLog (PRI_MEDIUM, "processAlarms: script %s failed", alarm->scriptToRun); } } } else { if (tempFloat <= alarm->bound) { // we did! alarm->triggered = TRUE; alarm->triggerValue = tempFloat; alarm->abateStart = radTimeGetSECSinceEpoch (); // run user script here statusIncrementStat(ALARM_STATS_SCRIPTS_RUN); if (executeScript (alarm) != 0) { radMsgLog (PRI_MEDIUM, "processAlarms: script %s failed", alarm->scriptToRun); } } } } return; }