Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

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