Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Step counter history added #2120

Open
wants to merge 22 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
07fc444
Introduce an alias for the step counter's type
Hunman Sep 7, 2024
a1a45df
Inverted the circular dependency of MotionService and MotionController
Hunman Sep 8, 2024
cd1815b
Converted MotionController::nbSteps to CircularBuffer internally
Hunman Sep 8, 2024
71cef51
Added an enum for the index of today and yesterday
Hunman Sep 8, 2024
f07a16f
Display yesterday's step counter on the Steps screen
Hunman Sep 8, 2024
35129e9
At midnight, "shift" the step counter history
Hunman Sep 8, 2024
24eab6f
Clang-format changes
Hunman Sep 8, 2024
cc8a381
Do not set unsigned step count to -1
Hunman Sep 11, 2024
a0b468d
Capitalising Day enum's members "Today" and "Yesterday"
Hunman Sep 11, 2024
275c70e
MotionController::NbSteps should take a Days enum as parameter
Hunman Sep 11, 2024
144c7d0
Removed step counter history getter
Hunman Sep 12, 2024
fcfdea7
Removed step_t
Hunman Sep 12, 2024
0f2c2ff
Reverted to the original MotionController and MotionService dependency
Hunman Sep 12, 2024
a5f2d2c
Changed MotionController::Days from enum to enum class
Hunman Sep 12, 2024
e973125
Changed MotionController::stepHistorySize to hard-coded value again
Hunman Sep 12, 2024
1b8ff02
Merge branch 'InfiniTimeOrg:main' into step-counter-history
Hunman Nov 19, 2024
b3695c6
Clang-format fix
Hunman Nov 19, 2024
40fbf1c
Merge branch 'main' into step-counter-history
Hunman Dec 24, 2024
08e56d8
Merge branch 'main' into step-counter-history
Hunman Jan 11, 2025
1694333
Merge branch 'main' into step-counter-history
Hunman Jan 30, 2025
4d9996b
Merge branch 'main' into step-counter-history
Hunman Feb 14, 2025
d3a2aa0
Merge branch 'main' into step-counter-history
Hunman Mar 17, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/components/ble/MotionService.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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()};
Expand All @@ -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();

Expand Down
15 changes: 12 additions & 3 deletions src/components/motion/MotionController.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand All @@ -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 {
Expand Down
19 changes: 16 additions & 3 deletions src/components/motion/MotionController.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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() {
Expand Down Expand Up @@ -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;

Expand Down
17 changes: 14 additions & 3 deletions src/displayapp/screens/Steps.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@

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);
Expand Down Expand Up @@ -33,13 +35,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);
Expand Down Expand Up @@ -76,7 +84,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) {
Expand Down
3 changes: 3 additions & 0 deletions src/displayapp/screens/Steps.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions src/systemtask/SystemTask.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -440,6 +440,7 @@ void SystemTask::UpdateMotion() {

if (stepCounterMustBeReset) {
motionSensor.ResetStepCounter();
motionController.AdvanceDay();
stepCounterMustBeReset = false;
}

Expand Down