Skip to content

Commit c6dca25

Browse files
authored
Add support for BMA425 acceleration sensor. (#440)
* Add support for BMA425 acceleration sensor.
1 parent e90e8c7 commit c6dca25

10 files changed

Lines changed: 603 additions & 29 deletions

File tree

src/components/motion/MotionController.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,10 @@ bool MotionController::ShouldWakeUp(bool isSleeping) {
3434
void MotionController::IsSensorOk(bool isOk) {
3535
isSensorOk = isOk;
3636
}
37+
void MotionController::Init(Pinetime::Drivers::Bma421::DeviceTypes types) {
38+
switch(types){
39+
case Drivers::Bma421::DeviceTypes::BMA421: this->deviceType = DeviceTypes::BMA421; break;
40+
case Drivers::Bma421::DeviceTypes::BMA425: this->deviceType = DeviceTypes::BMA425; break;
41+
default: this->deviceType = DeviceTypes::Unknown; break;
42+
}
43+
}

src/components/motion/MotionController.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
#pragma once
22

33
#include <cstdint>
4+
#include <drivers/Bma421.h>
45

56
namespace Pinetime {
67
namespace Controllers {
78
class MotionController {
89
public:
10+
enum class DeviceTypes{
11+
Unknown,
12+
BMA421,
13+
BMA425,
14+
};
15+
916
void Update(int16_t x, int16_t y, int16_t z, uint32_t nbSteps);
1017

1118
int16_t X() const {
@@ -27,13 +34,20 @@ namespace Pinetime {
2734
return isSensorOk;
2835
}
2936

37+
DeviceTypes DeviceType() const {
38+
return deviceType;
39+
}
40+
41+
void Init(Pinetime::Drivers::Bma421::DeviceTypes types);
42+
3043
private:
3144
uint32_t nbSteps;
3245
int16_t x;
3346
int16_t y;
3447
int16_t z;
3548
int16_t lastYForWakeUp = 0;
3649
bool isSensorOk = false;
50+
DeviceTypes deviceType = DeviceTypes::Unknown;
3751
};
3852
}
3953
}

src/displayapp/DisplayApp.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction)
329329
break;
330330
case Apps::SysInfo:
331331
currentScreen =
332-
std::make_unique<Screens::SystemInfo>(this, dateTimeController, batteryController, brightnessController, bleController, watchdog);
332+
std::make_unique<Screens::SystemInfo>(this, dateTimeController, batteryController, brightnessController, bleController, watchdog, motionController);
333333
ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown);
334334
break;
335335
case Apps::FlashLight:

src/displayapp/screens/SystemInfo.cpp

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,37 @@
77
#include "components/ble/BleController.h"
88
#include "components/brightness/BrightnessController.h"
99
#include "components/datetime/DateTimeController.h"
10+
#include "components/motion/MotionController.h"
1011
#include "drivers/Watchdog.h"
1112

1213
using namespace Pinetime::Applications::Screens;
1314

15+
namespace {
16+
const char* ToString(const Pinetime::Controllers::MotionController::DeviceTypes deviceType) {
17+
switch (deviceType) {
18+
case Pinetime::Controllers::MotionController::DeviceTypes::BMA421:
19+
return "BMA421";
20+
case Pinetime::Controllers::MotionController::DeviceTypes::BMA425:
21+
return "BMA425";
22+
}
23+
return "???";
24+
}
25+
}
26+
1427
SystemInfo::SystemInfo(Pinetime::Applications::DisplayApp* app,
1528
Pinetime::Controllers::DateTime& dateTimeController,
1629
Pinetime::Controllers::Battery& batteryController,
1730
Pinetime::Controllers::BrightnessController& brightnessController,
1831
Pinetime::Controllers::Ble& bleController,
19-
Pinetime::Drivers::WatchdogView& watchdog)
32+
Pinetime::Drivers::WatchdogView& watchdog,
33+
Pinetime::Controllers::MotionController& motionController)
2034
: Screen(app),
2135
dateTimeController {dateTimeController},
2236
batteryController {batteryController},
2337
brightnessController {brightnessController},
2438
bleController {bleController},
2539
watchdog {watchdog},
40+
motionController{motionController},
2641
screens {app,
2742
0,
2843
{[this]() -> std::unique_ptr<Screen> {
@@ -132,9 +147,7 @@ std::unique_ptr<Screen> SystemInfo::CreateScreen2() {
132147
// hack to not use the flot functions from printf
133148
uint8_t batteryVoltageBytes[2];
134149
batteryVoltageBytes[1] = static_cast<uint8_t>(batteryVoltage); // truncate whole numbers
135-
batteryVoltageBytes[0] =
136-
static_cast<uint8_t>((batteryVoltage - batteryVoltageBytes[1]) * 100); // remove whole part of flt and shift 2 places over
137-
//
150+
batteryVoltageBytes[0] = static_cast<uint8_t>((batteryVoltage - batteryVoltageBytes[1]) * 100); // remove whole part of flt and shift 2 places over
138151

139152
lv_obj_t* label = lv_label_create(lv_scr_act(), nullptr);
140153
lv_label_set_recolor(label, true);
@@ -144,7 +157,8 @@ std::unique_ptr<Screen> SystemInfo::CreateScreen2() {
144157
"#444444 Uptime#\n %02lud %02lu:%02lu:%02lu\n"
145158
"#444444 Battery# %d%%/%1i.%02iv\n"
146159
"#444444 Backlight# %s\n"
147-
"#444444 Last reset# %s\n",
160+
"#444444 Last reset# %s\n"
161+
"#444444 Accel.# %s\n",
148162
dateTimeController.Day(),
149163
static_cast<uint8_t>(dateTimeController.Month()),
150164
dateTimeController.Year(),
@@ -159,7 +173,8 @@ std::unique_ptr<Screen> SystemInfo::CreateScreen2() {
159173
batteryVoltageBytes[1],
160174
batteryVoltageBytes[0],
161175
brightnessController.ToString(),
162-
resetReason);
176+
resetReason,
177+
ToString(motionController.DeviceType()));
163178
lv_obj_align(label, lv_scr_act(), LV_ALIGN_CENTER, 0, 0);
164179
return std::make_unique<Screens::Label>(1, 5, app, label);
165180
}

src/displayapp/screens/SystemInfo.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ namespace Pinetime {
2727
Pinetime::Controllers::Battery& batteryController,
2828
Pinetime::Controllers::BrightnessController& brightnessController,
2929
Pinetime::Controllers::Ble& bleController,
30-
Pinetime::Drivers::WatchdogView& watchdog);
30+
Pinetime::Drivers::WatchdogView& watchdog,
31+
Pinetime::Controllers::MotionController& motionController);
3132
~SystemInfo() override;
3233
bool Refresh() override;
3334
bool OnButtonPushed() override;
@@ -41,6 +42,7 @@ namespace Pinetime {
4142
Pinetime::Controllers::BrightnessController& brightnessController;
4243
Pinetime::Controllers::Ble& bleController;
4344
Pinetime::Drivers::WatchdogView& watchdog;
45+
Pinetime::Controllers::MotionController& motionController;
4446

4547
ScreenList<5> screens;
4648

src/drivers/Bma421.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ void Bma421::Init() {
4242
if (ret != BMA4_OK)
4343
return;
4444

45+
switch(bma.chip_id) {
46+
case BMA423_CHIP_ID: deviceType = DeviceTypes::BMA421; break;
47+
case BMA425_CHIP_ID: deviceType = DeviceTypes::BMA425; break;
48+
default: deviceType = DeviceTypes::Unknown; break;
49+
}
50+
4551
ret = bma423_write_config_file(&bma);
4652
if (ret != BMA4_OK)
4753
return;
@@ -121,3 +127,6 @@ void Bma421::SoftReset() {
121127
nrf_delay_ms(1);
122128
}
123129
}
130+
Bma421::DeviceTypes Bma421::DeviceType() const {
131+
return deviceType;
132+
}

src/drivers/Bma421.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ namespace Pinetime {
66
class TwiMaster;
77
class Bma421 {
88
public:
9+
enum class DeviceTypes : uint8_t {
10+
Unknown,
11+
BMA421,
12+
BMA425
13+
};
914
struct Values {
1015
uint32_t steps;
1116
int16_t x;
@@ -29,6 +34,7 @@ namespace Pinetime {
2934
void Write(uint8_t registerAddress, const uint8_t* data, size_t size);
3035

3136
bool IsOk() const;
37+
DeviceTypes DeviceType() const;
3238

3339
private:
3440
void Reset();
@@ -38,6 +44,7 @@ namespace Pinetime {
3844
struct bma4_dev bma;
3945
bool isOk = false;
4046
bool isResetOk = false;
47+
DeviceTypes deviceType = DeviceTypes::Unknown;
4148
};
4249
}
4350
}

0 commit comments

Comments
 (0)