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 17 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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();
mark9064 marked this conversation as resolved.
Show resolved Hide resolved
stepCounterMustBeReset = false;
}

Expand Down
Loading