bool INDI::Weather::ISSnoopDevice(XMLEle *root) { XMLEle *ep = nullptr; const char *propName = findXMLAttValu(root, "name"); if (isConnected()) { if (!strcmp(propName, "GEOGRAPHIC_COORD")) { // Only accept IPS_OK state if (strcmp(findXMLAttValu(root, "state"), "Ok")) return false; double longitude = -1, latitude = -1, elevation = -1; for (ep = nextXMLEle(root, 1); ep != nullptr; ep = nextXMLEle(root, 0)) { const char *elemName = findXMLAttValu(ep, "name"); if (!strcmp(elemName, "LAT")) latitude = atof(pcdataXMLEle(ep)); else if (!strcmp(elemName, "LONG")) longitude = atof(pcdataXMLEle(ep)); else if (!strcmp(elemName, "ELEV")) elevation = atof(pcdataXMLEle(ep)); } return processLocationInfo(latitude, longitude, elevation); } } return DefaultDevice::ISSnoopDevice(root); }
bool INDI::LightBoxInterface::snoopLightBox(XMLEle *root) { if (isDimmable == false) return false; XMLEle *ep = nullptr; const char *propName = findXMLAttValu(root, "name"); if (FilterIntensityN == nullptr && !strcmp(propName, "FILTER_NAME")) { for (ep = nextXMLEle(root, 1); ep != nullptr; ep = nextXMLEle(root, 0)) { // If new, add. addFilterDuration(pcdataXMLEle(ep), 0); } device->defineNumber(&FilterIntensityNP); char errmsg[MAXRBUF]; IUReadConfig(nullptr, device->getDeviceName(), "FLAT_LIGHT_FILTER_INTENSITY", 1, errmsg); if (device->isConnected()) { if (currentFilterSlot < FilterIntensityNP.nnp) { double duration = FilterIntensityN[currentFilterSlot].value; if (duration > 0) SetLightBoxBrightness(duration); } } } else if (!strcmp(propName, "FILTER_SLOT")) { // Only accept IPS_OK/IPS_IDLE state if (strcmp(findXMLAttValu(root, "state"), "Ok") && strcmp(findXMLAttValu(root, "state"), "Idle")) return false; for (ep = nextXMLEle(root, 1); ep != nullptr; ep = nextXMLEle(root, 0)) { const char *elemName = findXMLAttValu(ep, "name"); if (!strcmp(elemName, "FILTER_SLOT_VALUE")) { currentFilterSlot = atoi(pcdataXMLEle(ep)) - 1; break; } } if (FilterIntensityN && device->isConnected()) { if (currentFilterSlot < FilterIntensityNP.nnp) { double duration = FilterIntensityN[currentFilterSlot].value; if (duration > 0) SetLightBoxBrightness(duration); } } } return false; }
/* print key attributes and values of the given xml to stderr. */ void traceMsg (XMLEle *root) { static const char *prtags[] = { "defNumber", "oneNumber", "defText", "oneText", "defSwitch", "oneSwitch", "defLight", "oneLight", }; XMLEle *e; const char *msg, *perm, *pcd; unsigned int i; /* print tag header */ fprintf (stderr, "%s %s %s %s", tagXMLEle(root), findXMLAttValu(root,"device"), findXMLAttValu(root,"name"), findXMLAttValu(root,"state")); pcd = pcdataXMLEle (root); if (pcd[0]) fprintf (stderr, " %s", pcd); perm = findXMLAttValu(root,"perm"); if (perm[0]) fprintf (stderr, " %s", perm); msg = findXMLAttValu(root,"message"); if (msg[0]) fprintf (stderr, " '%s'", msg); /* print each array value */ for (e = nextXMLEle(root,1); e; e = nextXMLEle(root,0)) for (i = 0; i < sizeof(prtags)/sizeof(prtags[0]); i++) if (strcmp (prtags[i], tagXMLEle(e)) == 0) fprintf (stderr, "\n %10s='%s'", findXMLAttValu(e,"name"), pcdataXMLEle (e)); fprintf (stderr, "\n"); }
bool WeatherMeta::ISSnoopDevice(XMLEle *root) { const char *propName = findXMLAttValu(root, "name"); const char *deviceName = findXMLAttValu(root, "device"); if (isConnected()) { if (strcmp(propName, "WEATHER_STATUS") == 0) { for (int i = 0; i < 4; i++) { if (ActiveDeviceT[i].text != nullptr && strcmp(ActiveDeviceT[i].text, deviceName) == 0) { IPState stationState; if (crackIPState(findXMLAttValu(root, "state"), &stationState) < 0) break; StationL[i].s = stationState; updateOverallState(); break; } } return true; } if (strcmp(propName, "WEATHER_UPDATE") == 0) { XMLEle *ep = nextXMLEle(root, 1); for (int i = 0; i < 4; i++) { if (ActiveDeviceT[i].text != nullptr && strcmp(ActiveDeviceT[i].text, deviceName) == 0) { updatePeriods[i] = atof(pcdataXMLEle(ep)); updateUpdatePeriod(); break; } } } } return INDI::DefaultDevice::ISSnoopDevice(root); }
/* pull apart the name and value from the given message, and set operand value. * ignore any other messages. * return 0 if found a recognized operand else -1 */ static int setOp (XMLEle *root) { char *t = tagXMLEle (root); const char *d = findXMLAttValu (root, "device"); const char *n = findXMLAttValu (root, "name"); int nset = 0; double v; char prop[1024]; XMLEle *ep; /* check values */ if (!strcmp (t,"defNumberVector") || !strcmp (t,"setNumberVector")) { for (ep = nextXMLEle(root,1); ep; ep = nextXMLEle(root,0)) { char *et = tagXMLEle(ep); if (!strcmp (et,"defNumber") || !strcmp (et,"oneNumber")) { sprintf (prop, "%s.%s.%s", d, n, findXMLAttValu(ep,"name")); v = atof(pcdataXMLEle(ep)); if (setOperand (prop, v) == 0) { nset++; if (oflag) fprintf (stderr, "%s=%g\n", prop, v); } } } } else if(!strcmp(t,"defSwitchVector") || !strcmp(t,"setSwitchVector")){ for (ep = nextXMLEle(root,1); ep; ep = nextXMLEle(root,0)) { char *et = tagXMLEle(ep); if (!strcmp (et,"defSwitch") || !strcmp (et,"oneSwitch")) { sprintf (prop, "%s.%s.%s", d, n, findXMLAttValu(ep,"name")); v = (double)!strcmp(pcdataXMLEle(ep),"On"); if (setOperand (prop, v) == 0) { nset++; if (oflag) fprintf (stderr, "%s=%g\n", prop, v); } } } } else if(!strcmp(t,"defLightVector") || !strcmp(t,"setLightVector")){ for (ep = nextXMLEle(root,1); ep; ep = nextXMLEle(root,0)) { char *et = tagXMLEle(ep); if (!strcmp (et,"defLight") || !strcmp (et,"oneLight")) { sprintf (prop, "%s.%s.%s", d, n, findXMLAttValu(ep,"name")); v = (double)pstatestr(pcdataXMLEle(ep)); if (setOperand (prop, v) == 0) { nset++; if (oflag) fprintf (stderr, "%s=%g\n", prop, v); } } } } /* check special elements */ t = (char *) findXMLAttValu (root, "state"); if (t[0]) { sprintf (prop, "%s.%s._STATE", d, n); v = (double)pstatestr(t); if (setOperand (prop, v) == 0) { nset++; if (oflag) fprintf (stderr, "%s=%g\n", prop, v); } } t = (char *) findXMLAttValu (root, "timestamp"); if (t[0]) { sprintf (prop, "%s.%s._TS", d, n); v = (double)timestamp(t); if (setOperand (prop, v) == 0) { nset++; if (oflag) fprintf (stderr, "%s=%g\n", prop, v); } } /* return whether any were set */ return (nset > 0 ? 0 : -1); }
bool Controller::ISSnoopDevice(XMLEle * root) { XMLEle * ep=NULL; double mag=0, angle=0; // If joystick is disabled, do not process anything. if (UseJoystickSP.sp[0].s == ISS_OFF) return false; const char * propName = findXMLAttValu(root, "name"); // Check axis if (!strcmp("JOYSTICK_AXIS", propName)) { for (ep = nextXMLEle(root, 1) ; ep != NULL ; ep = nextXMLEle(root, 0)) { const char * elemName = findXMLAttValu(ep, "name"); const char * setting = getControllerSetting(elemName); if (setting == NULL) return false; mag = atof(pcdataXMLEle(ep)); axisCallbackFunc(setting, mag, device); } } // Check buttons else if (!strcmp("JOYSTICK_BUTTONS", propName)) { for (ep = nextXMLEle(root, 1) ; ep != NULL ; ep = nextXMLEle(root, 0)) { const char * elemName = findXMLAttValu(ep, "name"); const char * setting = getControllerSetting(elemName); if (setting == NULL) continue; buttonCallbackFunc(setting, strcmp(pcdataXMLEle(ep), "Off") ? ISS_ON : ISS_OFF, device); } } // Check joysticks else if (strstr(propName, "JOYSTICK_")) { const char * setting = getControllerSetting(propName); // We don't have this here, so let's not process it if (setting == NULL) return false; for (ep = nextXMLEle(root, 1) ; ep != NULL ; ep = nextXMLEle(root, 0)) { if (!strcmp("JOYSTICK_MAGNITUDE", findXMLAttValu(ep, "name"))) mag = atof(pcdataXMLEle(ep)); else if (!strcmp("JOYSTICK_ANGLE", findXMLAttValu(ep, "name"))) angle = atof(pcdataXMLEle(ep)); } joystickCallbackFunc(setting, mag, angle, device); } return false; }