Não pode escolher mais do que 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.

115 linhas
2.1 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. if ((!device.getGpsPowerState(&gpsPowered) || !gpsPowered) &&
  28. (device.getPhoneFunctionality() != SIM808_PHONE_FUNCTIONALITY::FULL)) {
  29. powerOff();
  30. }
  31. }
  32. void setup() {
  33. NOTICE("setup");
  34. simSerial.begin(SIM808_BAUDRATE);
  35. device.begin(simSerial);
  36. powerOff(); //ensure powerOff on start
  37. }
  38. void gpsPowerOn() {
  39. VERBOSE("gpsPowerOn");
  40. powerOn();
  41. device.enableGps();
  42. }
  43. void gpsPowerOff() {
  44. VERBOSE("gpsPowerOff");
  45. device.disableGps();
  46. powerOffIfUnused();
  47. }
  48. void networkPowerOn() {
  49. VERBOSE("networkPowerOn");
  50. powerOn();
  51. device.setPhoneFunctionality(SIM808_PHONE_FUNCTIONALITY::FULL);
  52. }
  53. void networkPowerOff() {
  54. VERBOSE("networkPowerOff");
  55. device.disableGprs();
  56. device.setPhoneFunctionality(SIM808_PHONE_FUNCTIONALITY::MINIMUM);
  57. powerOffIfUnused();
  58. }
  59. }
  60. #define LOGGER_NAME "Hardware::i2c"
  61. namespace i2c {
  62. E24 eeprom = E24(E24Size_t::E24_512K);
  63. uint8_t poweredCount = 0;
  64. void powerOn() {
  65. if (!poweredCount) {
  66. VERBOSE("powerOn");
  67. digitalWrite(I2C_PWR, HIGH);
  68. pinMode(I2C_PWR, OUTPUT);
  69. Wire.begin();
  70. }
  71. poweredCount++;
  72. }
  73. void powerOff(bool forced = false) {
  74. if (poweredCount == 1 || forced) {
  75. VERBOSE("powerOff");
  76. pinMode(I2C_PWR, INPUT);
  77. digitalWrite(I2C_PWR, LOW);
  78. //turn off i2c
  79. TWCR &= ~(bit(TWEN) | bit(TWIE) | bit(TWEA));
  80. //disable i2c internal pull ups
  81. digitalWrite(A4, LOW);
  82. digitalWrite(A5, LOW);
  83. }
  84. poweredCount--;
  85. }
  86. }
  87. }