| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- #include <Arduino.h>
- #include "target.h"
- #include <helpers/ArduinoHelpers.h>
- #include <helpers/sensors/MicroNMEALocationProvider.h>
- RAK4631Board board;
- RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, SPI);
- WRAPPER_CLASS radio_driver(radio, board);
- VolatileRTCClock fallback_clock;
- AutoDiscoverRTCClock rtc_clock(fallback_clock);
- #if ENV_INCLUDE_GPS
- MicroNMEALocationProvider nmea = MicroNMEALocationProvider(Wire);
- RAK4631SensorManager sensors = RAK4631SensorManager(nmea);
- #else
- RAK4631SensorManager sensors;
- #endif
- #ifdef DISPLAY_CLASS
- DISPLAY_CLASS display;
- #endif
- #ifdef MESH_DEBUG
- uint32_t deviceOnline = 0x00;
- void scanDevices(TwoWire *w)
- {
- uint8_t err, addr;
- int nDevices = 0;
- uint32_t start = 0;
- Serial.println("Scanning I2C for Devices");
- for (addr = 1; addr < 127; addr++) {
- start = millis();
- w->beginTransmission(addr); delay(2);
- err = w->endTransmission();
- if (err == 0) {
- nDevices++;
- switch (addr) {
- case 0x42:
- Serial.println("\tFound RAK12500 GPS Sensor");
- deviceOnline |= RAK12500_ONLINE;
- break;
- default:
- Serial.print("\tI2C device found at address 0x");
- if (addr < 16) {
- Serial.print("0");
- }
- Serial.print(addr, HEX);
- Serial.println(" !");
- break;
- }
- } else if (err == 4) {
- Serial.print("Unknow error at address 0x");
- if (addr < 16) {
- Serial.print("0");
- }
- Serial.println(addr, HEX);
- }
- }
- if (nDevices == 0)
- Serial.println("No I2C devices found\n");
- Serial.println("Scan for devices is complete.");
- Serial.println("\n");
- }
- #endif
- bool radio_init() {
- rtc_clock.begin(Wire);
- return radio.std_init(&SPI);
- }
- uint32_t radio_get_rng_seed() {
- return radio.random(0x7FFFFFFF);
- }
- void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) {
- radio.setFrequency(freq);
- radio.setSpreadingFactor(sf);
- radio.setBandwidth(bw);
- radio.setCodingRate(cr);
- }
- void radio_set_tx_power(uint8_t dbm) {
- radio.setOutputPower(dbm);
- }
- #if ENV_INCLUDE_GPS
- void RAK4631SensorManager::start_gps()
- {
- //function currently not used
- gps_active = true;
- pinMode(disStandbyPin, OUTPUT);
- digitalWrite(disStandbyPin, 1);
- MESH_DEBUG_PRINTLN("GPS should be on now");
- }
- void RAK4631SensorManager::stop_gps()
- {
- //function currently not used
- gps_active = false;
- pinMode(disStandbyPin, OUTPUT);
- digitalWrite(disStandbyPin, 0);
- MESH_DEBUG_PRINTLN("GPS should be off now");
- }
- void RAK4631SensorManager::sleep_gps() {
- gps_active = false;
- ublox_GNSS.powerSaveMode();
- MESH_DEBUG_PRINTLN("GPS should be sleeping now");
- }
- void RAK4631SensorManager::wake_gps() {
- gps_active = true;
- ublox_GNSS.powerSaveMode(false);
- MESH_DEBUG_PRINTLN("GPS should be waking now");
- }
- bool RAK4631SensorManager::gpsIsAwake(uint32_t ioPin){
-
- int pinInitialState = 0;
- //set initial waking state
- pinMode(ioPin,OUTPUT);
- digitalWrite(ioPin,0);
- delay(1000);
- digitalWrite(ioPin,1);
- delay(1000);
- if (ublox_GNSS.begin(Wire) == true){
- MESH_DEBUG_PRINTLN("GPS init correctly and GPS is turned on");
- ublox_GNSS.setI2COutput(COM_TYPE_NMEA);
- ublox_GNSS.saveConfigSelective(VAL_CFG_SUBSEC_IOPORT);
- disStandbyPin = ioPin;
- gps_active = true;
- gps_present = true;
- return true;
- }
- else
- MESH_DEBUG_PRINTLN("GPS failed to init on this IO pin... try the next");
- //digitalWrite(ioPin,pinInitialState); //reset the IO pin to initial state
- return false;
- }
- #endif
- bool RAK4631SensorManager::begin() {
-
- #ifdef MESH_DEBUG
- scanDevices(&Wire);
- #endif
- #if ENV_INCLUDE_GPS
- //search for the correct IO standby pin depending on socket used
- if(gpsIsAwake(P_GPS_STANDBY_A)){
- MESH_DEBUG_PRINTLN("GPS is on socket A");
- }
- else if(gpsIsAwake(P_GPS_STANDBY_C)){
- MESH_DEBUG_PRINTLN("GPS is on socket C");
- }
- else if(gpsIsAwake(P_GPS_STANDBY_F)){
- MESH_DEBUG_PRINTLN("GPS is on socket F");
- }
- else{
- MESH_DEBUG_PRINTLN("Error: No GPS found on sockets A, C or F");
- gps_active = false;
- gps_present = false;
- return false;
- }
- //Now that GPS is found and set up, set to sleep for initial state
- stop_gps();
- #endif
- }
- #if ENV_INCLUDE_GPS
- bool RAK4631SensorManager::querySensors(uint8_t requester_permissions, CayenneLPP& telemetry) {
- if (requester_permissions & TELEM_PERM_LOCATION && gps_active) { // does requester have permission?
- telemetry.addGPS(TELEM_CHANNEL_SELF, node_lat, node_lon, node_altitude);
- }
- return true;
- }
- void RAK4631SensorManager::loop() {
- static long next_update = 0;
-
- _nmea->loop();
- if (millis() > next_update && gps_active) {
- node_lat = (double)ublox_GNSS.getLatitude()/10000000.;
- node_lon = (double)ublox_GNSS.getLongitude()/10000000.;
- node_altitude = (double)ublox_GNSS.getAltitude()/1000.;
- MESH_DEBUG_PRINT("lat %f lon %f alt %f\r\n", node_lat, node_lon, node_altitude);
-
- next_update = millis() + 1000;
- }
- }
- int RAK4631SensorManager::getNumSettings() const { return 1; } // just one supported: "gps" (power switch)
- const char* RAK4631SensorManager::getSettingName(int i) const {
- return i == 0 ? "gps" : NULL;
- }
- const char* RAK4631SensorManager::getSettingValue(int i) const {
- if (i == 0) {
- return gps_active ? "1" : "0";
- }
- return NULL;
- }
- bool RAK4631SensorManager::setSettingValue(const char* name, const char* value) {
- if (strcmp(name, "gps") == 0) {
- if (strcmp(value, "0") == 0) {
- stop_gps();
- } else {
- start_gps();
- }
- return true;
- }
- return false; // not supported
- }
- #endif
- mesh::LocalIdentity radio_new_identity() {
- RadioNoiseListener rng(radio);
- return mesh::LocalIdentity(&rng); // create new random identity
- }
|