/** * Generates all Integer Sensors */ static void geniSensors( char const*const type, const int amount, int const start, int const lbound, int const ubound, char const*const lalarm, char const*const ualarm, bool const lboundcross, bool const uboundcross) { // generate the requested amount int i; for(i=0;i<amount;i++) { // generate a generic name const unsigned int namelen=1+strlen(type)+numlen((unsigned)i); char name[namelen]; snprintf(name, sizeof(char)*namelen, "%s%d", type, i); // valid? if(namelen>SENSOR_HNAMELEN) { Log(LOGT_SERVER, LOGL_ERROR, "Name %s too long! (skipping rest of this batch)", name); break; } // make one { Sensor*const s=(Sensor*)makeiSensor(name, type, start, lbound, ubound, lalarm, ualarm, lboundcross, uboundcross); if(!s) { Log(LOGT_SERVER, LOGL_ERROR, "Out of memory!"); break; } // register them with the databases if(registerSensor(s)) { Log(LOGT_SERVER, LOGL_ERROR, "Cannot register %s", s->name); free(s); continue; } // set in log that all sensors of the group are generated if(i==(amount-1)) { Log(LOGT_SERVER, LOGL_DEBUG, "Generated %d %s %s %s", (i+1), s->type==binarysensor?"binary":"integer", s->unit, "Sensors"); } } } }
bool ProcessController::addSensor(const QString& hostName, const QString& sensorName, const QString& sensorType, const QString& title) { if (sensorType != "table") return false; QStackedLayout *layout = new QStackedLayout(this); mProcessList = new KSysGuardProcessList(this, hostName); mProcessList->setUpdateIntervalMSecs(0); //we will call updateList() manually mProcessList->setContentsMargins(0,0,0,0); mProcessList->setScriptingEnabled(true); addActions(mProcessList->actions()); connect(mProcessList, &KSysGuardProcessList::updated, this, &ProcessController::updated); connect(mProcessList, &KSysGuardProcessList::processListChanged, this, &ProcessController::processListChanged); mProcessList->setContextMenuPolicy( Qt::CustomContextMenu ); connect(mProcessList, &KSysGuardProcessList::customContextMenuRequested, this, &ProcessController::showContextMenu); layout->addWidget(mProcessList); /** To use a remote sensor, we need to drill down through the layers, to connect to the remote processes. Then connect to its signals and slots. * It's horrible I know :( */ if(!hostName.isEmpty() && hostName != "localhost") { KSysGuard::Processes *processes = mProcessList->processModel()->processController(); mProcesses = processes; if(processes) { connect(processes, &KSysGuard::Processes::runCommand, this, &ProcessController::runCommand); } } setPlotterWidget(mProcessList); QTimer::singleShot(0, mProcessList->filterLineEdit(), SLOT(setFocus())); registerSensor(new KSGRD::SensorProperties(hostName, sensorName, sensorType, title)); /* This just triggers the first communication. The full set of * requests are send whenever the sensor reconnects (detected in * sensorError(). */ sensors().at(0)->setIsOk(true); //Assume it is okay from the start setSensorOk(sensors().at(0)->isOk()); emit processListChanged(); return true; }
bool ListView::addSensor(const QString& hostName, const QString& sensorName, const QString& sensorType, const QString& title) { if (sensorType != "listview") return false; if(sensorName.isEmpty()) return false; registerSensor(new KSGRD::SensorProperties(hostName, sensorName, sensorType, title)); setTitle(title); /* To differentiate between answers from value requests and info * requests we use 100 for info requests. */ sendRequest(hostName, sensorName + '?', 100); sendRequest(hostName, sensorName, 19); return true; }
bool LogFile::addSensor(const QString& hostName, const QString& sensorName, const QString& sensorType, const QString& title) { if (sensorType != "logfile") return (false); registerSensor(new KSGRD::SensorProperties(hostName, sensorName, sensorType, title)); QString sensorID = sensorName.right(sensorName.length() - (sensorName.lastIndexOf("/") + 1)); sendRequest(sensors().at(0)->hostName(), QString("logfile_register %1" ).arg(sensorID), 42); if (title.isEmpty()) setTitle(sensors().at(0)->hostName() + ':' + sensorID); else setTitle(title); return (true); }
void SensorService::onFirstRef() { ALOGD("nuSensorService starting..."); SensorDevice& dev(SensorDevice::getInstance()); if (dev.initCheck() == NO_ERROR) { sensor_t const* list; ssize_t count = dev.getSensorList(&list); if (count > 0) { ssize_t orientationIndex = -1; bool hasGyro = false; uint32_t virtualSensorsNeeds = (1<<SENSOR_TYPE_GRAVITY) | (1<<SENSOR_TYPE_LINEAR_ACCELERATION) | (1<<SENSOR_TYPE_ROTATION_VECTOR); mLastEventSeen.setCapacity(count); for (ssize_t i=0 ; i<count ; i++) { registerSensor( new HardwareSensor(list[i]) ); switch (list[i].type) { case SENSOR_TYPE_ORIENTATION: orientationIndex = i; break; case SENSOR_TYPE_GYROSCOPE: hasGyro = true; break; case SENSOR_TYPE_GRAVITY: case SENSOR_TYPE_LINEAR_ACCELERATION: case SENSOR_TYPE_ROTATION_VECTOR: virtualSensorsNeeds &= ~(1<<list[i].type); break; } } // it's safe to instantiate the SensorFusion object here // (it wants to be instantiated after h/w sensors have been // registered) const SensorFusion& fusion(SensorFusion::getInstance()); if (hasGyro) { // Always instantiate Android's virtual sensors. Since they are // instantiated behind sensors from the HAL, they won't // interfere with applications, unless they looks specifically // for them (by name). registerVirtualSensor( new RotationVectorSensor() ); registerVirtualSensor( new GravitySensor(list, count) ); registerVirtualSensor( new LinearAccelerationSensor(list, count) ); // these are optional registerVirtualSensor( new OrientationSensor() ); registerVirtualSensor( new CorrectedGyroSensor(list, count) ); } // build the sensor list returned to users mUserSensorList = mSensorList; if (hasGyro) { // virtual debugging sensors are not added to mUserSensorList registerVirtualSensor( new GyroDriftSensor() ); } if (hasGyro && (virtualSensorsNeeds & (1<<SENSOR_TYPE_ROTATION_VECTOR))) { // if we have the fancy sensor fusion, and it's not provided by the // HAL, use our own (fused) orientation sensor by removing the // HAL supplied one form the user list. if (orientationIndex >= 0) { mUserSensorList.removeItemsAt(orientationIndex); } } // debugging sensor list for (size_t i=0 ; i<mSensorList.size() ; i++) { switch (mSensorList[i].getType()) { case SENSOR_TYPE_GRAVITY: case SENSOR_TYPE_LINEAR_ACCELERATION: case SENSOR_TYPE_ROTATION_VECTOR: if (strstr(mSensorList[i].getVendor().string(), "Google")) { mUserSensorListDebug.add(mSensorList[i]); } break; default: mUserSensorListDebug.add(mSensorList[i]); break; } } run("SensorService", PRIORITY_URGENT_DISPLAY); mInitCheck = NO_ERROR; } } }
void SensorService::registerVirtualSensor(SensorInterface* s) { registerSensor(s); mVirtualSensorList.add( s ); }
TSL2561Sensor::TSL2561Sensor() { registerSensor(this); }
BH1750Sensor::BH1750Sensor() { registerSensor(this); }