Skip to content

Commit

Permalink
Merge pull request #761 from Ralim/feat_add_MSA301
Browse files Browse the repository at this point in the history
Add MS301 support
  • Loading branch information
Ralim authored Jan 4, 2021
2 parents c358083 + a5a7463 commit 1849dd0
Show file tree
Hide file tree
Showing 6 changed files with 157 additions and 36 deletions.
1 change: 1 addition & 0 deletions workspace/TS100/Core/BSP/Miniware/Model_Config.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@

#ifdef MODEL_TS80P
#define ACCEL_LIS
#define ACCEL_MSA
#define POW_PD
#define POW_QC
#define TEMP_NTC
Expand Down
50 changes: 50 additions & 0 deletions workspace/TS100/Core/Drivers/MSA301.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/*
* MSA301.cpp
*
* Created on: 3 Jan 2021
* Author: Ralim
*/

#include <MSA301.h>
#include "MSA301_defines.h"
#define MSA301_I2C_ADDRESS 0x4C
bool MSA301::detect() {
return FRToSI2C::probe(MSA301_I2C_ADDRESS);
}

static const FRToSI2C::I2C_REG i2c_registers[] = { //
//
{ MSA301_REG_ODR, 0b00001000, 1 }, //X/Y/Z enabled @ 250Hz
{ MSA301_REG_POWERMODE, 0b0001001, 1 }, // Normal mode
{ MSA301_REG_RESRANGE, 0b00000001, 0 }, // 14bit resolution @ 4G range
{ MSA301_REG_ORIENT_HY, 0b01000000, 0 }, // 4*62.5mg hyst, no blocking, symmetrical
{ MSA301_REG_INTSET0, 1 << 6, 0 }, // Turn on orientation detection (by enabling its interrupt)

};

bool MSA301::initalize() {
return FRToSI2C::writeRegistersBulk(MSA301_I2C_ADDRESS, i2c_registers, sizeof(i2c_registers) / sizeof(i2c_registers[0]));
}

Orientation MSA301::getOrientation() {
uint8_t temp = 0;
FRToSI2C::Mem_Read(MSA301_I2C_ADDRESS, MSA301_REG_ORIENT_STATUS, &temp, 1);
switch (temp) {
case 112:
return Orientation::ORIENTATION_LEFT_HAND;
case 96:
return Orientation::ORIENTATION_RIGHT_HAND;
default:
return Orientation::ORIENTATION_FLAT;
}
}

void MSA301::getAxisReadings(int16_t &x, int16_t &y, int16_t &z) {
uint8_t temp[6];
//Bulk read all 6 regs
FRToSI2C::Mem_Read(MSA301_I2C_ADDRESS, MSA301_REG_OUT_X_L, temp, 6);
x = int16_t(((int16_t) temp[1]) << 8 | temp[0]) >> 2;
y = int16_t(((int16_t) temp[3]) << 8 | temp[2]) >> 2;
z = int16_t(((int16_t) temp[5]) << 8 | temp[4]) >> 2;

}
27 changes: 27 additions & 0 deletions workspace/TS100/Core/Drivers/MSA301.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/*
* MSA301.h
*
* Created on: 3 Jan 2021
* Author: Ralim
*/

#ifndef DRIVERS_MSA301_H_
#define DRIVERS_MSA301_H_
#include "I2C_Wrapper.hpp"
#include "BSP.h"

class MSA301 {
public:
//Returns true if this accelerometer is detected
static bool detect();
//Init any internal state
static bool initalize();
// Reads the I2C register and returns the orientation
static Orientation getOrientation();
//Return the x/y/z axis readings as signed int16's
static void getAxisReadings(int16_t &x, int16_t &y, int16_t &z);

private:
};

#endif /* DRIVERS_MSA301_H_ */
34 changes: 34 additions & 0 deletions workspace/TS100/Core/Drivers/MSA301_defines.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/*
* MSA301_defines.h
*
* Created on: 3 Jan 2021
* Author: Ralim
*/

#ifndef DRIVERS_MSA301_DEFINES_H_
#define DRIVERS_MSA301_DEFINES_H_
//Definitions from Adafruit <3

#define MSA301_REG_PARTID 0x01 ///< Register that contains the part ID
#define MSA301_REG_OUT_X_L 0x02 ///< Register address for X axis lower byte
#define MSA301_REG_OUT_X_H 0x03 ///< Register address for X axis higher byte
#define MSA301_REG_OUT_Y_L 0x04 ///< Register address for Y axis lower byte
#define MSA301_REG_OUT_Y_H 0x05 ///< Register address for Y axis higher byte
#define MSA301_REG_OUT_Z_L 0x06 ///< Register address for Z axis lower byte
#define MSA301_REG_OUT_Z_H 0x07 ///< Register address for Z axis higher byte
#define MSA301_REG_MOTIONINT 0x09 ///< Register address for motion interrupt
#define MSA301_REG_DATAINT 0x0A ///< Register address for data interrupt
#define MSA301_REG_CLICKSTATUS 0x0B ///< Register address for click/doubleclick status
#define MSA301_REG_RESRANGE 0x0F ///< Register address for resolution range
#define MSA301_REG_ODR 0x10 ///< Register address for data rate setting
#define MSA301_REG_POWERMODE 0x11 ///< Register address for power mode setting
#define MSA301_REG_INTSET0 0x16 ///< Register address for interrupt setting #0
#define MSA301_REG_INTSET1 0x17 ///< Register address for interrupt setting #1
#define MSA301_REG_INTMAP0 0x19 ///< Register address for interrupt map #0
#define MSA301_REG_INTMAP1 0x1A ///< Register address for interrupt map #1
#define MSA301_REG_TAPDUR 0x2A ///< Register address for tap duration
#define MSA301_REG_TAPTH 0x2B ///< Register address for tap threshold
#define MSA301_REG_ORIENT_HY 0x2C ///< Register address for orientation Hysteresis
#define MSA301_REG_ORIENT_STATUS 0x0C ///< Register address for orientation hysteresis

#endif /* DRIVERS_MSA301_DEFINES_H_ */
7 changes: 3 additions & 4 deletions workspace/TS100/Core/Threads/GUIThread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -394,8 +394,8 @@ static void display_countdown(int sleepThres) {
* mode is triggered.
*/
int lastEventTime = lastButtonTime < lastMovementTime ? lastMovementTime : lastButtonTime;
int downCount = sleepThres - xTaskGetTickCount() + lastEventTime;
if (downCount > 99000) {
TickType_t downCount = sleepThres - xTaskGetTickCount() + lastEventTime;
if (downCount > (99 * TICKS_SECOND)) {
OLED::printNumber(downCount / 60000 + 1, 2);
OLED::print(SymbolMinutes);
} else {
Expand Down Expand Up @@ -645,10 +645,10 @@ static void gui_solderingMode(uint8_t jumpToSleep) {
void showDebugMenu(void) {
uint8_t screen = 0;
ButtonState b;
OLED::setFont(1); // small font
for (;;) {
OLED::clearScreen(); // Ensure the buffer starts clean
OLED::setCursor(0, 0); // Position the cursor at the 0,0 (top left)
OLED::setFont(1); // small font
OLED::print(SymbolVersionNumber); // Print version number
OLED::setCursor(0, 8); // second line
OLED::print(DebugMenu[screen]);
Expand Down Expand Up @@ -717,7 +717,6 @@ void showDebugMenu(void) {
}
#endif
if (poweredbyPD) {

OLED::printNumber(2, 1);
} else {

Expand Down
74 changes: 42 additions & 32 deletions workspace/TS100/Core/Threads/MOVThread.cpp
100755 → 100644
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@
* Author: Ralim
*/

#include "BMA223.hpp"
#include "BSP.h"
#include "FreeRTOS.h"
#include "I2C_Wrapper.hpp"
#include "LIS2DH12.hpp"
#include "MMA8652FC.hpp"
#include "MSA301.h"
#include "QC3.h"
#include "Settings.h"
#include "TipThermoModel.h"
Expand All @@ -18,46 +20,47 @@
#include "main.hpp"
#include "power.hpp"
#include "stdlib.h"
#include "BMA223.hpp"
#include "task.h"
#define MOVFilter 8
uint8_t accelInit = 0;
TickType_t lastMovementTime = 0;
void detectAccelerometerVersion() {
DetectedAccelerometerVersion = ACCELEROMETERS_SCANNING;
DetectedAccelerometerVersion = 99;
#ifdef ACCEL_MMA
if (MMA8652FC::detect()) {
DetectedAccelerometerVersion = 1;
if (!MMA8652FC::initalize()) {
DetectedAccelerometerVersion = NO_DETECTED_ACCELEROMETER;
}
} else
if (MMA8652FC::detect()) {
if (MMA8652FC::initalize()) {
DetectedAccelerometerVersion = 1;
}
} else
#endif
#ifdef ACCEL_LIS
if (LIS2DH12::detect()) {
DetectedAccelerometerVersion = 2;
// Setup the ST Accelerometer
if (!LIS2DH12::initalize()) {
DetectedAccelerometerVersion = NO_DETECTED_ACCELEROMETER;
if (LIS2DH12::initalize()) {
DetectedAccelerometerVersion = 2;
}
} else
#endif
#ifdef ACCEL_BMA
if (BMA223::detect()) {
DetectedAccelerometerVersion = 3;
// Setup the ST Accelerometer
if (!BMA223::initalize()) {
DetectedAccelerometerVersion = NO_DETECTED_ACCELEROMETER;
if (BMA223::detect()) {
// Setup the ST Accelerometer
if (BMA223::initalize()) {
DetectedAccelerometerVersion = 3;
}
} else
#endif
#ifdef ACCEL_MSA
if (MSA301::detect()) {
// Setup the MSA301 Accelerometer
if (MSA301::initalize()) {
DetectedAccelerometerVersion = 4;
}
} else
#endif
{
DetectedAccelerometerVersion = NO_DETECTED_ACCELEROMETER;
systemSettings.SleepTime = 0;
systemSettings.ShutdownTime = 0; // No accel -> disable sleep
// disable imu sensitivity
systemSettings.sensitivity = 0;
}

}
inline void readAccelerometer(int16_t &tx, int16_t &ty, int16_t &tz, Orientation &rotation) {
#ifdef ACCEL_LIS
Expand All @@ -67,27 +70,34 @@ inline void readAccelerometer(int16_t &tx, int16_t &ty, int16_t &tz, Orientation
} else
#endif
#ifdef ACCEL_MMA
if (DetectedAccelerometerVersion == 1) {
MMA8652FC::getAxisReadings(tx, ty, tz);
rotation = MMA8652FC::getOrientation();
} else
if (DetectedAccelerometerVersion == 1) {
MMA8652FC::getAxisReadings(tx, ty, tz);
rotation = MMA8652FC::getOrientation();
} else
#endif
#ifdef ACCEL_BMA
if (DetectedAccelerometerVersion == 3) {
BMA223::getAxisReadings(tx, ty, tz);
rotation = BMA223::getOrientation();
if (DetectedAccelerometerVersion == 3) {
BMA223::getAxisReadings(tx, ty, tz);
rotation = BMA223::getOrientation();
} else
#endif
#ifdef ACCEL_MSA
if (DetectedAccelerometerVersion == 4) {
MSA301::getAxisReadings(tx, ty, tz);
rotation = MSA301::getOrientation();
} else
#endif
{
//do nothing :(
// do nothing :(
}
}
void startMOVTask(void const *argument __unused) {
postRToSInit();
detectAccelerometerVersion();
osDelay(50); //wait ~50ms for setup of accel to finalise
osDelay(TICKS_100MS / 2); // wait ~50ms for setup of accel to finalise
lastMovementTime = 0;
//Mask 2 seconds if we are in autostart so that if user is plugging in and then putting in stand it doesnt wake instantly
// Mask 2 seconds if we are in autostart so that if user is plugging in and
// then putting in stand it doesnt wake instantly
if (systemSettings.autoStartMode)
osDelay(2 * TICKS_SECOND);

Expand All @@ -102,7 +112,7 @@ void startMOVTask(void const *argument __unused) {
Orientation rotation = ORIENTATION_FLAT;
for (;;) {
int32_t threshold = 1500 + (9 * 200);
threshold -= systemSettings.sensitivity * 200; // 200 is the step size
threshold -= systemSettings.sensitivity * 200; // 200 is the step size
readAccelerometer(tx, ty, tz, rotation);
if (systemSettings.OrientationMode == 2) {
if (rotation != ORIENTATION_FLAT) {
Expand Down Expand Up @@ -142,7 +152,7 @@ void startMOVTask(void const *argument __unused) {
lastMovementTime = xTaskGetTickCount();
}

osDelay(100); // Slow down update rate
osDelay(TICKS_100MS); // Slow down update rate
power_check();
}
}

0 comments on commit 1849dd0

Please sign in to comment.