diff --git a/app/src/routes/peripherals/servo/servos.svelte b/app/src/routes/peripherals/servo/servos.svelte index 9b2bfc6..5e0bdc4 100644 --- a/app/src/routes/peripherals/servo/servos.svelte +++ b/app/src/routes/peripherals/servo/servos.svelte @@ -41,10 +41,11 @@ Servo + {pwm}

General servo configuration

- + + { public: ServoController() @@ -35,10 +37,7 @@ class ServoController : public StatefulService { socket.onEvent(EVENT_SERVO_STATE, [&](JsonObject &root, int originId) { stateUpdate(root, originId); }); _persistence.readFromFS(); - _pca.begin(); - _pca.setPWMFreq(FACTORY_SERVO_PWM_FREQUENCY); - _pca.setOscillatorFrequency(FACTORY_SERVO_OSCILLATOR_FREQUENCY); - _pca.sleep(); + initializePCA(); socket.onEvent(EVENT_SERVO_STATE, [&](JsonObject &root, int originId) { is_active = root["active"] | false; is_active ? activate() : deactivate(); @@ -55,6 +54,7 @@ class ServoController : public StatefulService { void activate() { if (is_active) return; + control_state = SERVO_CONTROL_STATE::ANGLE; is_active = true; _pca.wakeup(); } @@ -62,6 +62,7 @@ class ServoController : public StatefulService { void deactivate() { if (!is_active) return; is_active = false; + control_state = SERVO_CONTROL_STATE::DEACTIVATED; _pca.sleep(); } @@ -72,8 +73,10 @@ class ServoController : public StatefulService { } void servoEvent(JsonObject &root, int originId) { + control_state = SERVO_CONTROL_STATE::PWM; uint8_t servo_id = root["servo_id"]; - uint16_t pwm = root["pwm"]; + int pwm = root["pwm"].as(); + pcaWrite(servo_id, pwm); ESP_LOGI("SERVO_CONTROLLER", "Setting servo %d to %d", servo_id, pwm); } @@ -88,12 +91,13 @@ class ServoController : public StatefulService { void updateActiveState() { is_active ? activate() : deactivate(); } void setAngles(float new_angles[12]) { + control_state = SERVO_CONTROL_STATE::ANGLE; for (int i = 0; i < 12; i++) { target_angles[i] = new_angles[i]; } } - void updateServoState() { + void calculatePWM() { for (int i = 0; i < 12; i++) { angles[i] = lerp(angles[i], target_angles[i], 0.2); auto &servo = state().servos[i]; @@ -107,13 +111,24 @@ class ServoController : public StatefulService { } } + void updateServoState() { + if (control_state == SERVO_CONTROL_STATE::ANGLE) calculatePWM(); + } + StatefulHttpEndpoint endpoint; private: + void initializePCA() { + _pca.begin(); + _pca.setPWMFreq(FACTORY_SERVO_PWM_FREQUENCY); + _pca.setOscillatorFrequency(FACTORY_SERVO_OSCILLATOR_FREQUENCY); + _pca.sleep(); + } FSPersistence _persistence; Adafruit_PWMServoDriver _pca; - uint16_t pwm[16] = {0}; + + SERVO_CONTROL_STATE control_state = SERVO_CONTROL_STATE::DEACTIVATED; bool is_active {false}; float angles[12] = {0, 90, -145, 0, 90, -145, 0, 90, -145, 0, 90, -145};