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.

121 regels
2.3 KiB

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