diff --git a/src/components/ble/MotionService.cpp b/src/components/ble/MotionService.cpp index 1626a5bf..93f51508 100644 --- a/src/components/ble/MotionService.cpp +++ b/src/components/ble/MotionService.cpp @@ -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(); diff --git a/src/components/motion/MotionController.cpp b/src/components/motion/MotionController.cpp index 72507ac5..a04a62f9 100644 --- a/src/components/motion/MotionController.cpp +++ b/src/components/motion/MotionController.cpp @@ -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 { diff --git a/src/components/motion/MotionController.h b/src/components/motion/MotionController.h index be0241d3..10b91b10 100644 --- a/src/components/motion/MotionController.h +++ b/src/components/motion/MotionController.h @@ -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>(day)]; } void ResetTrip() { @@ -67,9 +76,13 @@ namespace Pinetime { } private: - uint32_t nbSteps = 0; + Utility::CircularBuffer nbSteps = {0}; uint32_t currentTripSteps = 0; + uint32_t& NbStepsRef(Days day = Days::Today) { + return nbSteps[static_cast>(day)]; + } + TickType_t lastTime = 0; TickType_t time = 0; diff --git a/src/displayapp/screens/Steps.cpp b/src/displayapp/screens/Steps.cpp index c5faaf05..70cd3be2 100644 --- a/src/displayapp/screens/Steps.cpp +++ b/src/displayapp/screens/Steps.cpp @@ -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(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) { diff --git a/src/displayapp/screens/Steps.h b/src/displayapp/screens/Steps.h index 6443582f..301ae9b0 100644 --- a/src/displayapp/screens/Steps.h +++ b/src/displayapp/screens/Steps.h @@ -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; diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index fc4e8f7e..443138e1 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -426,6 +426,7 @@ void SystemTask::UpdateMotion() { if (stepCounterMustBeReset) { motionSensor.ResetStepCounter(); + motionController.AdvanceDay(); stepCounterMustBeReset = false; }