public function startUdpNavdata() { $this->udpNavdata = new UdpNavdata($this->loop); $self = $this; $this->udpNavdata->on('navdata', function (Frame $navdata) use(&$self) { if (count($navdata->getDroneState()) > 0) { $stateData = $navdata->getDroneState(); if ($stateData['emergencyLanding'] && $self->disableEmergency) { //todo: disable emergency state } else { //todo: disable emergency state } } $options = $navdata->getOptions(); if (count($navdata->getDroneState()) > 0 && isset($options['demo'])) { // Control drone state $optionDemo = $options['demo']; $demoData = $optionDemo->getData(); $currentState = $demoData['controlState']; $self->emitState('landing', 'CTRL_TRANS_LANDING', $currentState); $self->emitState('landed', 'CTRL_LANDED', $currentState); $self->emitState('takeoff', 'CTRL_TRANS_TAKEOFF', $currentState); $self->emitState('hovering', 'CTRL_HOVERING', $currentState); $self->emitState('flying', 'CTRL_FLYING', $currentState); $self->lastState = $currentState; $battery = $demoData['batteryPercentage']; // battery events $stateData = $navdata->getDroneState(); if ($stateData['lowBattery'] === 1) { $self->emit('lowBattery', array($battery)); } if ($battery !== $self->lastBattery) { $self->emit('batteryChange', array($battery)); $self->lastBattery = $battery; } // altitude events $altitude = $demoData['altitudeMeters']; if ($altitude !== $self->lastAltitude) { $self->emit('altitudeChange', array($altitude)); $self->lastAltitude = $altitude; } } $self->emit('navdata', array($navdata)); }); }