mirror of https://github.com/sqfmi/Watchy.git
Merge pull request #161 from aneeshdurg/formatter
Introduce and use a consistent stylepull/162/head^2
commit
433050a63a
129
src/BLE.cpp
129
src/BLE.cpp
|
@ -1,99 +1,85 @@
|
|||
#include "BLE.h"
|
||||
|
||||
#define SERVICE_UUID_ESPOTA "cd77498e-1ac8-48b6-aba8-4161c7342fce"
|
||||
#define CHARACTERISTIC_UUID_ID "cd77498f-1ac8-48b6-aba8-4161c7342fce"
|
||||
#define SERVICE_UUID_ESPOTA "cd77498e-1ac8-48b6-aba8-4161c7342fce"
|
||||
#define CHARACTERISTIC_UUID_ID "cd77498f-1ac8-48b6-aba8-4161c7342fce"
|
||||
|
||||
#define SERVICE_UUID_OTA "86b12865-4b70-4893-8ce6-9864fc00374d"
|
||||
#define CHARACTERISTIC_UUID_FW "86b12866-4b70-4893-8ce6-9864fc00374d"
|
||||
#define CHARACTERISTIC_UUID_HW_VERSION "86b12867-4b70-4893-8ce6-9864fc00374d"
|
||||
#define CHARACTERISTIC_UUID_WATCHFACE_NAME "86b12868-4b70-4893-8ce6-9864fc00374d"
|
||||
#define SERVICE_UUID_OTA "86b12865-4b70-4893-8ce6-9864fc00374d"
|
||||
#define CHARACTERISTIC_UUID_FW "86b12866-4b70-4893-8ce6-9864fc00374d"
|
||||
#define CHARACTERISTIC_UUID_HW_VERSION "86b12867-4b70-4893-8ce6-9864fc00374d"
|
||||
#define CHARACTERISTIC_UUID_WATCHFACE_NAME \
|
||||
"86b12868-4b70-4893-8ce6-9864fc00374d"
|
||||
|
||||
#define FULL_PACKET 512
|
||||
#define FULL_PACKET 512
|
||||
#define CHARPOS_UPDATE_FLAG 5
|
||||
|
||||
#define STATUS_CONNECTED 0
|
||||
#define STATUS_CONNECTED 0
|
||||
#define STATUS_DISCONNECTED 4
|
||||
#define STATUS_UPDATING 1
|
||||
#define STATUS_READY 2
|
||||
#define STATUS_UPDATING 1
|
||||
#define STATUS_READY 2
|
||||
|
||||
esp_ota_handle_t otaHandler = 0;
|
||||
|
||||
int status = -1;
|
||||
int status = -1;
|
||||
int bytesReceived = 0;
|
||||
bool updateFlag = false;
|
||||
bool updateFlag = false;
|
||||
|
||||
class BLECustomServerCallbacks : public BLEServerCallbacks {
|
||||
void onConnect(BLEServer *pServer) { status = STATUS_CONNECTED; };
|
||||
|
||||
class BLECustomServerCallbacks: public BLEServerCallbacks {
|
||||
void onConnect(BLEServer* pServer) {
|
||||
status = STATUS_CONNECTED;
|
||||
};
|
||||
|
||||
void onDisconnect(BLEServer* pServer) {
|
||||
status = STATUS_DISCONNECTED;
|
||||
}
|
||||
void onDisconnect(BLEServer *pServer) { status = STATUS_DISCONNECTED; }
|
||||
};
|
||||
|
||||
class otaCallback: public BLECharacteristicCallbacks {
|
||||
public:
|
||||
otaCallback(BLE* ble) {
|
||||
_p_ble = ble;
|
||||
}
|
||||
BLE* _p_ble;
|
||||
class otaCallback : public BLECharacteristicCallbacks {
|
||||
public:
|
||||
otaCallback(BLE *ble) { _p_ble = ble; }
|
||||
BLE *_p_ble;
|
||||
|
||||
void onWrite(BLECharacteristic *pCharacteristic);
|
||||
void onWrite(BLECharacteristic *pCharacteristic);
|
||||
};
|
||||
|
||||
void otaCallback::onWrite(BLECharacteristic *pCharacteristic)
|
||||
{
|
||||
void otaCallback::onWrite(BLECharacteristic *pCharacteristic) {
|
||||
std::string rxData = pCharacteristic->getValue();
|
||||
if (!updateFlag) { //If it's the first packet of OTA since bootup, begin OTA
|
||||
//Serial.println("Begin FW Update");
|
||||
esp_ota_begin(esp_ota_get_next_update_partition(NULL), OTA_SIZE_UNKNOWN, &otaHandler);
|
||||
if (!updateFlag) { // If it's the first packet of OTA since bootup, begin OTA
|
||||
// Serial.println("Begin FW Update");
|
||||
esp_ota_begin(esp_ota_get_next_update_partition(NULL), OTA_SIZE_UNKNOWN,
|
||||
&otaHandler);
|
||||
updateFlag = true;
|
||||
status = STATUS_UPDATING;
|
||||
status = STATUS_UPDATING;
|
||||
}
|
||||
if (_p_ble != NULL)
|
||||
{
|
||||
if (rxData.length() > 0)
|
||||
{
|
||||
if (_p_ble != NULL) {
|
||||
if (rxData.length() > 0) {
|
||||
esp_ota_write(otaHandler, rxData.c_str(), rxData.length());
|
||||
bytesReceived = bytesReceived + rxData.length();
|
||||
if (rxData.length() != FULL_PACKET)
|
||||
{
|
||||
if (rxData.length() != FULL_PACKET) {
|
||||
esp_ota_end(otaHandler);
|
||||
//Serial.println("End FW Update");
|
||||
if (ESP_OK == esp_ota_set_boot_partition(esp_ota_get_next_update_partition(NULL))) {
|
||||
status = STATUS_READY;
|
||||
}
|
||||
else {
|
||||
//Serial.println("Upload Error");
|
||||
// Serial.println("End FW Update");
|
||||
if (ESP_OK == esp_ota_set_boot_partition(
|
||||
esp_ota_get_next_update_partition(NULL))) {
|
||||
status = STATUS_READY;
|
||||
} else {
|
||||
// Serial.println("Upload Error");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t txData[5] = {1, 2, 3, 4, 5};
|
||||
//delay(1000);
|
||||
pCharacteristic->setValue((uint8_t*)txData, 5);
|
||||
// delay(1000);
|
||||
pCharacteristic->setValue((uint8_t *)txData, 5);
|
||||
pCharacteristic->notify();
|
||||
}
|
||||
|
||||
//
|
||||
// Constructor
|
||||
BLE::BLE(void) {
|
||||
|
||||
}
|
||||
BLE::BLE(void) {}
|
||||
|
||||
//
|
||||
// Destructor
|
||||
BLE::~BLE(void)
|
||||
{
|
||||
|
||||
}
|
||||
BLE::~BLE(void) {}
|
||||
|
||||
//
|
||||
// begin
|
||||
bool BLE::begin(const char* localName = "Watchy BLE OTA") {
|
||||
bool BLE::begin(const char *localName = "Watchy BLE OTA") {
|
||||
// Create the BLE Device
|
||||
BLEDevice::init(localName);
|
||||
|
||||
|
@ -103,28 +89,21 @@ bool BLE::begin(const char* localName = "Watchy BLE OTA") {
|
|||
|
||||
// Create the BLE Service
|
||||
pESPOTAService = pServer->createService(SERVICE_UUID_ESPOTA);
|
||||
pService = pServer->createService(SERVICE_UUID_OTA);
|
||||
pService = pServer->createService(SERVICE_UUID_OTA);
|
||||
|
||||
// Create a BLE Characteristic
|
||||
pESPOTAIdCharacteristic = pESPOTAService->createCharacteristic(
|
||||
CHARACTERISTIC_UUID_ID,
|
||||
BLECharacteristic::PROPERTY_READ
|
||||
);
|
||||
CHARACTERISTIC_UUID_ID, BLECharacteristic::PROPERTY_READ);
|
||||
|
||||
pVersionCharacteristic = pService->createCharacteristic(
|
||||
CHARACTERISTIC_UUID_HW_VERSION,
|
||||
BLECharacteristic::PROPERTY_READ
|
||||
);
|
||||
CHARACTERISTIC_UUID_HW_VERSION, BLECharacteristic::PROPERTY_READ);
|
||||
|
||||
pWatchFaceNameCharacteristic = pService->createCharacteristic(
|
||||
CHARACTERISTIC_UUID_WATCHFACE_NAME,
|
||||
BLECharacteristic::PROPERTY_READ
|
||||
);
|
||||
CHARACTERISTIC_UUID_WATCHFACE_NAME, BLECharacteristic::PROPERTY_READ);
|
||||
|
||||
pOtaCharacteristic = pService->createCharacteristic(
|
||||
CHARACTERISTIC_UUID_FW,
|
||||
BLECharacteristic::PROPERTY_NOTIFY | BLECharacteristic::PROPERTY_WRITE
|
||||
);
|
||||
CHARACTERISTIC_UUID_FW,
|
||||
BLECharacteristic::PROPERTY_NOTIFY | BLECharacteristic::PROPERTY_WRITE);
|
||||
|
||||
pOtaCharacteristic->addDescriptor(new BLE2902());
|
||||
pOtaCharacteristic->setCallbacks(new otaCallback(this));
|
||||
|
@ -137,17 +116,15 @@ bool BLE::begin(const char* localName = "Watchy BLE OTA") {
|
|||
pServer->getAdvertising()->addServiceUUID(SERVICE_UUID_ESPOTA);
|
||||
pServer->getAdvertising()->start();
|
||||
|
||||
uint8_t hardwareVersion[5] = {HARDWARE_VERSION_MAJOR, HARDWARE_VERSION_MINOR, SOFTWARE_VERSION_MAJOR, SOFTWARE_VERSION_MINOR, SOFTWARE_VERSION_PATCH};
|
||||
pVersionCharacteristic->setValue((uint8_t*)hardwareVersion, 5);
|
||||
uint8_t hardwareVersion[5] = {HARDWARE_VERSION_MAJOR, HARDWARE_VERSION_MINOR,
|
||||
SOFTWARE_VERSION_MAJOR, SOFTWARE_VERSION_MINOR,
|
||||
SOFTWARE_VERSION_PATCH};
|
||||
pVersionCharacteristic->setValue((uint8_t *)hardwareVersion, 5);
|
||||
pWatchFaceNameCharacteristic->setValue("Watchy 7 Segment");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
int BLE::updateStatus(){
|
||||
return status;
|
||||
}
|
||||
int BLE::updateStatus() { return status; }
|
||||
|
||||
int BLE::howManyBytes(){
|
||||
return bytesReceived;
|
||||
}
|
||||
int BLE::howManyBytes() { return bytesReceived; }
|
36
src/BLE.h
36
src/BLE.h
|
@ -3,10 +3,10 @@
|
|||
|
||||
#include "Arduino.h"
|
||||
|
||||
#include <BLE2902.h>
|
||||
#include <BLEDevice.h>
|
||||
#include <BLEServer.h>
|
||||
#include <BLEUtils.h>
|
||||
#include <BLE2902.h>
|
||||
|
||||
#include "esp_ota_ops.h"
|
||||
|
||||
|
@ -14,29 +14,27 @@
|
|||
|
||||
class BLE;
|
||||
|
||||
class BLE
|
||||
{
|
||||
public:
|
||||
class BLE {
|
||||
public:
|
||||
BLE(void);
|
||||
~BLE(void);
|
||||
|
||||
BLE(void);
|
||||
~BLE(void);
|
||||
bool begin(const char *localName);
|
||||
int updateStatus();
|
||||
int howManyBytes();
|
||||
|
||||
bool begin(const char* localName);
|
||||
int updateStatus();
|
||||
int howManyBytes();
|
||||
|
||||
private:
|
||||
String local_name;
|
||||
private:
|
||||
String local_name;
|
||||
|
||||
BLEServer *pServer = NULL;
|
||||
BLEServer *pServer = NULL;
|
||||
|
||||
BLEService *pESPOTAService = NULL;
|
||||
BLECharacteristic * pESPOTAIdCharacteristic = NULL;
|
||||
BLEService *pESPOTAService = NULL;
|
||||
BLECharacteristic *pESPOTAIdCharacteristic = NULL;
|
||||
|
||||
BLEService *pService = NULL;
|
||||
BLECharacteristic * pVersionCharacteristic = NULL;
|
||||
BLECharacteristic * pOtaCharacteristic = NULL;
|
||||
BLECharacteristic * pWatchFaceNameCharacteristic = NULL;
|
||||
BLEService *pService = NULL;
|
||||
BLECharacteristic *pVersionCharacteristic = NULL;
|
||||
BLECharacteristic *pOtaCharacteristic = NULL;
|
||||
BLECharacteristic *pWatchFaceNameCharacteristic = NULL;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
File diff suppressed because it is too large
Load Diff
1502
src/Watchy.cpp
1502
src/Watchy.cpp
File diff suppressed because it is too large
Load Diff
133
src/Watchy.h
133
src/Watchy.h
|
@ -1,81 +1,86 @@
|
|||
#ifndef WATCHY_H
|
||||
#define WATCHY_H
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <WiFiManager.h>
|
||||
#include <HTTPClient.h>
|
||||
#include <NTPClient.h>
|
||||
#include <WiFiUdp.h>
|
||||
#include <Arduino_JSON.h>
|
||||
#include <GxEPD2_BW.h>
|
||||
#include <Wire.h>
|
||||
#include <Fonts/FreeMonoBold9pt7b.h>
|
||||
#include "BLE.h"
|
||||
#include "DSEG7_Classic_Bold_53.h"
|
||||
#include "WatchyRTC.h"
|
||||
#include "BLE.h"
|
||||
#include "bma.h"
|
||||
#include "config.h"
|
||||
#include <Arduino.h>
|
||||
#include <Arduino_JSON.h>
|
||||
#include <Fonts/FreeMonoBold9pt7b.h>
|
||||
#include <GxEPD2_BW.h>
|
||||
#include <HTTPClient.h>
|
||||
#include <NTPClient.h>
|
||||
#include <WiFiManager.h>
|
||||
#include <WiFiUdp.h>
|
||||
#include <Wire.h>
|
||||
|
||||
typedef struct weatherData{
|
||||
int8_t temperature;
|
||||
int16_t weatherConditionCode;
|
||||
bool isMetric;
|
||||
String weatherDescription;
|
||||
}weatherData;
|
||||
typedef struct weatherData {
|
||||
int8_t temperature;
|
||||
int16_t weatherConditionCode;
|
||||
bool isMetric;
|
||||
String weatherDescription;
|
||||
} weatherData;
|
||||
|
||||
typedef struct watchySettings{
|
||||
//Weather Settings
|
||||
String cityID;
|
||||
String weatherAPIKey;
|
||||
String weatherURL;
|
||||
String weatherUnit;
|
||||
String weatherLang;
|
||||
int8_t weatherUpdateInterval;
|
||||
//NTP Settings
|
||||
String ntpServer;
|
||||
int gmtOffset;
|
||||
int dstOffset;
|
||||
}watchySettings;
|
||||
typedef struct watchySettings {
|
||||
// Weather Settings
|
||||
String cityID;
|
||||
String weatherAPIKey;
|
||||
String weatherURL;
|
||||
String weatherUnit;
|
||||
String weatherLang;
|
||||
int8_t weatherUpdateInterval;
|
||||
// NTP Settings
|
||||
String ntpServer;
|
||||
int gmtOffset;
|
||||
int dstOffset;
|
||||
} watchySettings;
|
||||
|
||||
class Watchy {
|
||||
public:
|
||||
static WatchyRTC RTC;
|
||||
static GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display;
|
||||
tmElements_t currentTime;
|
||||
watchySettings settings;
|
||||
public:
|
||||
explicit Watchy(const watchySettings& s) : settings(s){} //constructor
|
||||
void init(String datetime = "");
|
||||
void deepSleep();
|
||||
static void displayBusyCallback(const void*);
|
||||
float getBatteryVoltage();
|
||||
void vibMotor(uint8_t intervalMs = 100, uint8_t length = 20);
|
||||
public:
|
||||
static WatchyRTC RTC;
|
||||
static GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display;
|
||||
tmElements_t currentTime;
|
||||
watchySettings settings;
|
||||
|
||||
void handleButtonPress();
|
||||
void showMenu(byte menuIndex, bool partialRefresh);
|
||||
void showFastMenu(byte menuIndex);
|
||||
void showAbout();
|
||||
void showBuzz();
|
||||
void showAccelerometer();
|
||||
void showUpdateFW();
|
||||
void showSyncNTP();
|
||||
bool syncNTP();
|
||||
bool syncNTP(long gmt, int dst, String ntpServer);
|
||||
void setTime();
|
||||
void setupWifi();
|
||||
bool connectWiFi();
|
||||
weatherData getWeatherData();
|
||||
weatherData getWeatherData(String cityID, String units, String lang, String url, String apiKey, uint8_t updateInterval);
|
||||
void updateFWBegin();
|
||||
public:
|
||||
explicit Watchy(const watchySettings &s) : settings(s) {} // constructor
|
||||
void init(String datetime = "");
|
||||
void deepSleep();
|
||||
static void displayBusyCallback(const void *);
|
||||
float getBatteryVoltage();
|
||||
void vibMotor(uint8_t intervalMs = 100, uint8_t length = 20);
|
||||
|
||||
void showWatchFace(bool partialRefresh);
|
||||
virtual void drawWatchFace(); //override this method for different watch faces
|
||||
void handleButtonPress();
|
||||
void showMenu(byte menuIndex, bool partialRefresh);
|
||||
void showFastMenu(byte menuIndex);
|
||||
void showAbout();
|
||||
void showBuzz();
|
||||
void showAccelerometer();
|
||||
void showUpdateFW();
|
||||
void showSyncNTP();
|
||||
bool syncNTP();
|
||||
bool syncNTP(long gmt, int dst, String ntpServer);
|
||||
void setTime();
|
||||
void setupWifi();
|
||||
bool connectWiFi();
|
||||
weatherData getWeatherData();
|
||||
weatherData getWeatherData(String cityID, String units, String lang,
|
||||
String url, String apiKey, uint8_t updateInterval);
|
||||
void updateFWBegin();
|
||||
|
||||
private:
|
||||
void _bmaConfig();
|
||||
static void _configModeCallback(WiFiManager *myWiFiManager);
|
||||
static uint16_t _readRegister(uint8_t address, uint8_t reg, uint8_t *data, uint16_t len);
|
||||
static uint16_t _writeRegister(uint8_t address, uint8_t reg, uint8_t *data, uint16_t len);
|
||||
void showWatchFace(bool partialRefresh);
|
||||
virtual void drawWatchFace(); // override this method for different watch
|
||||
// faces
|
||||
|
||||
private:
|
||||
void _bmaConfig();
|
||||
static void _configModeCallback(WiFiManager *myWiFiManager);
|
||||
static uint16_t _readRegister(uint8_t address, uint8_t reg, uint8_t *data,
|
||||
uint16_t len);
|
||||
static uint16_t _writeRegister(uint8_t address, uint8_t reg, uint8_t *data,
|
||||
uint16_t len);
|
||||
};
|
||||
|
||||
extern RTC_DATA_ATTR int guiState;
|
||||
|
|
|
@ -1,133 +1,149 @@
|
|||
#include "WatchyRTC.h"
|
||||
|
||||
WatchyRTC::WatchyRTC()
|
||||
: rtc_ds(false) {}
|
||||
WatchyRTC::WatchyRTC() : rtc_ds(false) {}
|
||||
|
||||
void WatchyRTC::init(){
|
||||
byte error;
|
||||
Wire.beginTransmission(RTC_DS_ADDR);
|
||||
void WatchyRTC::init() {
|
||||
byte error;
|
||||
Wire.beginTransmission(RTC_DS_ADDR);
|
||||
error = Wire.endTransmission();
|
||||
if (error == 0) {
|
||||
rtcType = DS3231;
|
||||
} else {
|
||||
Wire.beginTransmission(RTC_PCF_ADDR);
|
||||
error = Wire.endTransmission();
|
||||
if(error == 0){
|
||||
rtcType = DS3231;
|
||||
}else{
|
||||
Wire.beginTransmission(RTC_PCF_ADDR);
|
||||
error = Wire.endTransmission();
|
||||
if(error == 0){
|
||||
rtcType = PCF8563;
|
||||
}else{
|
||||
//RTC Error
|
||||
}
|
||||
if (error == 0) {
|
||||
rtcType = PCF8563;
|
||||
} else {
|
||||
// RTC Error
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void WatchyRTC::config(String datetime){ //String datetime format is YYYY:MM:DD:HH:MM:SS
|
||||
if(rtcType == DS3231){
|
||||
_DSConfig(datetime);
|
||||
}else{
|
||||
_PCFConfig(datetime);
|
||||
}
|
||||
void WatchyRTC::config(
|
||||
String datetime) { // String datetime format is YYYY:MM:DD:HH:MM:SS
|
||||
if (rtcType == DS3231) {
|
||||
_DSConfig(datetime);
|
||||
} else {
|
||||
_PCFConfig(datetime);
|
||||
}
|
||||
}
|
||||
|
||||
void WatchyRTC::clearAlarm(){
|
||||
if(rtcType == DS3231){
|
||||
rtc_ds.alarm(DS3232RTC::ALARM_2);
|
||||
}else{
|
||||
int nextAlarmMinute = 0;
|
||||
rtc_pcf.clearAlarm(); //resets the alarm flag in the RTC
|
||||
nextAlarmMinute = rtc_pcf.getMinute();
|
||||
nextAlarmMinute = (nextAlarmMinute == 59) ? 0 : (nextAlarmMinute + 1); //set alarm to trigger 1 minute from now
|
||||
rtc_pcf.setAlarm(nextAlarmMinute, 99, 99, 99);
|
||||
}
|
||||
void WatchyRTC::clearAlarm() {
|
||||
if (rtcType == DS3231) {
|
||||
rtc_ds.alarm(DS3232RTC::ALARM_2);
|
||||
} else {
|
||||
int nextAlarmMinute = 0;
|
||||
rtc_pcf.clearAlarm(); // resets the alarm flag in the RTC
|
||||
nextAlarmMinute = rtc_pcf.getMinute();
|
||||
nextAlarmMinute =
|
||||
(nextAlarmMinute == 59)
|
||||
? 0
|
||||
: (nextAlarmMinute + 1); // set alarm to trigger 1 minute from now
|
||||
rtc_pcf.setAlarm(nextAlarmMinute, 99, 99, 99);
|
||||
}
|
||||
}
|
||||
|
||||
void WatchyRTC::read(tmElements_t &tm){
|
||||
if(rtcType == DS3231){
|
||||
rtc_ds.read(tm);
|
||||
}else{
|
||||
tm.Year = y2kYearToTm(rtc_pcf.getYear());
|
||||
tm.Month = rtc_pcf.getMonth();
|
||||
tm.Day = rtc_pcf.getDay();
|
||||
tm.Wday = rtc_pcf.getWeekday() + 1; //TimeLib & DS3231 has Wday range of 1-7, but PCF8563 stores day of week in 0-6 range
|
||||
tm.Hour = rtc_pcf.getHour();
|
||||
tm.Minute = rtc_pcf.getMinute();
|
||||
tm.Second = rtc_pcf.getSecond();
|
||||
}
|
||||
void WatchyRTC::read(tmElements_t &tm) {
|
||||
if (rtcType == DS3231) {
|
||||
rtc_ds.read(tm);
|
||||
} else {
|
||||
tm.Year = y2kYearToTm(rtc_pcf.getYear());
|
||||
tm.Month = rtc_pcf.getMonth();
|
||||
tm.Day = rtc_pcf.getDay();
|
||||
tm.Wday =
|
||||
rtc_pcf.getWeekday() + 1; // TimeLib & DS3231 has Wday range of 1-7, but
|
||||
// PCF8563 stores day of week in 0-6 range
|
||||
tm.Hour = rtc_pcf.getHour();
|
||||
tm.Minute = rtc_pcf.getMinute();
|
||||
tm.Second = rtc_pcf.getSecond();
|
||||
}
|
||||
}
|
||||
|
||||
void WatchyRTC::set(tmElements_t tm){
|
||||
if(rtcType == DS3231){
|
||||
time_t t = makeTime(tm);
|
||||
rtc_ds.set(t);
|
||||
}else{
|
||||
time_t t = makeTime(tm); //make and break to calculate tm.Wday
|
||||
breakTime(t, tm);
|
||||
//day, weekday, month, century(1=1900, 0=2000), year(0-99)
|
||||
rtc_pcf.setDate(tm.Day, tm.Wday - 1, tm.Month, 0, tmYearToY2k(tm.Year)); //TimeLib & DS3231 has Wday range of 1-7, but PCF8563 stores day of week in 0-6 range
|
||||
//hr, min, sec
|
||||
rtc_pcf.setTime(tm.Hour, tm.Minute, tm.Second);
|
||||
clearAlarm();
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t WatchyRTC::temperature(){
|
||||
if(rtcType == DS3231){
|
||||
return rtc_ds.temperature();
|
||||
}else{
|
||||
return 255; //error
|
||||
}
|
||||
}
|
||||
|
||||
void WatchyRTC::_DSConfig(String datetime){ //String datetime is YYYY:MM:DD:HH:MM:SS
|
||||
if(datetime != ""){
|
||||
tmElements_t tm;
|
||||
tm.Year = CalendarYrToTm(_getValue(datetime, ':', 0).toInt()); //YYYY - 1970
|
||||
tm.Month = _getValue(datetime, ':', 1).toInt();
|
||||
tm.Day = _getValue(datetime, ':', 2).toInt();
|
||||
tm.Hour = _getValue(datetime, ':', 3).toInt();
|
||||
tm.Minute = _getValue(datetime, ':', 4).toInt();
|
||||
tm.Second = _getValue(datetime, ':', 5).toInt();
|
||||
time_t t = makeTime(tm);
|
||||
rtc_ds.set(t);
|
||||
}
|
||||
//https://github.com/JChristensen/DS3232RTC
|
||||
rtc_ds.squareWave(DS3232RTC::SQWAVE_NONE); //disable square wave output
|
||||
rtc_ds.setAlarm(DS3232RTC::ALM2_EVERY_MINUTE, 0, 0, 0, 0); //alarm wakes up Watchy every minute
|
||||
rtc_ds.alarmInterrupt(DS3232RTC::ALARM_2, true); //enable alarm interrupt
|
||||
}
|
||||
|
||||
void WatchyRTC::_PCFConfig(String datetime){ //String datetime is YYYY:MM:DD:HH:MM:SS
|
||||
if(datetime != ""){
|
||||
tmElements_t tm;
|
||||
tm.Year = CalendarYrToTm(_getValue(datetime, ':', 0).toInt()); //YYYY - 1970
|
||||
tm.Month = _getValue(datetime, ':', 1).toInt();
|
||||
tm.Day = _getValue(datetime, ':', 2).toInt();
|
||||
tm.Hour = _getValue(datetime, ':', 3).toInt();
|
||||
tm.Minute = _getValue(datetime, ':', 4).toInt();
|
||||
tm.Second = _getValue(datetime, ':', 5).toInt();
|
||||
time_t t = makeTime(tm); //make and break to calculate tm.Wday
|
||||
breakTime(t, tm);
|
||||
//day, weekday, month, century(1=1900, 0=2000), year(0-99)
|
||||
rtc_pcf.setDate(tm.Day, tm.Wday - 1, tm.Month, 0, tmYearToY2k(tm.Year)); //TimeLib & DS3231 has Wday range of 1-7, but PCF8563 stores day of week in 0-6 range
|
||||
//hr, min, sec
|
||||
rtc_pcf.setTime(tm.Hour, tm.Minute, tm.Second);
|
||||
}
|
||||
//on POR event, PCF8563 sets month to 0, which will give an error since months are 1-12
|
||||
void WatchyRTC::set(tmElements_t tm) {
|
||||
if (rtcType == DS3231) {
|
||||
time_t t = makeTime(tm);
|
||||
rtc_ds.set(t);
|
||||
} else {
|
||||
time_t t = makeTime(tm); // make and break to calculate tm.Wday
|
||||
breakTime(t, tm);
|
||||
// day, weekday, month, century(1=1900, 0=2000), year(0-99)
|
||||
rtc_pcf.setDate(
|
||||
tm.Day, tm.Wday - 1, tm.Month, 0,
|
||||
tmYearToY2k(tm.Year)); // TimeLib & DS3231 has Wday range of 1-7, but
|
||||
// PCF8563 stores day of week in 0-6 range
|
||||
// hr, min, sec
|
||||
rtc_pcf.setTime(tm.Hour, tm.Minute, tm.Second);
|
||||
clearAlarm();
|
||||
}
|
||||
}
|
||||
|
||||
String WatchyRTC::_getValue(String data, char separator, int index)
|
||||
{
|
||||
int found = 0;
|
||||
int strIndex[] = {0, -1};
|
||||
int maxIndex = data.length()-1;
|
||||
uint8_t WatchyRTC::temperature() {
|
||||
if (rtcType == DS3231) {
|
||||
return rtc_ds.temperature();
|
||||
} else {
|
||||
return 255; // error
|
||||
}
|
||||
}
|
||||
|
||||
for(int i=0; i<=maxIndex && found<=index; i++){
|
||||
if(data.charAt(i)==separator || i==maxIndex){
|
||||
found++;
|
||||
strIndex[0] = strIndex[1]+1;
|
||||
strIndex[1] = (i == maxIndex) ? i+1 : i;
|
||||
void WatchyRTC::_DSConfig(
|
||||
String datetime) { // String datetime is YYYY:MM:DD:HH:MM:SS
|
||||
if (datetime != "") {
|
||||
tmElements_t tm;
|
||||
tm.Year = CalendarYrToTm(_getValue(datetime, ':', 0).toInt()); // YYYY -
|
||||
// 1970
|
||||
tm.Month = _getValue(datetime, ':', 1).toInt();
|
||||
tm.Day = _getValue(datetime, ':', 2).toInt();
|
||||
tm.Hour = _getValue(datetime, ':', 3).toInt();
|
||||
tm.Minute = _getValue(datetime, ':', 4).toInt();
|
||||
tm.Second = _getValue(datetime, ':', 5).toInt();
|
||||
time_t t = makeTime(tm);
|
||||
rtc_ds.set(t);
|
||||
}
|
||||
// https://github.com/JChristensen/DS3232RTC
|
||||
rtc_ds.squareWave(DS3232RTC::SQWAVE_NONE); // disable square wave output
|
||||
rtc_ds.setAlarm(DS3232RTC::ALM2_EVERY_MINUTE, 0, 0, 0,
|
||||
0); // alarm wakes up Watchy every minute
|
||||
rtc_ds.alarmInterrupt(DS3232RTC::ALARM_2, true); // enable alarm interrupt
|
||||
}
|
||||
|
||||
void WatchyRTC::_PCFConfig(
|
||||
String datetime) { // String datetime is YYYY:MM:DD:HH:MM:SS
|
||||
if (datetime != "") {
|
||||
tmElements_t tm;
|
||||
tm.Year = CalendarYrToTm(_getValue(datetime, ':', 0).toInt()); // YYYY -
|
||||
// 1970
|
||||
tm.Month = _getValue(datetime, ':', 1).toInt();
|
||||
tm.Day = _getValue(datetime, ':', 2).toInt();
|
||||
tm.Hour = _getValue(datetime, ':', 3).toInt();
|
||||
tm.Minute = _getValue(datetime, ':', 4).toInt();
|
||||
tm.Second = _getValue(datetime, ':', 5).toInt();
|
||||
time_t t = makeTime(tm); // make and break to calculate tm.Wday
|
||||
breakTime(t, tm);
|
||||
// day, weekday, month, century(1=1900, 0=2000), year(0-99)
|
||||
rtc_pcf.setDate(
|
||||
tm.Day, tm.Wday - 1, tm.Month, 0,
|
||||
tmYearToY2k(tm.Year)); // TimeLib & DS3231 has Wday range of 1-7, but
|
||||
// PCF8563 stores day of week in 0-6 range
|
||||
// hr, min, sec
|
||||
rtc_pcf.setTime(tm.Hour, tm.Minute, tm.Second);
|
||||
}
|
||||
// on POR event, PCF8563 sets month to 0, which will give an error since
|
||||
// months are 1-12
|
||||
clearAlarm();
|
||||
}
|
||||
|
||||
String WatchyRTC::_getValue(String data, char separator, int index) {
|
||||
int found = 0;
|
||||
int strIndex[] = {0, -1};
|
||||
int maxIndex = data.length() - 1;
|
||||
|
||||
for (int i = 0; i <= maxIndex && found <= index; i++) {
|
||||
if (data.charAt(i) == separator || i == maxIndex) {
|
||||
found++;
|
||||
strIndex[0] = strIndex[1] + 1;
|
||||
strIndex[1] = (i == maxIndex) ? i + 1 : i;
|
||||
}
|
||||
}
|
||||
|
||||
return found>index ? data.substring(strIndex[0], strIndex[1]) : "";
|
||||
return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
|
||||
}
|
||||
|
|
|
@ -1,36 +1,38 @@
|
|||
#ifndef WATCHY_RTC_H
|
||||
#define WATCHY_RTC_H
|
||||
|
||||
#include <DS3232RTC.h>
|
||||
#include <Rtc_Pcf8563.h>
|
||||
#include "config.h"
|
||||
#include "time.h"
|
||||
#include <DS3232RTC.h>
|
||||
#include <Rtc_Pcf8563.h>
|
||||
|
||||
#define DS3231 1
|
||||
#define PCF8563 2
|
||||
#define RTC_DS_ADDR 0x68
|
||||
#define RTC_PCF_ADDR 0x51
|
||||
#define YEAR_OFFSET_DS 1970
|
||||
#define DS3231 1
|
||||
#define PCF8563 2
|
||||
#define RTC_DS_ADDR 0x68
|
||||
#define RTC_PCF_ADDR 0x51
|
||||
#define YEAR_OFFSET_DS 1970
|
||||
#define YEAR_OFFSET_PCF 2000
|
||||
|
||||
class WatchyRTC {
|
||||
public:
|
||||
DS3232RTC rtc_ds;
|
||||
Rtc_Pcf8563 rtc_pcf;
|
||||
uint8_t rtcType;
|
||||
public:
|
||||
WatchyRTC();
|
||||
void init();
|
||||
void config(String datetime); //String datetime format is YYYY:MM:DD:HH:MM:SS
|
||||
void clearAlarm();
|
||||
void read(tmElements_t &tm);
|
||||
void set(tmElements_t tm);
|
||||
uint8_t temperature();
|
||||
private:
|
||||
void _DSConfig(String datetime);
|
||||
void _PCFConfig(String datetime);
|
||||
int _getDayOfWeek(int d, int m, int y);
|
||||
String _getValue(String data, char separator, int index);
|
||||
public:
|
||||
DS3232RTC rtc_ds;
|
||||
Rtc_Pcf8563 rtc_pcf;
|
||||
uint8_t rtcType;
|
||||
|
||||
public:
|
||||
WatchyRTC();
|
||||
void init();
|
||||
void config(String datetime); // String datetime format is YYYY:MM:DD:HH:MM:SS
|
||||
void clearAlarm();
|
||||
void read(tmElements_t &tm);
|
||||
void set(tmElements_t tm);
|
||||
uint8_t temperature();
|
||||
|
||||
private:
|
||||
void _DSConfig(String datetime);
|
||||
void _PCFConfig(String datetime);
|
||||
int _getDayOfWeek(int d, int m, int y);
|
||||
String _getValue(String data, char separator, int index);
|
||||
};
|
||||
|
||||
#endif
|
544
src/bma.cpp
544
src/bma.cpp
|
@ -2,328 +2,282 @@
|
|||
|
||||
#define DEBUGPORT Serial
|
||||
#ifdef DEBUGPORT
|
||||
#define DEBUG(...) DEBUGPORT.printf(__VA_ARGS__)
|
||||
#define DEBUG(...) DEBUGPORT.printf(__VA_ARGS__)
|
||||
#else
|
||||
#define DEBUG(...)
|
||||
#endif
|
||||
|
||||
BMA423::BMA423()
|
||||
{
|
||||
__readRegisterFptr = nullptr;
|
||||
__writeRegisterFptr = nullptr;
|
||||
__delayCallBlackFptr = nullptr;
|
||||
__init = false;
|
||||
BMA423::BMA423() {
|
||||
__readRegisterFptr = nullptr;
|
||||
__writeRegisterFptr = nullptr;
|
||||
__delayCallBlackFptr = nullptr;
|
||||
__init = false;
|
||||
}
|
||||
|
||||
BMA423::~BMA423()
|
||||
{
|
||||
|
||||
}
|
||||
BMA423::~BMA423() {}
|
||||
|
||||
bool BMA423::begin(bma4_com_fptr_t readCallBlack,
|
||||
bma4_com_fptr_t writeCallBlack,
|
||||
bma4_delay_fptr_t delayCallBlack,
|
||||
uint8_t address)
|
||||
{
|
||||
bma4_delay_fptr_t delayCallBlack, uint8_t address) {
|
||||
|
||||
if (__init ||
|
||||
readCallBlack == nullptr ||
|
||||
writeCallBlack == nullptr ||
|
||||
delayCallBlack == nullptr) {
|
||||
return true;
|
||||
}
|
||||
|
||||
__readRegisterFptr = readCallBlack;
|
||||
__writeRegisterFptr = writeCallBlack;
|
||||
__delayCallBlackFptr = delayCallBlack;
|
||||
|
||||
__devFptr.dev_addr = address;
|
||||
__devFptr.interface = BMA4_I2C_INTERFACE;
|
||||
__devFptr.bus_read = readCallBlack;
|
||||
__devFptr.bus_write = writeCallBlack;
|
||||
__devFptr.delay = delayCallBlack;
|
||||
__devFptr.read_write_len = 8;
|
||||
__devFptr.resolution = 12;
|
||||
__devFptr.feature_len = BMA423_FEATURE_SIZE;
|
||||
|
||||
softReset();
|
||||
|
||||
__delayCallBlackFptr(20);
|
||||
|
||||
if (bma423_init(&__devFptr) != BMA4_OK) {
|
||||
DEBUG("BMA423 FAIL\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (bma423_write_config_file(&__devFptr) != BMA4_OK) {
|
||||
DEBUG("BMA423 Write Config FAIL\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
__init = true;
|
||||
|
||||
struct bma4_int_pin_config config ;
|
||||
config.edge_ctrl = BMA4_LEVEL_TRIGGER;
|
||||
config.lvl = BMA4_ACTIVE_HIGH;
|
||||
config.od = BMA4_PUSH_PULL;
|
||||
config.output_en = BMA4_OUTPUT_ENABLE;
|
||||
config.input_en = BMA4_INPUT_DISABLE;
|
||||
|
||||
|
||||
if (bma4_set_int_pin_config(&config, BMA4_INTR1_MAP, &__devFptr) != BMA4_OK) {
|
||||
DEBUG("BMA423 SET INT FAIL\n");
|
||||
return false;
|
||||
}
|
||||
if (__init || readCallBlack == nullptr || writeCallBlack == nullptr ||
|
||||
delayCallBlack == nullptr) {
|
||||
return true;
|
||||
}
|
||||
|
||||
__readRegisterFptr = readCallBlack;
|
||||
__writeRegisterFptr = writeCallBlack;
|
||||
__delayCallBlackFptr = delayCallBlack;
|
||||
|
||||
__devFptr.dev_addr = address;
|
||||
__devFptr.interface = BMA4_I2C_INTERFACE;
|
||||
__devFptr.bus_read = readCallBlack;
|
||||
__devFptr.bus_write = writeCallBlack;
|
||||
__devFptr.delay = delayCallBlack;
|
||||
__devFptr.read_write_len = 8;
|
||||
__devFptr.resolution = 12;
|
||||
__devFptr.feature_len = BMA423_FEATURE_SIZE;
|
||||
|
||||
softReset();
|
||||
|
||||
__delayCallBlackFptr(20);
|
||||
|
||||
if (bma423_init(&__devFptr) != BMA4_OK) {
|
||||
DEBUG("BMA423 FAIL\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (bma423_write_config_file(&__devFptr) != BMA4_OK) {
|
||||
DEBUG("BMA423 Write Config FAIL\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
__init = true;
|
||||
|
||||
struct bma4_int_pin_config config;
|
||||
config.edge_ctrl = BMA4_LEVEL_TRIGGER;
|
||||
config.lvl = BMA4_ACTIVE_HIGH;
|
||||
config.od = BMA4_PUSH_PULL;
|
||||
config.output_en = BMA4_OUTPUT_ENABLE;
|
||||
config.input_en = BMA4_INPUT_DISABLE;
|
||||
|
||||
if (bma4_set_int_pin_config(&config, BMA4_INTR1_MAP, &__devFptr) != BMA4_OK) {
|
||||
DEBUG("BMA423 SET INT FAIL\n");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void BMA423::softReset()
|
||||
{
|
||||
uint8_t reg = BMA4_RESET_ADDR;
|
||||
__writeRegisterFptr(BMA4_I2C_ADDR_PRIMARY, BMA4_RESET_SET_MASK, ®, 1);
|
||||
void BMA423::softReset() {
|
||||
uint8_t reg = BMA4_RESET_ADDR;
|
||||
__writeRegisterFptr(BMA4_I2C_ADDR_PRIMARY, BMA4_RESET_SET_MASK, ®, 1);
|
||||
}
|
||||
|
||||
void BMA423::shutDown()
|
||||
{
|
||||
bma4_set_advance_power_save(BMA4_DISABLE, &__devFptr);
|
||||
void BMA423::shutDown() {
|
||||
bma4_set_advance_power_save(BMA4_DISABLE, &__devFptr);
|
||||
}
|
||||
|
||||
void BMA423::wakeUp()
|
||||
{
|
||||
bma4_set_advance_power_save(BMA4_ENABLE, &__devFptr);
|
||||
void BMA423::wakeUp() { bma4_set_advance_power_save(BMA4_ENABLE, &__devFptr); }
|
||||
|
||||
uint16_t BMA423::getErrorCode() {
|
||||
struct bma4_err_reg err;
|
||||
uint16_t rslt = bma4_get_error_status(&err, &__devFptr);
|
||||
return rslt;
|
||||
}
|
||||
|
||||
uint16_t BMA423::getErrorCode()
|
||||
{
|
||||
struct bma4_err_reg err;
|
||||
uint16_t rslt = bma4_get_error_status(&err, &__devFptr);
|
||||
return rslt;
|
||||
uint16_t BMA423::getStatus() {
|
||||
uint8_t status;
|
||||
bma4_get_status(&status, &__devFptr);
|
||||
return status;
|
||||
}
|
||||
|
||||
uint16_t BMA423::getStatus()
|
||||
{
|
||||
uint8_t status;
|
||||
bma4_get_status(&status, &__devFptr);
|
||||
return status;
|
||||
uint32_t BMA423::getSensorTime() {
|
||||
uint32_t ms;
|
||||
bma4_get_sensor_time(&ms, &__devFptr);
|
||||
return ms;
|
||||
}
|
||||
|
||||
uint32_t BMA423::getSensorTime()
|
||||
{
|
||||
uint32_t ms;
|
||||
bma4_get_sensor_time(&ms, &__devFptr);
|
||||
return ms;
|
||||
bool BMA423::selfTest() {
|
||||
return (BMA4_OK ==
|
||||
bma4_selftest_config(BMA4_ACCEL_SELFTEST_ENABLE_MSK, &__devFptr));
|
||||
}
|
||||
|
||||
bool BMA423::selfTest()
|
||||
{
|
||||
return (BMA4_OK == bma4_selftest_config(BMA4_ACCEL_SELFTEST_ENABLE_MSK, &__devFptr));
|
||||
}
|
||||
|
||||
uint8_t BMA423::getDirection()
|
||||
{
|
||||
Accel acc;
|
||||
if (bma4_read_accel_xyz(&acc, &__devFptr) != BMA4_OK) {
|
||||
return 0;
|
||||
}
|
||||
uint16_t absX = abs(acc.x);
|
||||
uint16_t absY = abs(acc.y);
|
||||
uint16_t absZ = abs(acc.z);
|
||||
|
||||
if ((absZ > absX) && (absZ > absY)) {
|
||||
if (acc.z > 0) {
|
||||
return DIRECTION_DISP_DOWN;
|
||||
} else {
|
||||
return DIRECTION_DISP_UP;
|
||||
}
|
||||
} else if ((absY > absX) && (absY > absZ)) {
|
||||
if (acc.y > 0) {
|
||||
return DIRECTION_RIGHT_EDGE;
|
||||
} else {
|
||||
return DIRECTION_LEFT_EDGE;
|
||||
}
|
||||
} else {
|
||||
if (acc.x < 0) {
|
||||
return DIRECTION_BOTTOM_EDGE;
|
||||
} else {
|
||||
return DIRECTION_TOP_EDGE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
float BMA423::readTemperature()
|
||||
{
|
||||
int32_t data = 0;
|
||||
bma4_get_temperature(&data, BMA4_DEG, &__devFptr);
|
||||
float res = (float)data / (float)BMA4_SCALE_TEMP;
|
||||
/* 0x80 - temp read from the register and 23 is the ambient temp added.
|
||||
* If the temp read from register is 0x80, it means no valid
|
||||
* information is available */
|
||||
if (((data - 23) / BMA4_SCALE_TEMP) == 0x80) {
|
||||
res = 0;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
float BMA423::readTemperatureF()
|
||||
{
|
||||
float temp = readTemperature();
|
||||
if (temp != 0) {
|
||||
temp = temp * 1.8 + 32.0;
|
||||
}
|
||||
return (temp);
|
||||
}
|
||||
|
||||
bool BMA423::getAccel(Accel &acc)
|
||||
{
|
||||
memset(&acc, 0, sizeof(acc));
|
||||
if (bma4_read_accel_xyz(&acc, &__devFptr) != BMA4_OK) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool BMA423::getAccelEnable()
|
||||
{
|
||||
uint8_t en;
|
||||
bma4_get_accel_enable(&en, &__devFptr);
|
||||
return (en & BMA4_ACCEL_ENABLE_POS) == BMA4_ACCEL_ENABLE_POS;
|
||||
}
|
||||
|
||||
bool BMA423::disableAccel()
|
||||
{
|
||||
return enableAccel(false);
|
||||
}
|
||||
|
||||
bool BMA423::enableAccel(bool en)
|
||||
{
|
||||
return (BMA4_OK == bma4_set_accel_enable(en ? BMA4_ENABLE : BMA4_DISABLE, &__devFptr));
|
||||
}
|
||||
|
||||
bool BMA423::setAccelConfig(Acfg &cfg)
|
||||
{
|
||||
return (BMA4_OK == bma4_set_accel_config(&cfg, &__devFptr));
|
||||
}
|
||||
|
||||
bool BMA423::getAccelConfig(Acfg &cfg)
|
||||
{
|
||||
return (BMA4_OK == bma4_get_accel_config(&cfg, &__devFptr));
|
||||
}
|
||||
|
||||
bool BMA423::setRemapAxes(struct bma423_axes_remap *remap_data)
|
||||
{
|
||||
return (BMA4_OK == bma423_set_remap_axes(remap_data, &__devFptr));
|
||||
}
|
||||
|
||||
bool BMA423::resetStepCounter()
|
||||
{
|
||||
return BMA4_OK == bma423_reset_step_counter(&__devFptr) ;
|
||||
}
|
||||
|
||||
uint32_t BMA423::getCounter()
|
||||
{
|
||||
uint32_t stepCount;
|
||||
if (bma423_step_counter_output(&stepCount, &__devFptr) == BMA4_OK) {
|
||||
return stepCount;
|
||||
}
|
||||
uint8_t BMA423::getDirection() {
|
||||
Accel acc;
|
||||
if (bma4_read_accel_xyz(&acc, &__devFptr) != BMA4_OK) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
uint16_t absX = abs(acc.x);
|
||||
uint16_t absY = abs(acc.y);
|
||||
uint16_t absZ = abs(acc.z);
|
||||
|
||||
bool BMA423::setINTPinConfig(struct bma4_int_pin_config config, uint8_t pinMap)
|
||||
{
|
||||
return BMA4_OK == bma4_set_int_pin_config(&config, pinMap, &__devFptr);
|
||||
}
|
||||
|
||||
bool BMA423::getINT()
|
||||
{
|
||||
return bma423_read_int_status(&__IRQ_MASK, &__devFptr) == BMA4_OK;
|
||||
}
|
||||
|
||||
uint8_t BMA423::getIRQMASK()
|
||||
{
|
||||
return __IRQ_MASK;
|
||||
}
|
||||
|
||||
bool BMA423::disableIRQ(uint16_t int_map)
|
||||
{
|
||||
return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, int_map, BMA4_DISABLE, &__devFptr));
|
||||
}
|
||||
|
||||
bool BMA423::enableIRQ(uint16_t int_map)
|
||||
{
|
||||
return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, int_map, BMA4_ENABLE, &__devFptr));
|
||||
}
|
||||
|
||||
bool BMA423::enableFeature(uint8_t feature, uint8_t enable)
|
||||
{
|
||||
if ((feature & BMA423_STEP_CNTR) == BMA423_STEP_CNTR) {
|
||||
bma423_step_detector_enable(enable ? BMA4_ENABLE : BMA4_DISABLE, &__devFptr);
|
||||
if ((absZ > absX) && (absZ > absY)) {
|
||||
if (acc.z > 0) {
|
||||
return DIRECTION_DISP_DOWN;
|
||||
} else {
|
||||
return DIRECTION_DISP_UP;
|
||||
}
|
||||
return (BMA4_OK == bma423_feature_enable(feature, enable, &__devFptr));
|
||||
}
|
||||
|
||||
bool BMA423::isStepCounter()
|
||||
{
|
||||
return (bool)(BMA423_STEP_CNTR_INT & __IRQ_MASK);
|
||||
}
|
||||
|
||||
bool BMA423::isDoubleClick()
|
||||
{
|
||||
return (bool)(BMA423_WAKEUP_INT & __IRQ_MASK);
|
||||
}
|
||||
|
||||
bool BMA423::isTilt()
|
||||
{
|
||||
return (bool)(BMA423_TILT_INT & __IRQ_MASK);
|
||||
}
|
||||
|
||||
bool BMA423::isActivity()
|
||||
{
|
||||
return (bool)(BMA423_ACTIVITY_INT & __IRQ_MASK);
|
||||
}
|
||||
|
||||
bool BMA423::isAnyNoMotion()
|
||||
{
|
||||
return (bool)(BMA423_ANY_NO_MOTION_INT & __IRQ_MASK);
|
||||
}
|
||||
|
||||
bool BMA423::enableStepCountInterrupt(bool en)
|
||||
{
|
||||
return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, BMA423_STEP_CNTR_INT, en, &__devFptr));
|
||||
}
|
||||
|
||||
bool BMA423::enableTiltInterrupt(bool en)
|
||||
{
|
||||
return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, BMA423_TILT_INT, en, &__devFptr));
|
||||
}
|
||||
|
||||
bool BMA423::enableWakeupInterrupt(bool en)
|
||||
{
|
||||
return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, BMA423_WAKEUP_INT, en, &__devFptr));
|
||||
}
|
||||
|
||||
bool BMA423::enableAnyNoMotionInterrupt(bool en)
|
||||
{
|
||||
return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, BMA423_ANY_NO_MOTION_INT, en, &__devFptr));
|
||||
}
|
||||
|
||||
bool BMA423::enableActivityInterrupt(bool en)
|
||||
{
|
||||
return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, BMA423_ACTIVITY_INT, en, &__devFptr));
|
||||
}
|
||||
|
||||
const char *BMA423::getActivity()
|
||||
{
|
||||
uint8_t activity;
|
||||
bma423_activity_output(&activity, &__devFptr);
|
||||
if (activity & BMA423_USER_STATIONARY) {
|
||||
return "BMA423_USER_STATIONARY";
|
||||
} else if (activity & BMA423_USER_WALKING) {
|
||||
return "BMA423_USER_WALKING";
|
||||
} else if (activity & BMA423_USER_RUNNING) {
|
||||
return "BMA423_USER_RUNNING";
|
||||
} else if (activity & BMA423_STATE_INVALID) {
|
||||
return "BMA423_STATE_INVALID";
|
||||
} else if ((absY > absX) && (absY > absZ)) {
|
||||
if (acc.y > 0) {
|
||||
return DIRECTION_RIGHT_EDGE;
|
||||
} else {
|
||||
return DIRECTION_LEFT_EDGE;
|
||||
}
|
||||
return "None";
|
||||
} else {
|
||||
if (acc.x < 0) {
|
||||
return DIRECTION_BOTTOM_EDGE;
|
||||
} else {
|
||||
return DIRECTION_TOP_EDGE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
float BMA423::readTemperature() {
|
||||
int32_t data = 0;
|
||||
bma4_get_temperature(&data, BMA4_DEG, &__devFptr);
|
||||
float res = (float)data / (float)BMA4_SCALE_TEMP;
|
||||
/* 0x80 - temp read from the register and 23 is the ambient temp added.
|
||||
* If the temp read from register is 0x80, it means no valid
|
||||
* information is available */
|
||||
if (((data - 23) / BMA4_SCALE_TEMP) == 0x80) {
|
||||
res = 0;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
float BMA423::readTemperatureF() {
|
||||
float temp = readTemperature();
|
||||
if (temp != 0) {
|
||||
temp = temp * 1.8 + 32.0;
|
||||
}
|
||||
return (temp);
|
||||
}
|
||||
|
||||
bool BMA423::getAccel(Accel &acc) {
|
||||
memset(&acc, 0, sizeof(acc));
|
||||
if (bma4_read_accel_xyz(&acc, &__devFptr) != BMA4_OK) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool BMA423::getAccelEnable() {
|
||||
uint8_t en;
|
||||
bma4_get_accel_enable(&en, &__devFptr);
|
||||
return (en & BMA4_ACCEL_ENABLE_POS) == BMA4_ACCEL_ENABLE_POS;
|
||||
}
|
||||
|
||||
bool BMA423::disableAccel() { return enableAccel(false); }
|
||||
|
||||
bool BMA423::enableAccel(bool en) {
|
||||
return (BMA4_OK ==
|
||||
bma4_set_accel_enable(en ? BMA4_ENABLE : BMA4_DISABLE, &__devFptr));
|
||||
}
|
||||
|
||||
bool BMA423::setAccelConfig(Acfg &cfg) {
|
||||
return (BMA4_OK == bma4_set_accel_config(&cfg, &__devFptr));
|
||||
}
|
||||
|
||||
bool BMA423::getAccelConfig(Acfg &cfg) {
|
||||
return (BMA4_OK == bma4_get_accel_config(&cfg, &__devFptr));
|
||||
}
|
||||
|
||||
bool BMA423::setRemapAxes(struct bma423_axes_remap *remap_data) {
|
||||
return (BMA4_OK == bma423_set_remap_axes(remap_data, &__devFptr));
|
||||
}
|
||||
|
||||
bool BMA423::resetStepCounter() {
|
||||
return BMA4_OK == bma423_reset_step_counter(&__devFptr);
|
||||
}
|
||||
|
||||
uint32_t BMA423::getCounter() {
|
||||
uint32_t stepCount;
|
||||
if (bma423_step_counter_output(&stepCount, &__devFptr) == BMA4_OK) {
|
||||
return stepCount;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool BMA423::setINTPinConfig(struct bma4_int_pin_config config,
|
||||
uint8_t pinMap) {
|
||||
return BMA4_OK == bma4_set_int_pin_config(&config, pinMap, &__devFptr);
|
||||
}
|
||||
|
||||
bool BMA423::getINT() {
|
||||
return bma423_read_int_status(&__IRQ_MASK, &__devFptr) == BMA4_OK;
|
||||
}
|
||||
|
||||
uint8_t BMA423::getIRQMASK() { return __IRQ_MASK; }
|
||||
|
||||
bool BMA423::disableIRQ(uint16_t int_map) {
|
||||
return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, int_map, BMA4_DISABLE,
|
||||
&__devFptr));
|
||||
}
|
||||
|
||||
bool BMA423::enableIRQ(uint16_t int_map) {
|
||||
return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, int_map, BMA4_ENABLE,
|
||||
&__devFptr));
|
||||
}
|
||||
|
||||
bool BMA423::enableFeature(uint8_t feature, uint8_t enable) {
|
||||
if ((feature & BMA423_STEP_CNTR) == BMA423_STEP_CNTR) {
|
||||
bma423_step_detector_enable(enable ? BMA4_ENABLE : BMA4_DISABLE,
|
||||
&__devFptr);
|
||||
}
|
||||
return (BMA4_OK == bma423_feature_enable(feature, enable, &__devFptr));
|
||||
}
|
||||
|
||||
bool BMA423::isStepCounter() {
|
||||
return (bool)(BMA423_STEP_CNTR_INT & __IRQ_MASK);
|
||||
}
|
||||
|
||||
bool BMA423::isDoubleClick() { return (bool)(BMA423_WAKEUP_INT & __IRQ_MASK); }
|
||||
|
||||
bool BMA423::isTilt() { return (bool)(BMA423_TILT_INT & __IRQ_MASK); }
|
||||
|
||||
bool BMA423::isActivity() { return (bool)(BMA423_ACTIVITY_INT & __IRQ_MASK); }
|
||||
|
||||
bool BMA423::isAnyNoMotion() {
|
||||
return (bool)(BMA423_ANY_NO_MOTION_INT & __IRQ_MASK);
|
||||
}
|
||||
|
||||
bool BMA423::enableStepCountInterrupt(bool en) {
|
||||
return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, BMA423_STEP_CNTR_INT,
|
||||
en, &__devFptr));
|
||||
}
|
||||
|
||||
bool BMA423::enableTiltInterrupt(bool en) {
|
||||
return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, BMA423_TILT_INT, en,
|
||||
&__devFptr));
|
||||
}
|
||||
|
||||
bool BMA423::enableWakeupInterrupt(bool en) {
|
||||
return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, BMA423_WAKEUP_INT, en,
|
||||
&__devFptr));
|
||||
}
|
||||
|
||||
bool BMA423::enableAnyNoMotionInterrupt(bool en) {
|
||||
return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP,
|
||||
BMA423_ANY_NO_MOTION_INT, en,
|
||||
&__devFptr));
|
||||
}
|
||||
|
||||
bool BMA423::enableActivityInterrupt(bool en) {
|
||||
return (BMA4_OK == bma423_map_interrupt(BMA4_INTR1_MAP, BMA423_ACTIVITY_INT,
|
||||
en, &__devFptr));
|
||||
}
|
||||
|
||||
const char *BMA423::getActivity() {
|
||||
uint8_t activity;
|
||||
bma423_activity_output(&activity, &__devFptr);
|
||||
if (activity & BMA423_USER_STATIONARY) {
|
||||
return "BMA423_USER_STATIONARY";
|
||||
} else if (activity & BMA423_USER_WALKING) {
|
||||
return "BMA423_USER_WALKING";
|
||||
} else if (activity & BMA423_USER_RUNNING) {
|
||||
return "BMA423_USER_RUNNING";
|
||||
} else if (activity & BMA423_STATE_INVALID) {
|
||||
return "BMA423_STATE_INVALID";
|
||||
}
|
||||
return "None";
|
||||
}
|
115
src/bma.h
115
src/bma.h
|
@ -1,6 +1,6 @@
|
|||
#pragma once
|
||||
|
||||
#ifdef ARDUINO
|
||||
#ifdef ARDUINO
|
||||
#include <Arduino.h>
|
||||
#else
|
||||
#include <stdlib.h>
|
||||
|
@ -9,80 +9,79 @@
|
|||
#include "bma423.h"
|
||||
|
||||
enum {
|
||||
DIRECTION_TOP_EDGE = 0,
|
||||
DIRECTION_BOTTOM_EDGE = 1,
|
||||
DIRECTION_LEFT_EDGE = 2,
|
||||
DIRECTION_RIGHT_EDGE = 3,
|
||||
DIRECTION_DISP_UP = 4,
|
||||
DIRECTION_DISP_DOWN = 5
|
||||
} ;
|
||||
DIRECTION_TOP_EDGE = 0,
|
||||
DIRECTION_BOTTOM_EDGE = 1,
|
||||
DIRECTION_LEFT_EDGE = 2,
|
||||
DIRECTION_RIGHT_EDGE = 3,
|
||||
DIRECTION_DISP_UP = 4,
|
||||
DIRECTION_DISP_DOWN = 5
|
||||
};
|
||||
|
||||
typedef struct bma4_accel Accel;
|
||||
typedef struct bma4_accel_config Acfg;
|
||||
|
||||
class BMA423
|
||||
{
|
||||
class BMA423 {
|
||||
|
||||
public:
|
||||
BMA423();
|
||||
~BMA423();
|
||||
BMA423();
|
||||
~BMA423();
|
||||
|
||||
bool begin(bma4_com_fptr_t readCallBlack, bma4_com_fptr_t writeCallBlack, bma4_delay_fptr_t delayCallBlack,
|
||||
uint8_t address = BMA4_I2C_ADDR_PRIMARY);
|
||||
bool begin(bma4_com_fptr_t readCallBlack, bma4_com_fptr_t writeCallBlack,
|
||||
bma4_delay_fptr_t delayCallBlack,
|
||||
uint8_t address = BMA4_I2C_ADDR_PRIMARY);
|
||||
|
||||
void softReset();
|
||||
void shutDown();
|
||||
void wakeUp();
|
||||
bool selfTest();
|
||||
void softReset();
|
||||
void shutDown();
|
||||
void wakeUp();
|
||||
bool selfTest();
|
||||
|
||||
uint8_t getDirection();
|
||||
uint8_t getDirection();
|
||||
|
||||
bool setAccelConfig(Acfg &cfg);
|
||||
bool getAccelConfig(Acfg &cfg);
|
||||
bool getAccel(Accel &acc);
|
||||
bool getAccelEnable();
|
||||
bool disableAccel();
|
||||
bool enableAccel(bool en = true);
|
||||
bool setAccelConfig(Acfg &cfg);
|
||||
bool getAccelConfig(Acfg &cfg);
|
||||
bool getAccel(Accel &acc);
|
||||
bool getAccelEnable();
|
||||
bool disableAccel();
|
||||
bool enableAccel(bool en = true);
|
||||
|
||||
bool setINTPinConfig(struct bma4_int_pin_config config, uint8_t pinMap);
|
||||
bool getINT();
|
||||
uint8_t getIRQMASK();
|
||||
bool disableIRQ(uint16_t int_map = BMA423_STEP_CNTR_INT);
|
||||
bool enableIRQ(uint16_t int_map = BMA423_STEP_CNTR_INT);
|
||||
bool isStepCounter();
|
||||
bool isDoubleClick();
|
||||
bool isTilt();
|
||||
bool isActivity();
|
||||
bool isAnyNoMotion();
|
||||
bool setINTPinConfig(struct bma4_int_pin_config config, uint8_t pinMap);
|
||||
bool getINT();
|
||||
uint8_t getIRQMASK();
|
||||
bool disableIRQ(uint16_t int_map = BMA423_STEP_CNTR_INT);
|
||||
bool enableIRQ(uint16_t int_map = BMA423_STEP_CNTR_INT);
|
||||
bool isStepCounter();
|
||||
bool isDoubleClick();
|
||||
bool isTilt();
|
||||
bool isActivity();
|
||||
bool isAnyNoMotion();
|
||||
|
||||
bool resetStepCounter();
|
||||
uint32_t getCounter();
|
||||
bool resetStepCounter();
|
||||
uint32_t getCounter();
|
||||
|
||||
float readTemperature();
|
||||
float readTemperatureF();
|
||||
float readTemperature();
|
||||
float readTemperatureF();
|
||||
|
||||
uint16_t getErrorCode();
|
||||
uint16_t getStatus();
|
||||
uint32_t getSensorTime();
|
||||
uint16_t getErrorCode();
|
||||
uint16_t getStatus();
|
||||
uint32_t getSensorTime();
|
||||
|
||||
const char *getActivity();
|
||||
bool setRemapAxes(struct bma423_axes_remap *remap_data);
|
||||
|
||||
const char *getActivity();
|
||||
bool setRemapAxes(struct bma423_axes_remap *remap_data);
|
||||
|
||||
bool enableFeature(uint8_t feature, uint8_t enable );
|
||||
bool enableStepCountInterrupt(bool en = true);
|
||||
bool enableTiltInterrupt(bool en = true);
|
||||
bool enableWakeupInterrupt(bool en = true);
|
||||
bool enableAnyNoMotionInterrupt(bool en = true);
|
||||
bool enableActivityInterrupt(bool en = true);
|
||||
bool enableFeature(uint8_t feature, uint8_t enable);
|
||||
bool enableStepCountInterrupt(bool en = true);
|
||||
bool enableTiltInterrupt(bool en = true);
|
||||
bool enableWakeupInterrupt(bool en = true);
|
||||
bool enableAnyNoMotionInterrupt(bool en = true);
|
||||
bool enableActivityInterrupt(bool en = true);
|
||||
|
||||
private:
|
||||
bma4_com_fptr_t __readRegisterFptr;
|
||||
bma4_com_fptr_t __writeRegisterFptr;
|
||||
bma4_delay_fptr_t __delayCallBlackFptr;
|
||||
bma4_com_fptr_t __readRegisterFptr;
|
||||
bma4_com_fptr_t __writeRegisterFptr;
|
||||
bma4_delay_fptr_t __delayCallBlackFptr;
|
||||
|
||||
uint8_t __address;
|
||||
uint16_t __IRQ_MASK;
|
||||
bool __init;
|
||||
struct bma4_dev __devFptr;
|
||||
uint8_t __address;
|
||||
uint16_t __IRQ_MASK;
|
||||
bool __init;
|
||||
struct bma4_dev __devFptr;
|
||||
};
|
||||
|
|
4970
src/bma4.c
4970
src/bma4.c
File diff suppressed because it is too large
Load Diff
263
src/bma4.h
263
src/bma4.h
|
@ -1,91 +1,91 @@
|
|||
/*
|
||||
*
|
||||
****************************************************************************
|
||||
* Copyright (C) 2015 - 2016 Bosch Sensortec GmbH
|
||||