I wanted to know how the following function, setAccelOn, works.
var Ruuvitag = require("Ruuvitag");
function onInit() {
Ruuvitag.setAccelOn(true, function(xyz) {
console.log(xyz);
});
Ruuvitag.accel.setPowerMode("normal");
}
Instead of printing the values, can this function return a value using “return xyz” statement??
otso
August 21, 2020, 6:09am
2
The callback function is called by interrupt handling the data and returning values wouldn’t make sense. My approach would be to set a flag notifying main program there’s new data on callback and then read the data in main.
Could you please provide the code?
otso
August 21, 2020, 10:17am
4
Hello,
Here’s how I do it in C:
m_p2p[2] > APPLICATION_ACCELEROMETER_ACTIVITY_THRESHOLD )
{
err_code |= ruuvi_platform_timer_stop(standby_timer);
err_code |= ruuvi_platform_timer_start(standby_timer, 3 * APPLICATION_ADVERTISING_INTERVAL);
}
RUUVI_DRIVER_ERROR_CHECK(err_code, RUUVI_DRIVER_SUCCESS);
}
RUUVI_DRIVER_ERROR_CHECK(err_code, RUUVI_DRIVER_SUCCESS);
}
static void on_fifo (ruuvi_interface_gpio_evt_t event)
{
ruuvi_driver_status_t err_code = ruuvi_platform_scheduler_event_put(NULL, 0, task_acceleration_fifo_full_task);
RUUVI_DRIVER_ERROR_CHECK(err_code, RUUVI_DRIVER_SUCCESS);
}
ruuvi_driver_status_t task_acceleration_configure(ruuvi_driver_sensor_configuration_t* config)
{
ruuvi_driver_status_t err_code = RUUVI_DRIVER_SUCCESS;
float ths = APPLICATION_ACCELEROMETER_ACTIVITY_THRESHOLD;
// read old data off FIFO
When interrupt from FIFO Full of LIS2DH12 triggers, event is placed in scheduler queue.
ruuvi_platform_delay_ms(1000);
}
// Reset any previous errors, turn LEDs off
status = task_led_write(RUUVI_BOARD_LED_GREEN, TASK_LED_OFF);
while (1)
{
// Turn off activity led
status = task_led_write(RUUVI_BOARD_LED_RED, !RUUVI_BOARD_LEDS_ACTIVE_STATE);
// Sleep
status |= ruuvi_platform_yield();
// Turn on activity led
status |= task_led_write(RUUVI_BOARD_LED_RED, RUUVI_BOARD_LEDS_ACTIVE_STATE);
// Execute scheduled tasks
status |= ruuvi_platform_scheduler_execute();
// Reset only on fatal error
RUUVI_DRIVER_ERROR_CHECK(status, ~RUUVI_DRIVER_ERROR_FATAL);
}
}
After interrupt program wakes up from yield
in main loop and scheduled functions get executed.
static float m_rms[3];
static float m_var[3];
static inline int8_t f2i(float value)
{
if(value > 125) return 125;
if(value < -125) return -125;
return (int8_t) lroundf(value);
}
static void task_acceleration_fifo_full_task(void *p_event_data, uint16_t event_size)
{
ruuvi_driver_status_t err_code = RUUVI_DRIVER_SUCCESS;
static ruuvi_interface_acceleration_data_t data[APPLICATION_ACCELEROMETER_DATASETS * 32];
size_t data_len = sizeof(data)/sizeof(ruuvi_interface_acceleration_data_t);
err_code |= ruuvi_interface_lis2dh12_fifo_read(&data_len, &(data[series_length]));
ruuvi_platform_log(RUUVI_INTERFACE_LOG_DEBUG, "FIFO\r\n");
if(!data_len)
{
return;
}
Is the scheduled function which reads the FIFO and updates advertised data. After all scheduled functions are executed tag goes back to sleep to wait for the next event.
I do not have equivalent code for Espruino, but the approach I’d take is similar. Register event in callback, main loop wakes up to handle the event and tag goes back to sleep.