imrishabh18/pedometer
This code defines and assembles a simple radio receiver hardware circuit using specific imported capacitors, inductors, RF connectors, and oscillator components with precise footprints and schematic attributes.
- Version
- 1.1.3
- License
- unset
- Stars
- 0
firmware/app.c
#include "app.h"
#include <string.h>
/* Flags: bit0 sensor fault, bit1 gauge fault, bit2 count discontinuity,
* bit3 display/PMIC fault, bit4 persistence failure. */
static void sample(StrideApp *a){
uint32_t raw;
uint64_t now=board_time_ms(),limit=((now-a->last_sample)/1000+1)*6+10;
if(limit>0x7fffff)limit=0x7fffff;
if(sensor_read(&a->sensor,&raw)){a->flags&=(uint8_t)~1u;if(!steps_update(&a->steps,raw,(uint32_t)limit))a->flags|=4;a->last_sample=now;}
else a->flags|=1;
if(gauge_read(&a->millivolts,&a->soc)&&a->gauge_configured)a->flags&=(uint8_t)~2u;else a->flags|=2;
uint8_t b[14];encode_snapshot(b,a->steps.total,a->millivolts,(uint8_t)a->soc,a->flags);app_ble_publish(b);
}
bool stride_init(StrideApp *a,uint64_t total,bool wrist){
memset(a,0,sizeof *a);a->steps.total=total;a->soc=255;
if(!pmic_init()||!sensor_init(&a->sensor,wrist))return false;
a->gauge_configured=gauge_configure_100mah();if(!a->gauge_configured)a->flags|=2;
sample(a);a->last_checkpoint=board_time_ms();a->next_sample=a->last_checkpoint+60000;return true;
}
void stride_tick(StrideApp *a,bool pressed){
uint64_t now=board_time_ms();
if(pressed){
sample(a);a->next_sample=now+60000;
if(!a->display_on){a->display_on=display_power(true);if(!a->display_on)a->flags|=8;}
if(a->display_on&&!oled_steps(a->steps.total))a->flags|=8;
a->display_until=now+5000;
}
if(now>=a->next_sample){sample(a);a->next_sample=now+60000;}
if(a->display_on&&now>=a->display_until){if(display_power(false))a->display_on=false;else a->flags|=8;}
if(now-a->last_checkpoint>=900000){if(!app_checkpoint(a->steps.total))a->flags|=16;a->last_checkpoint=now;}
}
uint64_t stride_deadline(const StrideApp *a){
return a->display_on&&a->display_until<a->next_sample?a->display_until:a->next_sample;
}