No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

120 líneas
2.3 KiB

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