summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichele Bini <michele.bini@gmail.com>2022-05-12 08:37:08 (GMT)
committerMichele Bini <michele.bini@gmail.com>2022-05-12 20:30:57 (GMT)
commite679896281f3032994f5b998a21140475d167695 (patch)
tree702b7714dd847573963c5b802afa936ff1cadb7b
parent1d0023b502563d486a6e8c5d6dffbfdcd4e94c2a (diff)
Optimized accelerometer access via system task functions.
-rw-r--r--src/displayapp/screens/Jumpscore.cpp3
-rw-r--r--src/displayapp/screens/WatchFaceDigital.cpp4
-rw-r--r--src/displayapp/screens/WatchFaceDigital.h2
-rw-r--r--src/drivers/Bma421.h26
-rw-r--r--src/systemtask/SystemTask.h29
5 files changed, 38 insertions, 26 deletions
diff --git a/src/displayapp/screens/Jumpscore.cpp b/src/displayapp/screens/Jumpscore.cpp
index 3ec6bcb..81e2d1c 100644
--- a/src/displayapp/screens/Jumpscore.cpp
+++ b/src/displayapp/screens/Jumpscore.cpp
@@ -91,7 +91,8 @@ Jumpscore::~Jumpscore() {
void Jumpscore::Refresh() {
double X; double Y; double_t Z;
- double G = systemTask.ReadGXYZ(X,Y,Z);
+ systemTask.ObtainAccel(X,Y,Z);
+ double G = std::sqrt(X*X + Y*Y + Z*Z);
TickType_t current_time = xTaskGetTickCount();
if (started) {
TickType_t current_frame_ms = current_time - last_frame_time;
diff --git a/src/displayapp/screens/WatchFaceDigital.cpp b/src/displayapp/screens/WatchFaceDigital.cpp
index 79a4640..3b46c3b 100644
--- a/src/displayapp/screens/WatchFaceDigital.cpp
+++ b/src/displayapp/screens/WatchFaceDigital.cpp
@@ -166,8 +166,7 @@ void WatchFaceDigital::Refresh() {
lv_label_set_text_static(notificationIcon, NotificationIcon::GetIcon(notificationState.Get()));
}
-#ifndef INFINISIM
- temperature = systemTask.motionSensor.temperature_last_read_value+23;
+ systemTask.ObtainMotionSensorTemperature(temperature);
if (temperature.IsUpdated()) {
lv_obj_set_style_local_text_color( label_temp, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x999999));
lv_label_set_text_fmt(label_temp, "%d°C", temperature.Get());
@@ -179,7 +178,6 @@ void WatchFaceDigital::Refresh() {
);
#endif
}
-#endif
uint8_t second = dateTimeController.Seconds();
uint8_t decisecond = dateTimeController.Deciseconds();
diff --git a/src/displayapp/screens/WatchFaceDigital.h b/src/displayapp/screens/WatchFaceDigital.h
index c29033b..1ef9244 100644
--- a/src/displayapp/screens/WatchFaceDigital.h
+++ b/src/displayapp/screens/WatchFaceDigital.h
@@ -64,7 +64,7 @@ namespace Pinetime {
DirtyValue<uint32_t> stepCount {};
DirtyValue<uint8_t> heartbeat {};
DirtyValue<bool> heartbeatRunning {};
- DirtyValue<uint16_t> temperature {};
+ DirtyValue<int8_t> temperature {};
DirtyValue<bool> notificationState {};
lv_obj_t* label_temp;
diff --git a/src/drivers/Bma421.h b/src/drivers/Bma421.h
index 1503acd..d753e8d 100644
--- a/src/drivers/Bma421.h
+++ b/src/drivers/Bma421.h
@@ -1,7 +1,11 @@
#pragma once
#include <drivers/Bma421_C/bma4_defs.h>
+#include <drivers/Bma421_C/bma423.h>
namespace Pinetime {
+ namespace System {
+ class SystemTask;
+ }
namespace Drivers {
class TwiMaster;
class Bma421 {
@@ -30,17 +34,29 @@ namespace Pinetime {
Values Process();
void ResetStepCounter();
- void RefreshTemperature();
- uint8_t temperature_last_read_value;
- uint8_t temperature_last_result;
- uint8_t temperature_read_counter;
-
void Read(uint8_t registerAddress, uint8_t* buffer, size_t size);
void Write(uint8_t registerAddress, const uint8_t* data, size_t size);
bool IsOk() const;
DeviceTypes DeviceType() const;
+ void RefreshTemperature();
+ uint8_t temperature_last_read_value = 0;
+ uint8_t temperature_last_result = 0;
+ uint8_t temperature_read_counter = 0;
+
+ protected:
+ friend class Pinetime::System::SystemTask;
+
+ inline int8_t getTemperature() { return temperature_last_read_value+23; }
+
+ template <typename X, typename Y, typename Z> inline void ObtainAccel(X& x, Y& y, Z& z) {
+ struct bma4_accel data;
+ bma4_read_accel_xyz(&data, &bma);
+ // Modelled after Process(), x/y swapped
+ x = data.y; y = data.x; z = data.z;
+ }
+
private:
void Reset();
diff --git a/src/systemtask/SystemTask.h b/src/systemtask/SystemTask.h
index f141b01..d04cd53 100644
--- a/src/systemtask/SystemTask.h
+++ b/src/systemtask/SystemTask.h
@@ -94,6 +94,19 @@ namespace Pinetime {
return isSleeping;
}
+ // For accelerator-based games
+ template <typename X, typename Y, typename Z> inline void ObtainAccel(X& x, Y& y, Z& z) {
+ motionSensor.ObtainAccel(x,y,z);
+ }
+
+ template <typename X> inline void ObtainMotionSensorTemperature(X& x) {
+#ifndef INFINISIM
+ x = motionSensor.getTemperature();
+#else
+ x = 23;
+#endif
+ }
+
private:
TaskHandle_t taskHandle;
@@ -118,9 +131,7 @@ namespace Pinetime {
Pinetime::Controllers::NotificationManager& notificationManager;
Pinetime::Controllers::MotorController& motorController;
Pinetime::Drivers::Hrs3300& heartRateSensor;
- public:
Pinetime::Drivers::Bma421& motionSensor;
- private:
Pinetime::Controllers::Settings& settingsController;
Pinetime::Controllers::HeartRateController& heartRateController;
Pinetime::Controllers::MotionController& motionController;
@@ -151,20 +162,6 @@ namespace Pinetime {
static constexpr TickType_t batteryMeasurementPeriod = pdMS_TO_TICKS(10 * 60 * 1000);
SystemMonitor monitor;
-
- public:
- inline double ReadGXYZ(double &X, double &Y, double &Z) const {
- auto motionValues = motionSensor.Process();
- // motionController.Update(motionValues.x, motionValues.y, motionValues.z);
- X = motionValues.x; Y = motionValues.y; Z = motionValues.z;
- return std::sqrt(X*X + Y*Y + Z*Z);
- }
-
- inline double ReadG() const {
- double x, y, z;
- return ReadGXYZ(x,y,z);
- }
-
};
}
}