Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

76 строки
2.3 KiB

  1. #include "Config.h"
  2. #include "Debug.h"
  3. #include "Network.h"
  4. #include "Hardware.h"
  5. #include "MainUnit.h"
  6. #include "Rtc.h"
  7. #define LOGGER_NAME "Network"
  8. namespace network {
  9. timestamp_t _poweredOnTime;
  10. void powerOn() {
  11. hardware::sim808::networkPowerOn();
  12. _poweredOnTime = rtc::getTime();
  13. }
  14. void powerOff() {
  15. hardware::sim808::networkPowerOff();
  16. _poweredOnTime = 0;
  17. }
  18. __attribute__((__optimize__("O2")))
  19. SIM808RegistrationStatus waitForRegistered(uint32_t timeout, bool relativeToPowerOnTime = true) {
  20. SIM808RegistrationStatus currentStatus;
  21. SIM808SignalQualityReport report;
  22. uint8_t noReliableNetwork = 0;
  23. if (relativeToPowerOnTime) timeout -= (rtc::getTime() - _poweredOnTime) * 1000;
  24. currentStatus = hardware::sim808::device.getNetworkRegistrationStatus();
  25. report = hardware::sim808::device.getSignalQuality();
  26. do {
  27. if (isAvailable(currentStatus.stat)) break;
  28. NOTICE_FORMAT("waitForRegistered", "%d, [%d %ddBm]", currentStatus.stat, report.ssri, report.attenuation);
  29. if (report.ssri < NETWORK_DEFAULT_NO_NETWORK_QUALITY_THRESHOLD) noReliableNetwork++;
  30. else noReliableNetwork = 0;
  31. if (noReliableNetwork > NETWORK_DEFAULT_NO_NETWORK_TRIES) {
  32. NOTICE_MSG("waitForRegistered", "No reliable signal");
  33. break; //after a while, no network really means no network. Bailing out
  34. }
  35. mainunit::deepSleep(NETWORK_DEFAULT_INTERMEDIATE_TIMEOUT_MS / 1000);
  36. timeout -= NETWORK_DEFAULT_INTERMEDIATE_TIMEOUT_MS;
  37. currentStatus = hardware::sim808::device.getNetworkRegistrationStatus();
  38. report = hardware::sim808::device.getSignalQuality();
  39. } while (timeout > 1);
  40. NOTICE_FORMAT("waitForRegistered", "%d, [%d %ddBm]", currentStatus.stat, report.ssri, report.attenuation);
  41. return currentStatus;
  42. }
  43. bool isAvailable(SIM808_NETWORK_REGISTRATION_STATE state) {
  44. return static_cast<int8_t>(state) &
  45. (static_cast<int8_t>(SIM808_NETWORK_REGISTRATION_STATE::REGISTERED) | static_cast<int8_t>(SIM808_NETWORK_REGISTRATION_STATE::ROAMING))
  46. != 0;
  47. }
  48. bool enableGprs() {
  49. return hardware::sim808::device.enableGprs(config::main::value.network.apn);
  50. }
  51. bool sendSms(const char * msg) {
  52. const char * phoneNumber = config::main::value.contactPhone;
  53. NOTICE_FORMAT("sendSms", "%s, %s", phoneNumber, msg);
  54. return hardware::sim808::device.sendSms(phoneNumber, msg);
  55. }
  56. }