This commit is contained in:
Hunman 2024-10-10 23:39:24 +01:00 committed by GitHub
commit 9fa5f5f116
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 50 additions and 12 deletions

View file

@ -64,7 +64,7 @@ int MotionService::OnStepCountRequested(uint16_t attributeHandle, ble_gatt_acces
NRF_LOG_INFO("Motion-stepcount : handle = %d", stepCountHandle);
uint32_t buffer = motionController.NbSteps();
int res = os_mbuf_append(context->om, &buffer, 4);
int res = os_mbuf_append(context->om, &buffer, sizeof(buffer));
return (res == 0) ? 0 : BLE_ATT_ERR_INSUFFICIENT_RES;
} else if (attributeHandle == motionValuesHandle) {
int16_t buffer[3] = {motionController.X(), motionController.Y(), motionController.Z()};
@ -80,7 +80,7 @@ void MotionService::OnNewStepCountValue(uint32_t stepCount) {
return;
uint32_t buffer = stepCount;
auto* om = ble_hs_mbuf_from_flat(&buffer, 4);
auto* om = ble_hs_mbuf_from_flat(&buffer, sizeof(buffer));
uint16_t connectionHandle = nimble.connHandle();

View file

@ -35,8 +35,17 @@ namespace {
}
}
void MotionController::AdvanceDay() {
--nbSteps; // Higher index = further in the past
NbStepsRef(Days::Today) = 0;
if (service != nullptr) {
service->OnNewStepCountValue(NbSteps(Days::Today));
}
}
void MotionController::Update(int16_t x, int16_t y, int16_t z, uint32_t nbSteps) {
if (this->nbSteps != nbSteps && service != nullptr) {
uint32_t& oldSteps = NbStepsRef(Days::Today);
if (oldSteps != nbSteps && service != nullptr) {
service->OnNewStepCountValue(nbSteps);
}
@ -56,11 +65,11 @@ void MotionController::Update(int16_t x, int16_t y, int16_t z, uint32_t nbSteps)
stats = GetAccelStats();
int32_t deltaSteps = nbSteps - this->nbSteps;
int32_t deltaSteps = nbSteps - oldSteps;
if (deltaSteps > 0) {
currentTripSteps += deltaSteps;
}
this->nbSteps = nbSteps;
oldSteps = nbSteps;
}
MotionController::AccelStats MotionController::GetAccelStats() const {

View file

@ -18,6 +18,15 @@ namespace Pinetime {
BMA425,
};
enum class Days : uint8_t {
Today = 0,
Yesterday,
};
static constexpr size_t stepHistorySize = 2; // Store this many day's step counter
void AdvanceDay();
void Update(int16_t x, int16_t y, int16_t z, uint32_t nbSteps);
int16_t X() const {
@ -32,8 +41,8 @@ namespace Pinetime {
return zHistory[0];
}
uint32_t NbSteps() const {
return nbSteps;
uint32_t NbSteps(Days day = Days::Today) const {
return nbSteps[static_cast<std::underlying_type_t<Days>>(day)];
}
void ResetTrip() {
@ -67,9 +76,13 @@ namespace Pinetime {
}
private:
uint32_t nbSteps = 0;
Utility::CircularBuffer<uint32_t, stepHistorySize> nbSteps = {0};
uint32_t currentTripSteps = 0;
uint32_t& NbStepsRef(Days day = Days::Today) {
return nbSteps[static_cast<std::underlying_type_t<Days>>(day)];
}
TickType_t lastTime = 0;
TickType_t time = 0;

View file

@ -5,13 +5,16 @@
using namespace Pinetime::Applications::Screens;
using Days = Pinetime::Controllers::MotionController::Days;
static void lap_event_handler(lv_obj_t* obj, lv_event_t event) {
auto* steps = static_cast<Steps*>(obj->user_data);
steps->lapBtnEventHandler(event);
}
Steps::Steps(Controllers::MotionController& motionController, Controllers::Settings& settingsController)
: motionController {motionController}, settingsController {settingsController} {
: motionController {motionController},
settingsController {settingsController} {
stepsArc = lv_arc_create(lv_scr_act(), nullptr);
@ -33,13 +36,19 @@ Steps::Steps(Controllers::MotionController& motionController, Controllers::Setti
lSteps = lv_label_create(lv_scr_act(), nullptr);
lv_obj_set_style_local_text_color(lSteps, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_LIME);
lv_obj_set_style_local_text_font(lSteps, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_42);
lv_label_set_text_fmt(lSteps, "%li", stepsCount);
lv_label_set_text_fmt(lSteps, "%lu", stepsCount);
lv_obj_align(lSteps, nullptr, LV_ALIGN_CENTER, 0, -40);
lv_obj_t* lstepsL = lv_label_create(lv_scr_act(), nullptr);
lv_obj_set_style_local_text_color(lstepsL, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, Colors::lightGray);
lv_label_set_text_static(lstepsL, "Steps");
lv_obj_align(lstepsL, lSteps, LV_ALIGN_OUT_BOTTOM_MID, 0, 5);
lv_obj_align(lstepsL, lSteps, LV_ALIGN_OUT_BOTTOM_MID, 0, 0);
lStepsYesterday = lv_label_create(lv_scr_act(), nullptr);
lv_obj_set_style_local_text_color(lStepsYesterday, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, Colors::lightGray);
lv_label_set_text_fmt(lStepsYesterday, yesterdayStr, motionController.NbSteps(Days::Yesterday));
lv_label_set_align(lStepsYesterday, LV_LABEL_ALIGN_CENTER);
lv_obj_align(lStepsYesterday, lSteps, LV_ALIGN_OUT_BOTTOM_MID, 0, 20);
lv_obj_t* lstepsGoal = lv_label_create(lv_scr_act(), nullptr);
lv_obj_set_style_local_text_color(lstepsGoal, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_CYAN);
@ -76,7 +85,10 @@ void Steps::Refresh() {
stepsCount = motionController.NbSteps();
currentTripSteps = motionController.GetTripSteps();
lv_label_set_text_fmt(lSteps, "%li", stepsCount);
lv_label_set_text_fmt(lSteps, "%lu", stepsCount);
lv_obj_align(lSteps, nullptr, LV_ALIGN_CENTER, 0, -40);
lv_label_set_text_fmt(lStepsYesterday, yesterdayStr, motionController.NbSteps(Days::Yesterday));
lv_obj_align(lSteps, nullptr, LV_ALIGN_CENTER, 0, -40);
if (currentTripSteps < 100000) {

View file

@ -32,11 +32,14 @@ namespace Pinetime {
uint32_t currentTripSteps = 0;
lv_obj_t* lSteps;
lv_obj_t* lStepsYesterday;
lv_obj_t* stepsArc;
lv_obj_t* resetBtn;
lv_obj_t* resetButtonLabel;
lv_obj_t* tripLabel;
static constexpr const char* yesterdayStr = "Yest: %5lu";
uint32_t stepsCount;
lv_task_t* taskRefresh;

View file

@ -426,6 +426,7 @@ void SystemTask::UpdateMotion() {
if (stepCounterMustBeReset) {
motionSensor.ResetStepCounter();
motionController.AdvanceDay();
stepCounterMustBeReset = false;
}