Преглед изворни кода

Automatic power on/off of i2c devices

tags/v1.2.0
Bertrand Lemasle пре 7 година
родитељ
комит
3d861d188b
5 измењених фајлова са 31 додато и 10 уклоњено
  1. +7
    -1
      GpsTracker/Config.cpp
  2. +1
    -1
      GpsTracker/Config.h
  3. +2
    -2
      GpsTracker/Debug.cpp
  4. +1
    -0
      GpsTracker/GpsTracker.ino
  5. +20
    -6
      GpsTracker/Hardware.cpp

+ 7
- 1
GpsTracker/Config.cpp Прегледај датотеку

@@ -8,8 +8,10 @@ namespace config {
Config value; Config value;


void write() { void write() {
hardware::i2c::eeprom.writeBlock(CONFIG_ADDR, value);
VERBOSE_FORMAT("writeConfig", "%s, %s, %d, %d", value.seed, value.version, value.firstEntry, value.lastEntry); VERBOSE_FORMAT("writeConfig", "%s, %s, %d, %d", value.seed, value.version, value.firstEntry, value.lastEntry);
hardware::i2c::eepromPowerOn();
int written = hardware::i2c::eeprom.writeBlock(CONFIG_ADDR, value);
hardware::i2c::eepromPowerOff();
} }


void reset() { void reset() {
@@ -23,12 +25,16 @@ namespace config {


value = config; value = config;
write(); write();

VERBOSE_FORMAT("resetConfig", "value : %s, %s, %d, %d", value.seed, value.version, value.firstEntry, value.lastEntry);
} }


void read() { void read() {
hardware::i2c::eepromPowerOn();
hardware::i2c::eeprom.readBlock(CONFIG_ADDR, value); hardware::i2c::eeprom.readBlock(CONFIG_ADDR, value);
if (!String(CONFIG_SEED).equals(value.seed)) reset(); if (!String(CONFIG_SEED).equals(value.seed)) reset();


VERBOSE_FORMAT("readConfig", "%s, %s, %d, %d", value.seed, value.version, value.firstEntry, value.lastEntry); VERBOSE_FORMAT("readConfig", "%s, %s, %d, %d", value.seed, value.version, value.firstEntry, value.lastEntry);
hardware::i2c::eepromPowerOff();
} }
} }

+ 1
- 1
GpsTracker/Config.h Прегледај датотеку

@@ -15,7 +15,7 @@ struct Config {
}; };


#define CONFIG_ADDR 0 #define CONFIG_ADDR 0
#define CONFIG_SEED "UIYB"
#define CONFIG_SEED "UIYA"
#define VERSION "1.00" #define VERSION "1.00"


#define SLEEP_DEFAULT_TIME_SECONDS 1800 #define SLEEP_DEFAULT_TIME_SECONDS 1800


+ 2
- 2
GpsTracker/Debug.cpp Прегледај датотеку

@@ -96,6 +96,7 @@ namespace debug {


void waitForSerial() { void waitForSerial() {
while (!Serial); while (!Serial);
Serial.begin(DEBUG_SERIAL_SPEED);
Serial.println("Starting !"); Serial.println("Starting !");
} }


@@ -142,6 +143,7 @@ namespace debug {


void setFakeGpsPosition() { void setFakeGpsPosition() {
strncpy_P(gps::lastPosition, FAKE_GPS_ENTRY, GPS_POSITION_SIZE); strncpy_P(gps::lastPosition, FAKE_GPS_ENTRY, GPS_POSITION_SIZE);
Log.notice(F("Last position set to : %s\n"), gps::lastPosition);
} }


void getAndDisplayBattery() { void getAndDisplayBattery() {
@@ -160,9 +162,7 @@ namespace debug {
} }


void getAndDisplayEepromConfig() { void getAndDisplayEepromConfig() {
hardware::i2c::eepromPowerOn();
config::read(); config::read();
hardware::i2c::eepromPowerOff();
} }


void getAndDisplayEepromPositions() { void getAndDisplayEepromPositions() {


+ 1
- 0
GpsTracker/GpsTracker.ino Прегледај датотеку

@@ -18,6 +18,7 @@ void setup() {
} }


void loop() { void loop() {

debug::GPSTRACKER_DEBUG_COMMAND command = debug::GPSTRACKER_DEBUG_COMMAND::RUN; debug::GPSTRACKER_DEBUG_COMMAND command = debug::GPSTRACKER_DEBUG_COMMAND::RUN;
if(!bypassMenu) command = debug::menu(); if(!bypassMenu) command = debug::menu();




+ 20
- 6
GpsTracker/Hardware.cpp Прегледај датотеку

@@ -1,5 +1,6 @@
#include "Hardware.h" #include "Hardware.h"
#include "Pins.h" #include "Pins.h"
#include "Debug.h"


#include <SoftwareSerial.h> #include <SoftwareSerial.h>
#include <SIM808.h> #include <SIM808.h>
@@ -8,8 +9,11 @@
#include <Wire.h> #include <Wire.h>
#include <E24.h> #include <E24.h>



namespace hardware { namespace hardware {


#define LOGGER_NAME "Hardware::sim808"

namespace sim808 { namespace sim808 {
SoftwareSerial simSerial = SoftwareSerial(SIM_TX, SIM_RX); SoftwareSerial simSerial = SoftwareSerial(SIM_TX, SIM_RX);
SIM808 device = SIM808(SIM_RST, SIM_PWR, SIM_STATUS); SIM808 device = SIM808(SIM_RST, SIM_PWR, SIM_STATUS);
@@ -66,6 +70,8 @@ namespace hardware {
} }
} }


#define LOGGER_NAME "Hardware::i2c"

namespace i2c { namespace i2c {


#define DEVICE_RTC 1 #define DEVICE_RTC 1
@@ -74,12 +80,12 @@ namespace hardware {
E24 eeprom = E24(E24Size_t::E24_512K); E24 eeprom = E24(E24Size_t::E24_512K);


uint8_t powered = 0; uint8_t powered = 0;
uint8_t poweredCount = 0;


//inline void powered() { digitalRead(I2C_PWR) == HIGH; } //TODO = replace enum with just reading the output pin ? //inline void powered() { digitalRead(I2C_PWR) == HIGH; } //TODO = replace enum with just reading the output pin ?


void powerOn() { void powerOn() {
if (powered > 0) return;

VERBOSE("powerOn");
digitalWrite(I2C_PWR, HIGH); digitalWrite(I2C_PWR, HIGH);
pinMode(I2C_PWR, OUTPUT); pinMode(I2C_PWR, OUTPUT);


@@ -87,6 +93,7 @@ namespace hardware {
} }


void powerOff() { void powerOff() {
VERBOSE("powerOff");
pinMode(I2C_PWR, INPUT); pinMode(I2C_PWR, INPUT);
digitalWrite(I2C_PWR, LOW); digitalWrite(I2C_PWR, LOW);


@@ -98,12 +105,19 @@ namespace hardware {
digitalWrite(A5, LOW); digitalWrite(A5, LOW);
} }


inline void powerOffIfUnused() {
if (!powered) powerOff();
void powerOnIfPoweredOff() {
if (!poweredCount) powerOn();
poweredCount++;
}

void powerOffIfUnused() {
if (!poweredCount) return;
poweredCount--;
if (!poweredCount) powerOff();
} }


void rtcPowerOn() { void rtcPowerOn() {
powerOn();
powerOnIfPoweredOff();
powered |= DEVICE_RTC; powered |= DEVICE_RTC;
} }


@@ -113,7 +127,7 @@ namespace hardware {
} }


void eepromPowerOn() { void eepromPowerOn() {
powerOn();
powerOnIfPoweredOff();
powered |= DEVICE_EEPROM; powered |= DEVICE_EEPROM;
} }




Loading…
Откажи
Сачувај