Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

140 linhas
2.5 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. bool poweredOn = device.powerOnOff(true);
  16. if (!poweredOn) return;
  17. device.init();
  18. }
  19. void powerOff() {
  20. device.powerOnOff(false);
  21. }
  22. void powerOffIfUnused() {
  23. bool gpsPowered = false;
  24. bool gprsPowered = false;
  25. if ((!device.getGpsPowerState(&gpsPowered) || !gpsPowered) &&
  26. (!device.getGprsPowerState(&gprsPowered) || !gprsPowered)) {
  27. powerOff();
  28. }
  29. }
  30. void setup() {
  31. device.powerOnOff(true);
  32. simSerial.begin(4800);
  33. device.begin(simSerial);
  34. device.powerOnOff(false);
  35. }
  36. void gpsPowerOn() {
  37. powerOn();
  38. device.enableGps();
  39. }
  40. void gpsPowerOff() {
  41. device.disableGps();
  42. powerOffIfUnused();
  43. }
  44. void networkPowerOn() {
  45. powerOn();
  46. device.setPhoneFunctionality(SIM808_PHONE_FUNCTIONALITY::FULL);
  47. device.enableGprs("Free"); //TODO : configure
  48. }
  49. void networkPowerOff() {
  50. device.setPhoneFunctionality(SIM808_PHONE_FUNCTIONALITY::MINIMUM);
  51. device.disableGprs();
  52. powerOffIfUnused();
  53. }
  54. }
  55. #define LOGGER_NAME "Hardware::i2c"
  56. namespace i2c {
  57. #define DEVICE_RTC 1
  58. #define DEVICE_EEPROM 2
  59. E24 eeprom = E24(E24Size_t::E24_512K);
  60. uint8_t powered = 0;
  61. uint8_t poweredCount = 0;
  62. //inline void powered() { digitalRead(I2C_PWR) == HIGH; } //TODO = replace enum with just reading the output pin ?
  63. void powerOn() {
  64. VERBOSE("powerOn");
  65. digitalWrite(I2C_PWR, HIGH);
  66. pinMode(I2C_PWR, OUTPUT);
  67. Wire.begin();
  68. }
  69. void powerOff() {
  70. VERBOSE("powerOff");
  71. pinMode(I2C_PWR, INPUT);
  72. digitalWrite(I2C_PWR, LOW);
  73. //turn off i2c
  74. TWCR &= ~(bit(TWEN) | bit(TWIE) | bit(TWEA));
  75. //disable i2c internal pull ups
  76. digitalWrite(A4, LOW);
  77. digitalWrite(A5, LOW);
  78. }
  79. void powerOnIfPoweredOff() {
  80. if (!poweredCount) powerOn();
  81. poweredCount++;
  82. }
  83. void powerOffIfUnused() {
  84. if (!poweredCount) return;
  85. poweredCount--;
  86. if (!poweredCount) powerOff();
  87. }
  88. void rtcPowerOn() {
  89. powerOnIfPoweredOff();
  90. powered |= DEVICE_RTC;
  91. }
  92. void rtcPowerOff() {
  93. powered &= ~DEVICE_RTC;
  94. powerOffIfUnused();
  95. }
  96. void eepromPowerOn() {
  97. powerOnIfPoweredOff();
  98. powered |= DEVICE_EEPROM;
  99. }
  100. void eepromPowerOff() {
  101. powered &= ~DEVICE_EEPROM;
  102. powerOffIfUnused();
  103. }
  104. }
  105. }