You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

126 lines
2.2 KiB

  1. #include "Hardware.h"
  2. #include "Pins.h"
  3. #include <SoftwareSerial.h>
  4. #include <SIM808.h>
  5. #include <SIM808_Types.h>
  6. #include <Wire.h>
  7. #include <E24.h>
  8. namespace hardware {
  9. namespace sim808 {
  10. SoftwareSerial simSerial = SoftwareSerial(SIM_TX, SIM_RX);
  11. SIM808 device = SIM808(SIM_RST, SIM_PWR, SIM_STATUS);
  12. void powerOn() {
  13. bool poweredOn = device.powerOnOff(true);
  14. if (!poweredOn) return;
  15. device.init();
  16. }
  17. void powerOff() {
  18. device.powerOnOff(false);
  19. }
  20. void powerOffIfUnused() {
  21. bool gpsPowered = false;
  22. bool gprsPowered = false;
  23. if ((device.getGpsPowerState(&gpsPowered) && !gpsPowered) &&
  24. (device.getGprsPowerState(&gprsPowered) && !gprsPowered)) {
  25. powerOff();
  26. }
  27. }
  28. void init() {
  29. device.powerOnOff(true);
  30. simSerial.begin(4800);
  31. device.begin(simSerial);
  32. device.init();
  33. }
  34. void gpsPowerOn() {
  35. powerOn();
  36. device.enableGps();
  37. }
  38. void gpsPowerOff() {
  39. device.disableGps();
  40. powerOffIfUnused();
  41. }
  42. void networkPowerOn() {
  43. powerOn();
  44. device.setPhoneFunctionality(SIM808_PHONE_FUNCTIONALITY::FULL);
  45. device.enableGprs("Free"); //TODO : configure
  46. }
  47. void networkPowerOff() {
  48. device.setPhoneFunctionality(SIM808_PHONE_FUNCTIONALITY::MINIMUM);
  49. device.disableGprs();
  50. powerOffIfUnused();
  51. }
  52. }
  53. namespace i2c {
  54. #define DEVICE_RTC 1
  55. #define DEVICE_EEPROM 2
  56. E24 eeprom = E24(E24Size_t::E24_512K);
  57. uint8_t powered = 0;
  58. //inline void powered() { digitalRead(I2C_PWR) == HIGH; } //TODO = replace enum with just reading the output pin ?
  59. void powerOn() {
  60. if (powered > 0) return;
  61. digitalWrite(I2C_PWR, HIGH);
  62. pinMode(I2C_PWR, OUTPUT);
  63. Wire.begin();
  64. }
  65. void powerOff() {
  66. pinMode(I2C_PWR, INPUT);
  67. digitalWrite(I2C_PWR, LOW);
  68. //turn off i2c
  69. TWCR &= ~(bit(TWEN) | bit(TWIE) | bit(TWEA));
  70. //disable i2c internal pull ups
  71. digitalWrite(A4, LOW);
  72. digitalWrite(A5, LOW);
  73. }
  74. inline void powerOffIfUnused() {
  75. if (!powered) powerOff();
  76. }
  77. void rtcPowerOn() {
  78. powerOn();
  79. powered |= DEVICE_RTC;
  80. }
  81. void rtcPowerOff() {
  82. powered &= ~DEVICE_RTC;
  83. powerOffIfUnused();
  84. }
  85. void eepromPowerOn() {
  86. powerOn();
  87. powered |= DEVICE_EEPROM;
  88. }
  89. void eepromPowerOff() {
  90. powered &= ~DEVICE_EEPROM;
  91. powerOffIfUnused();
  92. }
  93. }
  94. }