Compare commits

...

4 commits

Author SHA1 Message Date
embr 589ca48d64 state: what if up/down had different ramp speeds 2023-05-02 01:31:47 +02:00
embr e7129abc6a state: track ramp in 100ths of %s 2023-05-02 01:05:01 +02:00
embr c8f83cbc5f disable buttons for now 2023-05-02 01:00:19 +02:00
embr d31ef13e96 reduce ramp latency to 2% every 1ms 2023-05-02 00:04:49 +02:00
6 changed files with 13 additions and 105 deletions

View file

@ -19,7 +19,6 @@ add_executable(vibe-check
src/main.c
src/state.c
src/vibe_bt.c
src/buttons.c
)
target_link_libraries(vibe-check

View file

@ -1,78 +0,0 @@
#include "buttons.h"
#include "btstack.h"
#include "hardware/gpio.h"
#include "pico/stdlib.h"
#include "state.h"
#include "vibe_bt.h"
#include <stdio.h>
#define POLL_PERIOD_MS 100
#define BUTTON_PIN_POWER 20
#define BUTTON_PIN_PLUS 19
#define BUTTON_PIN_MINUS 18
#define BUTTON_STEP 25
static btstack_timer_source_t button_timer;
// What power do we return to when the power button is pressed while off?
static uint8_t resume_power = 50;
static void button_timer_callback(struct btstack_timer_source* ts) {
// TODO: Debounce this.
if (gpio_get(BUTTON_PIN_POWER)) {
if (bt_connected) {
printf("=> Ignoring input, bluetooth connected.\n");
} else if (target_power == 0) {
printf("= Resuming: %i%% -> %i%%\n", target_power, resume_power);
state_set_power(resume_power);
} else {
printf("= Suspending: %i%% -> %i%%\n", target_power, resume_power);
resume_power = target_power;
state_set_power(0);
}
}
if (gpio_get(BUTTON_PIN_PLUS)) {
if (bt_connected) {
printf("+> Ignoring input, bluetooth connected.\n");
} else if (target_power <= (100 - BUTTON_STEP)) {
printf("+ Increasing power: %i%% -> %i%%\n", target_power, target_power + BUTTON_STEP);
state_set_power(target_power + BUTTON_STEP);
} else {
printf("+ Increasing power: %i%% -> %i%%\n", target_power, 100);
state_set_power(100);
}
}
if (gpio_get(BUTTON_PIN_MINUS)) {
if (bt_connected) {
printf("-> Ignoring input, bluetooth connected.\n");
} else if (target_power >= BUTTON_STEP) {
printf("- Reducing power: %i%% -> %i%%\n", target_power, target_power - BUTTON_STEP);
state_set_power(target_power - BUTTON_STEP);
} else {
printf("- Reducing power: %i%% -> %i%%\n", target_power, 0);
state_set_power(0);
}
}
btstack_run_loop_set_timer(ts, POLL_PERIOD_MS);
btstack_run_loop_add_timer(ts);
}
void buttons_init() {
gpio_set_dir(BUTTON_PIN_POWER, GPIO_IN);
gpio_set_dir(BUTTON_PIN_PLUS, GPIO_IN);
gpio_set_dir(BUTTON_PIN_MINUS, GPIO_IN);
button_timer.process = button_timer_callback;
button_timer.process(&button_timer);
// Why do these not trigger??
// printf("Setting interrupts for buttons...\n");
// gpio_set_irq_callback(button_callback);
// gpio_set_irq_enabled(BUTTON_PIN_POWER, BUTTON_EVENTS, true);
// gpio_set_irq_enabled(BUTTON_PIN_PLUS, BUTTON_EVENTS, true);
// gpio_set_irq_enabled(BUTTON_PIN_MINUS, BUTTON_EVENTS, true);
}

View file

@ -1,6 +0,0 @@
#ifndef BUTTONS_H
#define BUTTONS_H
void buttons_init();
#endif

View file

@ -1,5 +1,4 @@
#include "btstack.h"
#include "buttons.h"
#include "hci_dump.h"
#include "hci_dump_segger_rtt_stdout.h"
#include "pico/btstack_cyw43.h"
@ -47,9 +46,6 @@ int main() {
// set initial state
state_init();
// hook up buttons
buttons_init();
att_server_init(profile_data, bt_att_read_callback, bt_att_write_callback);
hci_event_callback_registration.callback = &bt_packet_handler;

View file

@ -8,26 +8,28 @@
static int pwm_slice = 0;
uint8_t current_power = 0;
uint8_t target_power = 0;
// Note: These are all in % of a %, eg. 100% = 10000.
uint16_t current_power = 0;
uint16_t target_power = 0;
#define RAMP_PERIOD_MS 100
#define RAMP_STEP 50
#define RAMP_PERIOD_MS 1
#define RAMP_STEP_UP 200
#define RAMP_STEP_DOWN 50
// Timer and callback for ramping power. Jumping ~50% power or more in one go kills the
// chip with electrical ripples, so be a bit gentle about it.
static btstack_timer_source_t ramp_timer;
static void ramp_timer_callback(struct btstack_timer_source* ts) {
if (current_power != target_power) {
if (current_power < target_power - RAMP_STEP) {
current_power += RAMP_STEP;
} else if (current_power > target_power + RAMP_STEP) {
current_power -= RAMP_STEP;
if (current_power < target_power - RAMP_STEP_UP) {
current_power += RAMP_STEP_UP;
} else if (current_power > target_power + RAMP_STEP_DOWN) {
current_power -= RAMP_STEP_DOWN;
} else {
current_power = target_power;
}
pwm_set_chan_level(pwm_slice, PWM_CHAN_A, current_power);
pwm_set_chan_level(pwm_slice, PWM_CHAN_B, current_power);
pwm_set_chan_level(pwm_slice, PWM_CHAN_A, current_power / 100);
pwm_set_chan_level(pwm_slice, PWM_CHAN_B, current_power / 100);
}
btstack_run_loop_set_timer(ts, RAMP_PERIOD_MS);
@ -52,5 +54,5 @@ void state_set_power(uint8_t power) {
if (power > 100) {
power = 100;
}
target_power = power;
target_power = power * 100;
}

View file

@ -3,11 +3,6 @@
#include <stdint.h>
// Current power level, 0-100.
extern uint8_t current_power;
// Target power level (that we're ramping to), 0-100.
extern uint8_t target_power;
// Initialize wand state.
void state_init();