選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

158 行
3.2 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. uint8_t networkPoweredCount = 0;
  16. uint8_t gpsPoweredCount = 0;
  17. void powerOn() {
  18. VERBOSE("powerOn");
  19. bool poweredOn = device.powerOnOff(true);
  20. if (!poweredOn) return;
  21. device.init();
  22. networkPoweredCount = gpsPoweredCount = 0;
  23. }
  24. void powerOff() {
  25. VERBOSE("powerOff");
  26. device.powerOnOff(false);
  27. networkPoweredCount = gpsPoweredCount = 0;
  28. }
  29. void powerOffIfUnused() {
  30. //does not rely on count for safety
  31. //if there is a bug somewhere, the device will consume more battery,
  32. //but will not fail due to an over aggressive battery saving strategy
  33. bool gpsPowered = false;
  34. if ((!device.getGpsPowerState(&gpsPowered) || !gpsPowered) &&
  35. (device.getPhoneFunctionality() != SIM808_PHONE_FUNCTIONALITY::FULL)) {
  36. powerOff();
  37. }
  38. }
  39. void setup() {
  40. NOTICE("setup");
  41. simSerial.begin(SIM808_BAUDRATE);
  42. device.begin(simSerial);
  43. powerOff(); //ensure powerOff on start
  44. }
  45. void gpsPowerOn() {
  46. if(gpsPoweredCount) {
  47. gpsPoweredCount++;
  48. return;
  49. }
  50. VEBOSE("gpsPowerOn");
  51. powerOn();
  52. //SIM808 turns phone on by default but we don't need it
  53. if(!networkPoweredCount) device.setPhoneFunctionality(SIM808_PHONE_FUNCTIONALITY::MINIMUM);
  54. device.enableGps();
  55. }
  56. void gpsPowerOff() {
  57. if (!device.powered()) {
  58. networkPoweredCount = gpsPoweredCount = 0; //just to be sure counts == 0
  59. return;
  60. }
  61. if(gpsPoweredCount > 1) {
  62. gpsPoweredCount--;
  63. return;
  64. }
  65. VERBOSE("gpsPowerOff");
  66. device.disableGps();
  67. powerOffIfUnused();
  68. }
  69. void networkPowerOn() {
  70. if(networkPoweredCount) {
  71. networkPoweredCount++;
  72. return;
  73. }
  74. VERBOSE("networkPowerOn");
  75. powerOn();
  76. device.setPhoneFunctionality(SIM808_PHONE_FUNCTIONALITY::FULL);
  77. }
  78. void networkPowerOff() {
  79. if (!device.powered()) {
  80. networkPoweredCount = gpsPoweredCount = 0; //just to be sure counts == 0
  81. return;
  82. }
  83. if(networkPoweredCount > 1) {
  84. networkPoweredCount--;
  85. return;
  86. }
  87. VERBOSE("networkPowerOff");
  88. device.disableGprs();
  89. device.setPhoneFunctionality(SIM808_PHONE_FUNCTIONALITY::MINIMUM);
  90. powerOffIfUnused();
  91. }
  92. }
  93. #define LOGGER_NAME "Hardware::i2c"
  94. namespace i2c {
  95. E24 eeprom = E24(E24Size_t::E24_512K);
  96. uint8_t poweredCount = 0;
  97. void powerOn() {
  98. if(poweredCount) {
  99. poweredCount++;
  100. return;
  101. }
  102. VERBOSE("powerOn");
  103. digitalWrite(I2C_PWR, HIGH);
  104. pinMode(I2C_PWR, OUTPUT);
  105. Wire.begin();
  106. poweredCount = 1;
  107. }
  108. void powerOff(bool forced = false) {
  109. if(poweredCount > 1 && !forced) {
  110. poweredCount--;
  111. return;
  112. }
  113. VERBOSE("powerOff");
  114. pinMode(I2C_PWR, INPUT);
  115. digitalWrite(I2C_PWR, LOW);
  116. //turn off i2c
  117. TWCR &= ~(bit(TWEN) | bit(TWIE) | bit(TWEA));
  118. //disable i2c internal pull ups
  119. digitalWrite(A4, LOW);
  120. digitalWrite(A5, LOW);
  121. poweredCount = 0;
  122. }
  123. }
  124. }