mirror of https://github.com/meshcore-dev/MeshCore
committed by
GitHub
116 changed files with 4023 additions and 662 deletions
@ -0,0 +1,74 @@ |
|||
{ |
|||
"build": { |
|||
"arduino": { |
|||
"ldscript": "nrf52840_s140_v6.ld" |
|||
}, |
|||
"core": "nRF5", |
|||
"cpu": "cortex-m4", |
|||
"extra_flags": "-DARDUINO_NRF52840_FEATHER -DNRF52840_XXAA", |
|||
"f_cpu": "64000000L", |
|||
"hwids": [ |
|||
[ |
|||
"0x239A", |
|||
"0x8029" |
|||
], |
|||
[ |
|||
"0x239A", |
|||
"0x0029" |
|||
], |
|||
[ |
|||
"0x239A", |
|||
"0x002A" |
|||
], |
|||
[ |
|||
"0x239A", |
|||
"0x802A" |
|||
] |
|||
], |
|||
"usb_product": "Meshtiny", |
|||
"mcu": "nrf52840", |
|||
"variant": "meshtiny", |
|||
"bsp": { |
|||
"name": "adafruit" |
|||
}, |
|||
"softdevice": { |
|||
"sd_flags": "-DS140", |
|||
"sd_name": "s140", |
|||
"sd_version": "6.1.1", |
|||
"sd_fwid": "0x00B6" |
|||
}, |
|||
"bootloader": { |
|||
"settings_addr": "0xFF000" |
|||
} |
|||
}, |
|||
"connectivity": [ |
|||
"bluetooth" |
|||
], |
|||
"debug": { |
|||
"jlink_device": "nRF52840_xxAA", |
|||
"svd_path": "nrf52840.svd", |
|||
"openocd_target": "nrf52840-mdk-rs" |
|||
}, |
|||
"frameworks": [ |
|||
"arduino", |
|||
"freertos" |
|||
], |
|||
"name": "Meshtiny", |
|||
"upload": { |
|||
"maximum_ram_size": 248832, |
|||
"maximum_size": 815104, |
|||
"speed": 115200, |
|||
"protocol": "nrfutil", |
|||
"protocols": [ |
|||
"jlink", |
|||
"nrfjprog", |
|||
"nrfutil", |
|||
"stlink" |
|||
], |
|||
"use_1200bps_touch": true, |
|||
"require_upload_port": true, |
|||
"wait_for_upload_port": true |
|||
}, |
|||
"url": "https://shop.mtoolstec.com/product/meshtiny", |
|||
"vendor": "MTools Tec" |
|||
} |
|||
@ -0,0 +1,72 @@ |
|||
{ |
|||
"build": { |
|||
"arduino": { |
|||
"ldscript": "nrf52840_s140_v6.ld" |
|||
}, |
|||
"core": "nRF5", |
|||
"cpu": "cortex-m4", |
|||
"extra_flags": "-DARDUINO_NRF52840_FEATHER -DNRF52840_XXAA", |
|||
"f_cpu": "64000000L", |
|||
"hwids": [ |
|||
[ |
|||
"0x239A", |
|||
"0x8029" |
|||
], |
|||
[ |
|||
"0x239A", |
|||
"0x0029" |
|||
], |
|||
[ |
|||
"0x239A", |
|||
"0x002A" |
|||
], |
|||
[ |
|||
"0x239A", |
|||
"0x802A" |
|||
] |
|||
], |
|||
"usb_product": "WisCore RAK3401 Board", |
|||
"mcu": "nrf52840", |
|||
"variant": "WisCore_RAK3401_Board", |
|||
"bsp": { |
|||
"name": "adafruit" |
|||
}, |
|||
"softdevice": { |
|||
"sd_flags": "-DS140", |
|||
"sd_name": "s140", |
|||
"sd_version": "6.1.1", |
|||
"sd_fwid": "0x00B6" |
|||
}, |
|||
"bootloader": { |
|||
"settings_addr": "0xFF000" |
|||
} |
|||
}, |
|||
"connectivity": [ |
|||
"bluetooth" |
|||
], |
|||
"debug": { |
|||
"jlink_device": "nRF52840_xxAA", |
|||
"svd_path": "nrf52840.svd" |
|||
}, |
|||
"frameworks": [ |
|||
"arduino" |
|||
], |
|||
"name": "WisCore RAK3401 Board", |
|||
"upload": { |
|||
"maximum_ram_size": 248832, |
|||
"maximum_size": 815104, |
|||
"speed": 115200, |
|||
"protocol": "nrfutil", |
|||
"protocols": [ |
|||
"jlink", |
|||
"nrfjprog", |
|||
"nrfutil", |
|||
"stlink" |
|||
], |
|||
"use_1200bps_touch": true, |
|||
"require_upload_port": true, |
|||
"wait_for_upload_port": true |
|||
}, |
|||
"url": "https://www.rakwireless.com", |
|||
"vendor": "RAKwireless" |
|||
} |
|||
@ -0,0 +1,881 @@ |
|||
# MeshCore Repeater & Room Server CLI Commands |
|||
|
|||
## Navigation |
|||
|
|||
- [Operational](#operational) |
|||
- [Neighbors](#neighbors-repeater-only) |
|||
- [Statistics](#statistics) |
|||
- [Logging](#logging) |
|||
- [Information](#info) |
|||
- [Configuration](#configuration) |
|||
- [Radio](#radio) |
|||
- [System](#system) |
|||
- [Routing](#routing) |
|||
- [ACL](#acl) |
|||
- [Region Management](#region-management-v110) |
|||
- [Region Examples](#region-examples) |
|||
- [GPS](#gps-when-gps-support-is-compiled-in) |
|||
- [Sensors](#sensors-when-sensor-support-is-compiled-in) |
|||
- [Bridge](#bridge-when-bridge-support-is-compiled-in) |
|||
|
|||
--- |
|||
|
|||
## Operational |
|||
|
|||
### Reboot the node |
|||
**Usage:** |
|||
- `reboot` |
|||
|
|||
--- |
|||
|
|||
### Reset the clock and reboot |
|||
**Usage:** |
|||
- `clkreboot` |
|||
|
|||
--- |
|||
|
|||
### Sync the clock with the remote device |
|||
**Usage:** |
|||
- `clock sync` |
|||
|
|||
--- |
|||
|
|||
### Display current time in UTC |
|||
**Usage:** |
|||
- `clock` |
|||
|
|||
--- |
|||
|
|||
### Set the time to a specific timestamp |
|||
**Usage:** |
|||
- `time <epoch_seconds>` |
|||
|
|||
**Parameters:** |
|||
- `epoc_seconds`: Unix epoc time |
|||
|
|||
--- |
|||
|
|||
### Send a flood advert |
|||
**Usage:** |
|||
- `advert` |
|||
|
|||
--- |
|||
|
|||
### Start an Over-The-Air (OTA) firmware update |
|||
**Usage:** |
|||
- `start ota` |
|||
|
|||
--- |
|||
|
|||
### Erase/Factory Reset |
|||
**Usage:** |
|||
- `erase` |
|||
|
|||
**Serial Only:** Yes |
|||
|
|||
**Warning:** _**This is destructive!**_ |
|||
|
|||
--- |
|||
|
|||
## Neighbors (Repeater Only) |
|||
|
|||
### List nearby neighbors |
|||
**Usage:** |
|||
- `neighbors` |
|||
|
|||
**Note:** The output of this command is limited to the 8 most recent adverts. |
|||
|
|||
**Note:** Each line is encoded as `{pubkey-prefix}:{timestamp}:{snr*4}` |
|||
|
|||
--- |
|||
|
|||
### Remove a neighbor |
|||
**Usage:** |
|||
- `neighbor.remove <pubkey_prefix>` |
|||
|
|||
**Parameters:** |
|||
- `pubkey_prefix`: The public key of the node to remove from the neighbors list |
|||
|
|||
--- |
|||
|
|||
## Statistics |
|||
|
|||
### Clear Stats |
|||
**Usage:** `clear stats` |
|||
|
|||
--- |
|||
|
|||
### System Stats - Battery, Uptime, Queue Length and Debug Flags |
|||
**Usage:** |
|||
- `stats-core` |
|||
|
|||
**Serial Only:** Yes |
|||
|
|||
--- |
|||
|
|||
### Radio Stats - Noise floor, Last RSSI/SNR, Airtime, Receive errors |
|||
**Usage:** `stats-radio` |
|||
|
|||
**Serial Only:** Yes |
|||
|
|||
--- |
|||
|
|||
### Packet stats - Packet counters: Received, Sent |
|||
**Usage:** `stats-packets` |
|||
|
|||
**Serial Only:** Yes |
|||
|
|||
--- |
|||
|
|||
## Logging |
|||
|
|||
### Begin capture of rx log to node storage |
|||
**Usage:** `log start` |
|||
|
|||
--- |
|||
|
|||
### End capture of rx log to node sotrage |
|||
**Usage:** `log stop` |
|||
|
|||
--- |
|||
|
|||
### Erase captured log |
|||
**Usage:** `log erase` |
|||
|
|||
--- |
|||
|
|||
### Print the captured log to the serial terminal |
|||
**Usage:** `log` |
|||
|
|||
**Serial Only:** Yes |
|||
|
|||
--- |
|||
|
|||
## Info |
|||
|
|||
### Get the Version |
|||
**Usage:** `ver` |
|||
|
|||
--- |
|||
|
|||
### Show the hardware name |
|||
**Usage:** `board` |
|||
|
|||
--- |
|||
|
|||
## Configuration |
|||
|
|||
### Radio |
|||
|
|||
#### View or change this node's radio parameters |
|||
**Usage:** |
|||
- `get radio` |
|||
- `set radio <freq>,<bw>,<sf>,<cr>` |
|||
|
|||
**Parameters:** |
|||
- `freq`: Frequency in MHz |
|||
- `bw`: Bandwidth in kHz |
|||
- `sf`: Spreading factor (5-12) |
|||
- `cr`: Coding rate (5-8) |
|||
|
|||
**Set by build flag:** `LORA_FREQ`, `LORA_BW`, `LORA_SF`, `LORA_CR` |
|||
|
|||
**Default:** `869.525,250,11,5` |
|||
|
|||
**Note:** Requires reboot to apply |
|||
|
|||
--- |
|||
|
|||
#### View or change this node's transmit power |
|||
**Usage:** |
|||
- `get tx` |
|||
- `set tx <dbm>` |
|||
|
|||
**Parameters:** |
|||
- `dbm`: Power level in dBm (1-22) |
|||
|
|||
**Set by build flag:** `LORA_TX_POWER` |
|||
|
|||
**Default:** Varies by board |
|||
|
|||
**Notes:** This setting only controls the power level of the LoRa chip. Some nodes have an additional power amplifier stage which increases the total output. Referr to the node's manual for the correct setting to use. **Setting a value too high may violate the laws in your country.** |
|||
|
|||
--- |
|||
|
|||
#### Change the radio parameters for a set duration |
|||
**Usage:** |
|||
- `tempradio <freq>,<bw>,<sf>,<cr>,<timeout_mins>` |
|||
|
|||
**Parameters:** |
|||
- `freq`: Frequency in MHz (300-2500) |
|||
- `bw`: Bandwidth in kHz (7.8-500) |
|||
- `sf`: Spreading factor (5-12) |
|||
- `cr`: Coding rate (5-8) |
|||
- `timeout_mins`: Duration in minutes (must be > 0) |
|||
|
|||
**Note:** This is not saved to preferences and will clear on reboot |
|||
|
|||
--- |
|||
|
|||
#### View or change this node's frequency |
|||
**Usage:** |
|||
- `get freq` |
|||
- `set freq <frequency>` |
|||
|
|||
**Parameters:** |
|||
- `frequency`: Frequency in MHz |
|||
|
|||
**Default:** `869.525` |
|||
|
|||
**Note:** Requires reboot to apply |
|||
|
|||
### System |
|||
|
|||
#### View or change this node's name |
|||
**Usage:** |
|||
- `get name` |
|||
- `set name <name>` |
|||
|
|||
**Parameters:** |
|||
- `name`: Node name |
|||
|
|||
**Set by build flag:** `ADVERT_NAME` |
|||
|
|||
**Default:** Varies by board |
|||
|
|||
**Note:** Max length varies. If a location is set, the max length is 24 bytes; 32 otherwise. Emoji and unicode characters may take more than one byte. |
|||
|
|||
--- |
|||
|
|||
#### View or change this node's latitude |
|||
**Usage:** |
|||
- `get lat` |
|||
- `set lat <degrees>` |
|||
|
|||
**Set by build flag:** `ADVERT_LAT` |
|||
|
|||
**Default:** `0` |
|||
|
|||
**Parameters:** |
|||
- `degrees`: Latitude in degrees |
|||
|
|||
--- |
|||
|
|||
#### View or change this node's longitude |
|||
**Usage:** |
|||
- `get lon` |
|||
- `set lon <degrees>` |
|||
|
|||
**Set by build flag:** `ADVERT_LON` |
|||
|
|||
**Default:** `0` |
|||
|
|||
**Parameters:** |
|||
- `degrees`: Longitude in degrees |
|||
|
|||
--- |
|||
|
|||
#### View or change this node's identity (Private Key) |
|||
**Usage:** |
|||
- `get prv.key` |
|||
- `set prv.key <private_key>` |
|||
|
|||
**Parameters:** |
|||
- `private_key`: Private key in hex format (64 hex characters) |
|||
|
|||
**Serial Only:** |
|||
- `get prv.key`: Yes |
|||
- `set prv.key`: No |
|||
|
|||
**Note:** Requires reboot to take effect after setting |
|||
|
|||
--- |
|||
|
|||
#### View or change this node's admin password |
|||
**Usage:** |
|||
- `get password` |
|||
- `set password <password>` |
|||
|
|||
**Parameters:** |
|||
- `password`: Admin password |
|||
|
|||
**Set by build flag:** `ADMIN_PASSWORD` |
|||
|
|||
**Default:** `password` |
|||
|
|||
**Note:** Echoed back for confirmation |
|||
|
|||
**Note:** Any node using this password will be added to the admin ACL list. |
|||
|
|||
--- |
|||
|
|||
#### View or change this node's guest password |
|||
**Usage:** |
|||
- `get guest.password` |
|||
- `set guest.password <password>` |
|||
|
|||
**Parameters:** |
|||
- `password`: Guest password |
|||
|
|||
**Set by build flag:** `ROOM_PASSWORD` (Room Server only) |
|||
|
|||
**Default:** `<blank>` |
|||
|
|||
--- |
|||
|
|||
#### View or change this node's owner info |
|||
**Usage:** |
|||
- `get owner.info` |
|||
- `set owner.info <text>` |
|||
|
|||
**Parameters:** |
|||
- `text`: Owner information text |
|||
|
|||
**Default:** `<blank>` |
|||
|
|||
**Note:** `|` characters are translated to newlines |
|||
|
|||
**Note:** Requires firmware 1.12.+ |
|||
|
|||
--- |
|||
|
|||
#### Fine-tune the battery reading |
|||
**Usage:** |
|||
- `get adc.multiplier` |
|||
- `set adc.multiplier <value>` |
|||
|
|||
**Parameters:** |
|||
- `value`: ADC multiplier (0.0-10.0) |
|||
|
|||
**Default:** `0.0` (value defined by board) |
|||
|
|||
**Note:** Returns "Error: unsupported by this board" if hardware doesn't support it |
|||
|
|||
--- |
|||
|
|||
#### View or change this node's power saving flag (Repeater Only) |
|||
**Usage:** |
|||
- `powersaving <state>` |
|||
- `powersaving` |
|||
|
|||
**Parameters:** |
|||
- `state`: `on`|`off` |
|||
|
|||
**Default:** `on` |
|||
|
|||
**Note:** When enabled, device enters sleep mode between radio transmissions |
|||
|
|||
--- |
|||
|
|||
### Routing |
|||
|
|||
#### View or change this node's repeat flag |
|||
**Usage:** |
|||
- `get repeat` |
|||
- `set repeat <state>` |
|||
|
|||
**Parameters:** |
|||
- `state`: `on`|`off` |
|||
|
|||
**Default:** `on` |
|||
|
|||
--- |
|||
|
|||
#### View or change the retransmit delay factor for flood traffic |
|||
**Usage:** |
|||
- `get txdelay` |
|||
- `set txdelay <value>` |
|||
|
|||
**Parameters:** |
|||
- `value`: Transmit delay factor (0-2) |
|||
|
|||
**Default:** `0.5` |
|||
|
|||
--- |
|||
|
|||
#### View or change the retransmit delay factor for direct traffic |
|||
**Usage:** |
|||
- `get direct.txdelay` |
|||
- `set direct.txdelay <value>` |
|||
|
|||
**Parameters:** |
|||
- `value`: Direct transmit delay factor (0-2) |
|||
|
|||
**Default:** `0.2` |
|||
|
|||
--- |
|||
|
|||
#### [Experimental] View or change the processing delay for received traffic |
|||
**Usage:** |
|||
- `get rxdelay` |
|||
- `set rxdelay <value>` |
|||
|
|||
**Parameters:** |
|||
- `value`: Receive delay base (0-20) |
|||
|
|||
**Default:** `0.0` |
|||
|
|||
--- |
|||
|
|||
#### View or change the airtime factor (duty cycle limit) |
|||
**Usage:** |
|||
- `get af` |
|||
- `set af <value>` |
|||
|
|||
**Parameters:** |
|||
- `value`: Airtime factor (0-9) |
|||
|
|||
**Default:** `1.0` |
|||
|
|||
--- |
|||
|
|||
#### View or change the local interference threshold |
|||
**Usage:** |
|||
- `get int.thresh` |
|||
- `set int.thresh <value>` |
|||
|
|||
**Parameters:** |
|||
- `value`: Interference threshold value |
|||
|
|||
**Default:** `0.0` |
|||
|
|||
--- |
|||
|
|||
#### View or change the AGC Reset Interval |
|||
**Usage:** |
|||
- `get agc.reset.interval` |
|||
- `set agc.reset.interval <value>` |
|||
|
|||
**Parameters:** |
|||
- `value`: Interval in seconds rounded down to a multiple of 4 (17 becomes 16) |
|||
|
|||
**Default:** `0.0` |
|||
|
|||
--- |
|||
|
|||
#### Enable or disable Multi-Acks support |
|||
**Usage:** |
|||
- `get multi.acks` |
|||
- `set multi.acks <state>` |
|||
|
|||
**Parameters:** |
|||
- `state`: `0` (disable) or `1` (enable) |
|||
|
|||
**Default:** `0` |
|||
|
|||
--- |
|||
|
|||
#### View or change the flood advert interval |
|||
**Usage:** |
|||
- `get flood.advert.interval` |
|||
- `set flood.advert.interval <hours>` |
|||
|
|||
**Parameters:** |
|||
- `hours`: Interval in hours (3-168) |
|||
|
|||
**Default:** `12` (Repeater) - `0` (Sensor) |
|||
|
|||
--- |
|||
|
|||
#### View or change the zero-hop advert interval |
|||
**Usage:** |
|||
- `get advert.interval` |
|||
- `set advert.interval <minutes>` |
|||
|
|||
**Parameters:** |
|||
- `minutes`: Interval in minutes rounded down to the nearest multiple of 2 (61 becomes 60) (60-240) |
|||
|
|||
**Default:** `0` |
|||
|
|||
--- |
|||
|
|||
#### Limit the number of hops for a flood message |
|||
**Usage:** |
|||
- `get flood.max` |
|||
- `set flood.max <value>` |
|||
|
|||
**Parameters:** |
|||
- `value`: Maximum flood hop count (0-64) |
|||
|
|||
**Default:** `64` |
|||
|
|||
--- |
|||
|
|||
### ACL |
|||
|
|||
#### Add, update or remove permissions for a companion |
|||
**Usage:** |
|||
- `setperm <pubkey> <permissions>` |
|||
|
|||
**Parameters:** |
|||
- `pubkey`: Companion public key |
|||
- `permissions`: |
|||
- `0`: Guest |
|||
- `1`: Read-only |
|||
- `2`: Read-write |
|||
- `3`: Admin |
|||
|
|||
**Note:** Removes the entry when `permissions` is omitted |
|||
|
|||
--- |
|||
|
|||
#### View the current ACL |
|||
**Usage:** |
|||
- `get acl` |
|||
|
|||
**Serial Only:** Yes |
|||
|
|||
--- |
|||
|
|||
#### View or change this room server's 'read-only' flag |
|||
**Usage:** |
|||
- `get allow.read.only` |
|||
- `set allow.read.only <state>` |
|||
|
|||
**Parameters:** |
|||
- `state`: `on` (enable) or `off` (disable) |
|||
|
|||
**Default:** `off` |
|||
|
|||
--- |
|||
|
|||
### Region Management (v1.10.+) |
|||
|
|||
#### Bulk-load region lists |
|||
**Usage:** |
|||
- `region load` |
|||
- `region load <name> [flood_flag]` |
|||
|
|||
**Parameters:** |
|||
- `name`: A name of a region. `*` represents the wildcard region |
|||
|
|||
**Note:** `flood_flag`: Optional `F` to allow flooding |
|||
|
|||
**Note:** Indentation creates parent-child relationships (max 8 levels) |
|||
|
|||
**Note:** `region load` with an empty name will not work remotely (it's interactive) |
|||
|
|||
--- |
|||
|
|||
#### Save any changes to regions made since reboot |
|||
**Usage:** |
|||
- `region save` |
|||
|
|||
--- |
|||
|
|||
#### Allow a region |
|||
**Usage:** |
|||
- `region allowf <name>` |
|||
|
|||
**Parameters:** |
|||
- `name`: Region name (or `*` for wildcard) |
|||
|
|||
**Note:** Setting on wildcard `*` allows packets without region transport codes |
|||
|
|||
--- |
|||
|
|||
#### Block a region |
|||
**Usage:** |
|||
- `region denyf <name>` |
|||
|
|||
**Parameters:** |
|||
- `name`: Region name (or `*` for wildcard) |
|||
|
|||
**Note:** Setting on wildcard `*` drops packets without region transport codes |
|||
|
|||
--- |
|||
|
|||
#### Show information for a region |
|||
**Usage:** |
|||
- `region get <name>` |
|||
|
|||
**Parameters:** |
|||
- `name`: Region name (or `*` for wildcard) |
|||
|
|||
--- |
|||
|
|||
#### View or change the home region for this node |
|||
**Usage:** |
|||
- `region home` |
|||
- `region home <name>` |
|||
|
|||
**Parameters:** |
|||
- `name`: Region name |
|||
|
|||
--- |
|||
|
|||
#### Create a new region |
|||
**Usage:** |
|||
- `region put <name> [parent_name]` |
|||
|
|||
**Parameters:** |
|||
- `name`: Region name |
|||
- `parent_name`: Parent region name (optional, defaults to wildcard) |
|||
|
|||
--- |
|||
|
|||
#### Remove a region |
|||
**Usage:** |
|||
- `region remove <name>` |
|||
|
|||
**Parameters:** |
|||
- `name`: Region name |
|||
|
|||
**Note:** Must remove all child regions before the region can be removed |
|||
|
|||
--- |
|||
|
|||
#### View all regions |
|||
**Usage:** |
|||
- `region list <filter>` |
|||
|
|||
**Serial Only:** Yes |
|||
|
|||
**Parameters:** |
|||
- `filter`: `allowed`|`denied` |
|||
|
|||
**Note:** Requires firmware 1.12.+ |
|||
|
|||
--- |
|||
|
|||
#### Dump all defined regions and flood permissions |
|||
**Usage:** |
|||
- `region` |
|||
|
|||
**Serial Only:** Yes |
|||
|
|||
--- |
|||
|
|||
### Region Examples |
|||
|
|||
**Example 1: Using F Flag with Named Public Region** |
|||
``` |
|||
region load |
|||
#Europe F |
|||
<blank line to end region load> |
|||
region save |
|||
``` |
|||
|
|||
**Explanation:** |
|||
- Creates a region named `#Europe` with flooding enabled |
|||
- Packets from this region will be flooded to other nodes |
|||
|
|||
--- |
|||
|
|||
**Example 2: Using Wildcard with F Flag** |
|||
``` |
|||
region load |
|||
* F |
|||
<blank line to end region load> |
|||
region save |
|||
``` |
|||
|
|||
**Explanation:** |
|||
- Creates a wildcard region `*` with flooding enabled |
|||
- Enables flooding for all regions automatically |
|||
- Applies only to packets without transport codes |
|||
|
|||
--- |
|||
|
|||
**Example 3: Using Wildcard Without F Flag** |
|||
``` |
|||
region load |
|||
* |
|||
<blank line to end region load> |
|||
region save |
|||
``` |
|||
**Explanation:** |
|||
- Creates a wildcard region `*` without flooding |
|||
- This region exists but doesn't affect packet distribution |
|||
- Used as a default/empty region |
|||
|
|||
--- |
|||
|
|||
**Example 4: Nested Public Region with F Flag** |
|||
``` |
|||
region load |
|||
#Europe F |
|||
#UK |
|||
#London |
|||
#Manchester |
|||
#France |
|||
#Paris |
|||
#Lyon |
|||
<blank line to end region load> |
|||
region save |
|||
``` |
|||
|
|||
**Explanation:** |
|||
- Creates `#Europe` region with flooding enabled |
|||
- Adds nested child regions (`#UK`, `#France`) |
|||
- All nested regions inherit the flooding flag from parent |
|||
|
|||
--- |
|||
|
|||
**Example 5: Wildcard with Nested Public Regions** |
|||
``` |
|||
region load |
|||
* F |
|||
#NorthAmerica |
|||
#USA |
|||
#NewYork |
|||
#California |
|||
#Canada |
|||
#Ontario |
|||
#Quebec |
|||
<blank line to end region load> |
|||
region save |
|||
``` |
|||
|
|||
**Explanation:** |
|||
- Creates wildcard region `*` with flooding enabled |
|||
- Adds nested `#NorthAmerica` hierarchy |
|||
- Enables flooding for all child regions automatically |
|||
- Useful for global networks with specific regional rules |
|||
|
|||
--- |
|||
### GPS (When GPS support is compiled in) |
|||
|
|||
#### View or change GPS state |
|||
**Usage:** |
|||
- `gps` |
|||
- `gps <state>` |
|||
|
|||
**Parameters:** |
|||
- `state`: `on`|`off` |
|||
|
|||
**Default:** `off` |
|||
|
|||
**Note:** Output format: `{status}, {fix}, {sat count}` (when enabled) |
|||
|
|||
--- |
|||
|
|||
#### Sync this node's clock with GPS time |
|||
**Usage:** |
|||
- `gps sync` |
|||
|
|||
--- |
|||
|
|||
#### Set this node's location based on the GPS coordinates |
|||
**Usage:** |
|||
- `gps setloc` |
|||
|
|||
--- |
|||
|
|||
#### View or change the GPS advert policy |
|||
**Usage:** |
|||
- `gps advert` |
|||
- `gps advert <policy>` |
|||
|
|||
**Parameters:** |
|||
- `policy`: `none`|`shared`|`prefs` |
|||
- `none`: don't include location in adverts |
|||
- `share`: share gps location (from SensorManager) |
|||
- `prefs`: location stored in node's lat and lon settings |
|||
|
|||
**Default:** `prefs` |
|||
|
|||
--- |
|||
|
|||
### Sensors (When sensor support is compiled in) |
|||
|
|||
#### View the list of sensors on this node |
|||
**Usage:** `sensor list [start]` |
|||
|
|||
**Parameters:** |
|||
- `start`: Optional starting index (defaults to 0) |
|||
|
|||
**Note:** Output format: `<var_name>=<value>\n` |
|||
|
|||
--- |
|||
|
|||
#### View or change thevalue of a sensor |
|||
**Usage:** |
|||
- `sensor get <key>` |
|||
- `sensor set <key> <value>` |
|||
|
|||
**Parameters:** |
|||
- `key`: Sensor setting name |
|||
- `value`: The value to set the sensor to |
|||
|
|||
--- |
|||
|
|||
### Bridge (When bridge support is compiled in) |
|||
|
|||
#### View or change the bridge enabled flag |
|||
**Usage:** |
|||
- `get bridge.enabled` |
|||
- `set bridge.enabled <state>` |
|||
|
|||
**Parameters:** |
|||
- `state`: `on`|`off` |
|||
|
|||
**Default:** `off` |
|||
|
|||
--- |
|||
|
|||
#### View the bridge source |
|||
**Usage:** |
|||
- `get bridge.source` |
|||
|
|||
--- |
|||
|
|||
#### Add a delay to packets routed through this bridge |
|||
**Usage:** |
|||
- `get bridge.delay` |
|||
- `set bridge.delay <ms>` |
|||
|
|||
**Parameters:** |
|||
- `ms`: Delay in milliseconds (0-10000) |
|||
|
|||
**Default:** `500` |
|||
|
|||
--- |
|||
|
|||
#### View or change the source of packets bridged to the external interface |
|||
**Usage:** |
|||
- `get bridge.source` |
|||
- `set bridge.source <source>` |
|||
|
|||
**Parameters:** |
|||
- `source`: |
|||
- `rx`: bridges received packets |
|||
- `tx`: bridges transmitted packets |
|||
|
|||
**Default:** `tx` |
|||
|
|||
--- |
|||
|
|||
#### View or change the speed of the bridge (RS-232 only) |
|||
**Usage:** |
|||
- `get bridge.baud` |
|||
- `set bridge.baud <rate>` |
|||
|
|||
**Parameters:** |
|||
- `rate`: Baud rate (`9600`, `19200`, `38400`, `57600`, or `115200`) |
|||
|
|||
**Default:** `115200` |
|||
|
|||
--- |
|||
|
|||
#### View or change the channel used for bridging (ESPNow only) |
|||
**Usage:** |
|||
- `get bridge.channel` |
|||
- `set bridge.channel <channel>` |
|||
|
|||
**Parameters:** |
|||
- `channel`: Channel number (1-14) |
|||
|
|||
--- |
|||
|
|||
#### Set the ESP-Now secret |
|||
**Usage:** |
|||
- `get bridge.secret` |
|||
- `set bridge.secret <secret>` |
|||
|
|||
**Parameters:** |
|||
- `secret`: 16-character encryption secret |
|||
|
|||
**Default:** Varies by board |
|||
|
|||
--- |
|||
@ -0,0 +1,213 @@ |
|||
# nRF52 Power Management |
|||
|
|||
## Overview |
|||
|
|||
The nRF52 Power Management module provides battery protection features to prevent over-discharge, minimise likelihood of brownout and flash corruption conditions existing, and enable safe voltage-based recovery. |
|||
|
|||
## Features |
|||
|
|||
### Boot Voltage Protection |
|||
- Checks battery voltage immediately after boot and before mesh operations commence |
|||
- If voltage is below a configurable threshold (e.g., 3300mV), the device configures voltage wake (LPCOMP + VBUS) and enters protective shutdown (SYSTEMOFF) |
|||
- Prevents boot loops when battery is critically low |
|||
- Skipped when external power (USB VBUS) is detected |
|||
|
|||
### Voltage Wake (LPCOMP + VBUS) |
|||
- Configures the nRF52's Low Power Comparator (LPCOMP) before entering SYSTEMOFF |
|||
- Enables USB VBUS detection so external power can wake the device |
|||
- Device automatically wakes when battery voltage rises above recovery threshold or when VBUS is detected |
|||
|
|||
### Early Boot Register Capture |
|||
- Captures RESETREAS (reset reason) and GPREGRET2 (shutdown reason) before SystemInit() clears them |
|||
- Allows firmware to determine why it booted (cold boot, watchdog, LPCOMP wake, etc.) |
|||
- Allows firmware to determine why it last shut down (user request, low voltage, boot protection) |
|||
|
|||
### Shutdown Reason Tracking |
|||
Shutdown reason codes (stored in GPREGRET2): |
|||
| Code | Name | Description | |
|||
|------|------|-------------| |
|||
| 0x00 | NONE | Normal boot / no previous shutdown | |
|||
| 0x4C | LOW_VOLTAGE | Runtime low voltage threshold reached | |
|||
| 0x55 | USER | User requested powerOff() | |
|||
| 0x42 | BOOT_PROTECT | Boot voltage protection triggered | |
|||
|
|||
## Supported Boards |
|||
|
|||
| Board | Implemented | LPCOMP wake | VBUS wake | |
|||
|-------|-------------|-------------|-----------| |
|||
| Seeed Studio XIAO nRF52840 (`xiao_nrf52`) | Yes | Yes | Yes | |
|||
| RAK4631 (`rak4631`) | Yes | Yes | Yes | |
|||
| Heltec T114 (`heltec_t114`) | Yes | Yes | Yes | |
|||
| Promicro nRF52840 | No | No | No | |
|||
| RAK WisMesh Tag | No | No | No | |
|||
| Heltec Mesh Solar | No | No | No | |
|||
| LilyGo T-Echo / T-Echo Lite | No | No | No | |
|||
| SenseCAP Solar | No | No | No | |
|||
| WIO Tracker L1 / L1 E-Ink | No | No | No | |
|||
| WIO WM1110 | No | No | No | |
|||
| Mesh Pocket | No | No | No | |
|||
| Nano G2 Ultra | No | No | No | |
|||
| ThinkNode M1/M3/M6 | No | No | No | |
|||
| T1000-E | No | No | No | |
|||
| Ikoka Nano/Stick/Handheld (nRF) | No | No | No | |
|||
| Keepteen LT1 | No | No | No | |
|||
| Minewsemi ME25LS01 | No | No | No | |
|||
|
|||
Notes: |
|||
- "Implemented" reflects Phase 1 (boot lockout + shutdown reason capture). |
|||
- User power-off on Heltec T114 does not enable LPCOMP wake. |
|||
- VBUS detection is used to skip boot lockout on external power, and VBUS wake is configured alongside LPCOMP when supported hardware exposes VBUS to the nRF52. |
|||
|
|||
## Technical Details |
|||
|
|||
### Architecture |
|||
|
|||
The power management functionality is integrated into the `NRF52Board` base class in `src/helpers/NRF52Board.cpp`. Board variants provide hardware-specific configuration via a `PowerMgtConfig` struct and override `initiateShutdown(uint8_t reason)` to perform board-specific power-down work and conditionally enable voltage wake (LPCOMP + VBUS). |
|||
|
|||
### Early Boot Capture |
|||
|
|||
A static constructor with priority 101 in `NRF52Board.cpp` captures the RESETREAS and GPREGRET2 registers before: |
|||
- SystemInit() (priority 102) - which clears RESETREAS |
|||
- Static C++ constructors (default priority 65535) |
|||
|
|||
This ensures we capture the true reset reason before any initialisation code runs. |
|||
|
|||
### Board Implementation |
|||
|
|||
To enable power management on a board variant: |
|||
|
|||
1. **Enable in platformio.ini**: |
|||
```ini |
|||
-D NRF52_POWER_MANAGEMENT |
|||
``` |
|||
|
|||
2. **Define configuration in variant.h**: |
|||
```c |
|||
#define PWRMGT_VOLTAGE_BOOTLOCK 3300 // Won't boot below this voltage (mV) |
|||
#define PWRMGT_LPCOMP_AIN 7 // AIN channel for voltage sensing |
|||
#define PWRMGT_LPCOMP_REFSEL 2 // REFSEL (0-6=1/8..7/8, 7=ARef, 8-15=1/16..15/16) |
|||
``` |
|||
|
|||
3. **Implement in board .cpp file**: |
|||
```cpp |
|||
#ifdef NRF52_POWER_MANAGEMENT |
|||
const PowerMgtConfig power_config = { |
|||
.lpcomp_ain_channel = PWRMGT_LPCOMP_AIN, |
|||
.lpcomp_refsel = PWRMGT_LPCOMP_REFSEL, |
|||
.voltage_bootlock = PWRMGT_VOLTAGE_BOOTLOCK |
|||
}; |
|||
|
|||
void MyBoard::initiateShutdown(uint8_t reason) { |
|||
// Board-specific shutdown preparation (e.g., disable peripherals) |
|||
bool enable_lpcomp = (reason == SHUTDOWN_REASON_LOW_VOLTAGE || |
|||
reason == SHUTDOWN_REASON_BOOT_PROTECT); |
|||
|
|||
if (enable_lpcomp) { |
|||
configureVoltageWake(power_config.lpcomp_ain_channel, power_config.lpcomp_refsel); |
|||
} |
|||
|
|||
enterSystemOff(reason); |
|||
} |
|||
#endif |
|||
|
|||
void MyBoard::begin() { |
|||
NRF52Board::begin(); // or NRF52BoardDCDC::begin() |
|||
// ... board setup ... |
|||
|
|||
#ifdef NRF52_POWER_MANAGEMENT |
|||
checkBootVoltage(&power_config); |
|||
#endif |
|||
} |
|||
``` |
|||
|
|||
For user-initiated shutdowns, `powerOff()` remains board-specific. Power management only arms LPCOMP for automated shutdown reasons (boot protection/low voltage). |
|||
|
|||
4. **Declare override in board .h file**: |
|||
```cpp |
|||
#ifdef NRF52_POWER_MANAGEMENT |
|||
void initiateShutdown(uint8_t reason) override; |
|||
#endif |
|||
``` |
|||
|
|||
### Voltage Wake Configuration |
|||
|
|||
The LPCOMP (Low Power Comparator) is configured to: |
|||
- Monitor the specified AIN channel (0-7 corresponding to P0.02-P0.05, P0.28-P0.31) |
|||
- Compare against VDD fraction reference (REFSEL: 0-6=1/8..7/8, 7=ARef, 8-15=1/16..15/16) |
|||
- Detect UP events (voltage rising above threshold) |
|||
- Use 50mV hysteresis for noise immunity |
|||
- Wake the device from SYSTEMOFF when triggered |
|||
|
|||
VBUS wake is enabled via the POWER peripheral USBDETECTED event whenever `configureVoltageWake()` is used. This requires USB VBUS to be routed to the nRF52 (typical on nRF52840 boards with native USB). |
|||
|
|||
**LPCOMP Reference Selection (PWRMGT_LPCOMP_REFSEL)**: |
|||
| REFSEL | Fraction | VBAT @ 1M/1M divider (VDD=3.0-3.3) | VBAT @ 1.5M/1M divider (VDD=3.0-3.3) | |
|||
|--------|----------|------------------------------------|--------------------------------------| |
|||
| 0 | 1/8 | 0.75-0.82 V | 0.94-1.03 V | |
|||
| 1 | 2/8 | 1.50-1.65 V | 1.88-2.06 V | |
|||
| 2 | 3/8 | 2.25-2.47 V | 2.81-3.09 V | |
|||
| 3 | 4/8 | 3.00-3.30 V | 3.75-4.12 V | |
|||
| 4 | 5/8 | 3.75-4.12 V | 4.69-5.16 V | |
|||
| 5 | 6/8 | 4.50-4.95 V | 5.62-6.19 V | |
|||
| 6 | 7/8 | 5.25-5.77 V | 6.56-7.22 V | |
|||
| 7 | ARef | - | - | |
|||
| 8 | 1/16 | 0.38-0.41 V | 0.47-0.52 V | |
|||
| 9 | 3/16 | 1.12-1.24 V | 1.41-1.55 V | |
|||
| 10 | 5/16 | 1.88-2.06 V | 2.34-2.58 V | |
|||
| 11 | 7/16 | 2.62-2.89 V | 3.28-3.61 V | |
|||
| 12 | 9/16 | 3.38-3.71 V | 4.22-4.64 V | |
|||
| 13 | 11/16 | 4.12-4.54 V | 5.16-5.67 V | |
|||
| 14 | 13/16 | 4.88-5.36 V | 6.09-6.70 V | |
|||
| 15 | 15/16 | 5.62-6.19 V | 7.03-7.73 V | |
|||
|
|||
**Important**: For boards with a voltage divider on the battery sense pin, LPCOMP measures the divided voltage. Use: |
|||
`VBAT_threshold ≈ (VDD * fraction) * divider_scale`, where `divider_scale = (Rtop + Rbottom) / Rbottom` (e.g., 2.0 for 1M/1M, 2.5 for 1.5M/1M, 3.0 for XIAO). |
|||
|
|||
### SoftDevice Compatibility |
|||
|
|||
The power management code checks whether SoftDevice is enabled and uses the appropriate API: |
|||
- When SD enabled: `sd_power_*` functions |
|||
- When SD disabled: Direct register access (NRF_POWER->*) |
|||
|
|||
This ensures compatibility regardless of BLE stack state. |
|||
|
|||
## CLI Commands |
|||
|
|||
Power management status can be queried via the CLI: |
|||
|
|||
| Command | Description | |
|||
|---------|-------------| |
|||
| `get pwrmgt.support` | Returns "supported" or "unsupported" | |
|||
| `get pwrmgt.source` | Returns current power source - "battery" or "external" (5V/USB power) | |
|||
| `get pwrmgt.bootreason` | Returns reset and shutdown reason strings | |
|||
| `get pwrmgt.bootmv` | Returns boot voltage in millivolts | |
|||
|
|||
On boards without power management enabled, all commands except `get pwrmgt.support` return: |
|||
``` |
|||
ERROR: Power management not supported |
|||
``` |
|||
|
|||
## Debug Output |
|||
|
|||
When `MESH_DEBUG=1` is enabled, the power management module outputs: |
|||
``` |
|||
DEBUG: PWRMGT: Reset = Wake from LPCOMP (0x20000); Shutdown = Low Voltage (0x4C) |
|||
DEBUG: PWRMGT: Boot voltage = 3450 mV (threshold = 3300 mV) |
|||
DEBUG: PWRMGT: LPCOMP wake configured (AIN7, ref=3/8 VDD) |
|||
``` |
|||
|
|||
## Phase 2 (Planned) |
|||
|
|||
- Runtime voltage monitoring |
|||
- Voltage state machine (Normal -> Warning -> Critical -> Shutdown) |
|||
- Configurable thresholds |
|||
- Load shedding callbacks for power reduction |
|||
- Deep sleep integration |
|||
- Scheduled wake-up |
|||
- Extended sleep with periodic monitoring |
|||
|
|||
## References |
|||
|
|||
- [nRF52840 Product Specification - POWER](https://infocenter.nordicsemi.com/topic/ps_nrf52840/power.html) |
|||
- [nRF52840 Product Specification - LPCOMP](https://infocenter.nordicsemi.com/topic/ps_nrf52840/lpcomp.html) |
|||
- [SoftDevice S140 API - Power Management](https://infocenter.nordicsemi.com/topic/sdk_nrf5_v17.1.0/group__nrf__sdm__api.html) |
|||
@ -0,0 +1,44 @@ |
|||
#include "MeshtinyBoard.h" |
|||
|
|||
#include <Arduino.h> |
|||
#include <Wire.h> |
|||
#include <bluefruit.h> |
|||
|
|||
static BLEDfu bledfu; |
|||
|
|||
static void connect_callback(uint16_t conn_handle) { |
|||
(void)conn_handle; |
|||
MESH_DEBUG_PRINTLN("BLE client connected"); |
|||
} |
|||
|
|||
static void disconnect_callback(uint16_t conn_handle, uint8_t reason) { |
|||
(void)conn_handle; |
|||
(void)reason; |
|||
|
|||
MESH_DEBUG_PRINTLN("BLE client disconnected"); |
|||
} |
|||
|
|||
void MeshtinyBoard::begin() { |
|||
NRF52BoardDCDC::begin(); |
|||
btn_prev_state = HIGH; |
|||
|
|||
pinMode(PIN_VBAT_READ, INPUT); // VBAT ADC input
|
|||
|
|||
// Set all button pins to INPUT_PULLUP
|
|||
pinMode(PIN_BUTTON1, INPUT_PULLUP); |
|||
pinMode(PIN_BUTTON2, INPUT_PULLUP); |
|||
pinMode(PIN_BUTTON3, INPUT_PULLUP); |
|||
pinMode(PIN_BUTTON4, INPUT_PULLUP); |
|||
|
|||
#if defined(PIN_WIRE_SDA) && defined(PIN_WIRE_SCL) |
|||
Wire.setPins(PIN_WIRE_SDA, PIN_WIRE_SCL); |
|||
#endif |
|||
|
|||
Wire.begin(); |
|||
|
|||
pinMode(SX126X_POWER_EN, OUTPUT); |
|||
digitalWrite(SX126X_POWER_EN, HIGH); |
|||
delay(10); // give sx1262 some time to power up
|
|||
} |
|||
|
|||
|
|||
@ -0,0 +1,66 @@ |
|||
#pragma once |
|||
|
|||
#include <Arduino.h> |
|||
#include <MeshCore.h> |
|||
#include <helpers/NRF52Board.h> |
|||
|
|||
class MeshtinyBoard : public NRF52BoardDCDC { |
|||
protected: |
|||
uint8_t btn_prev_state; |
|||
|
|||
public: |
|||
MeshtinyBoard() : NRF52Board("Meshtiny OTA") {} |
|||
void begin(); |
|||
|
|||
#if defined(P_LORA_TX_LED) |
|||
void onBeforeTransmit() override { |
|||
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED on
|
|||
} |
|||
void onAfterTransmit() override { |
|||
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED off
|
|||
} |
|||
#endif |
|||
|
|||
uint16_t getBattMilliVolts() override { |
|||
int adcvalue = 0; |
|||
analogReadResolution(12); |
|||
analogReference(AR_INTERNAL_3_0); |
|||
delay(10); |
|||
adcvalue = analogRead(PIN_VBAT_READ); |
|||
return (adcvalue * ADC_MULTIPLIER * AREF_VOLTAGE) / 4.096; |
|||
} |
|||
|
|||
const char *getManufacturerName() const override { return "Meshtiny"; } |
|||
|
|||
void reboot() override { NVIC_SystemReset(); } |
|||
|
|||
void powerOff() override { |
|||
|
|||
#ifdef PIN_USER_BTN |
|||
while (digitalRead(PIN_USER_BTN) == LOW) { |
|||
delay(10); |
|||
} |
|||
#endif |
|||
|
|||
#ifdef PIN_3V3_EN |
|||
pinMode(PIN_3V3_EN, OUTPUT); |
|||
digitalWrite(PIN_3V3_EN, LOW); |
|||
#endif |
|||
|
|||
|
|||
#ifdef PIN_LED1 |
|||
digitalWrite(PIN_LED1, LOW); |
|||
#endif |
|||
|
|||
#ifdef PIN_LED2 |
|||
digitalWrite(PIN_LED2, LOW); |
|||
#endif |
|||
|
|||
#ifdef PIN_USER_BTN |
|||
nrf_gpio_cfg_sense_input(g_ADigitalPinMap[PIN_USER_BTN], NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW); |
|||
#endif |
|||
|
|||
sd_power_system_off(); |
|||
} |
|||
|
|||
}; |
|||
@ -0,0 +1,68 @@ |
|||
[Meshtiny] |
|||
extends = nrf52_base |
|||
board = meshtiny |
|||
board_build.ldscript = boards/nrf52840_s140_v6.ld |
|||
build_flags = ${nrf52_base.build_flags} |
|||
-I lib/nrf52/s140_nrf52_6.1.1_API/include |
|||
-I lib/nrf52/s140_nrf52_6.1.1_API/include/nrf52 |
|||
-I variants/meshtiny |
|||
-D RADIO_CLASS=CustomSX1262 |
|||
-D WRAPPER_CLASS=CustomSX1262Wrapper |
|||
-D LORA_TX_POWER=22 |
|||
-D SX126X_CURRENT_LIMIT=140 |
|||
-D SX126X_RX_BOOSTED_GAIN=1 |
|||
-D PIN_3V3_EN=34 |
|||
-D MESHTINY |
|||
-D UI_HAS_JOYSTICK |
|||
build_src_filter = ${nrf52_base.build_src_filter} |
|||
+<../variants/meshtiny> |
|||
+<helpers/ui/SSD1306Display.cpp> |
|||
+<helpers/ui/buzzer.cpp> |
|||
+<helpers/sensors> |
|||
lib_deps = |
|||
${nrf52_base.lib_deps} |
|||
adafruit/Adafruit SSD1306 @ ^2.5.13 |
|||
end2endzone/NonBlockingRTTTL@^1.3.0 |
|||
|
|||
[env:Meshtiny_companion_radio_usb] |
|||
extends = Meshtiny |
|||
build_flags = |
|||
${Meshtiny.build_flags} |
|||
-I examples/companion_radio/ui-new |
|||
-D MESHTINY |
|||
-D PIN_BUZZER=30 |
|||
-D DISPLAY_CLASS=SSD1306Display |
|||
-D MAX_CONTACTS=350 |
|||
-D MAX_GROUP_CHANNELS=40 |
|||
-D OFFLINE_QUEUE_SIZE=256 |
|||
; -D MESH_PACKET_LOGGING=1 |
|||
; -D MESH_DEBUG=1 |
|||
build_src_filter = ${Meshtiny.build_src_filter} |
|||
+<../examples/companion_radio/*.cpp> |
|||
+<../examples/companion_radio/ui-new/*.cpp> |
|||
lib_deps = |
|||
${Meshtiny.lib_deps} |
|||
densaugeo/base64 @ ~1.4.0 |
|||
|
|||
[env:Meshtiny_companion_radio_ble] |
|||
extends = Meshtiny |
|||
build_flags = |
|||
${Meshtiny.build_flags} |
|||
-I examples/companion_radio/ui-new |
|||
-D MESHTINY |
|||
-D PIN_BUZZER=30 |
|||
-D DISPLAY_CLASS=SSD1306Display |
|||
-D MAX_CONTACTS=350 |
|||
-D MAX_GROUP_CHANNELS=40 |
|||
-D BLE_PIN_CODE=123456 |
|||
-D OFFLINE_QUEUE_SIZE=256 |
|||
; -D MESH_PACKET_LOGGING=1 |
|||
; -D MESH_DEBUG=1 |
|||
; -D BLE_DEBUG_LOGGING=1 |
|||
build_src_filter = ${Meshtiny.build_src_filter} |
|||
+<helpers/nrf52/SerialBLEInterface.cpp> |
|||
+<../examples/companion_radio/*.cpp> |
|||
+<../examples/companion_radio/ui-new/*.cpp> |
|||
lib_deps = |
|||
${Meshtiny.lib_deps} |
|||
densaugeo/base64 @ ~1.4.0 |
|||
@ -0,0 +1,47 @@ |
|||
#include "target.h" |
|||
|
|||
#include <Arduino.h> |
|||
#include <helpers/ArduinoHelpers.h> |
|||
|
|||
MeshtinyBoard 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); |
|||
EnvironmentSensorManager sensors = EnvironmentSensorManager(); |
|||
|
|||
#ifdef DISPLAY_CLASS |
|||
DISPLAY_CLASS display; |
|||
MomentaryButton user_btn(ENCODER_PRESS, 1000, true, true); |
|||
MomentaryButton joystick_left(ENCODER_LEFT, 1000, true, true); |
|||
MomentaryButton joystick_right(ENCODER_RIGHT, 1000, true, true); |
|||
MomentaryButton back_btn(PIN_SIDE_BUTTON, 1000, true, true); |
|||
#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); |
|||
} |
|||
|
|||
mesh::LocalIdentity radio_new_identity() { |
|||
RadioNoiseListener rng(radio); |
|||
return mesh::LocalIdentity(&rng); // create new random identity
|
|||
} |
|||
@ -0,0 +1,33 @@ |
|||
#pragma once |
|||
|
|||
#define RADIOLIB_STATIC_ONLY 1 |
|||
#include <MeshtinyBoard.h> |
|||
#include <RadioLib.h> |
|||
#include <helpers/ArduinoHelpers.h> |
|||
#include <helpers/AutoDiscoverRTCClock.h> |
|||
#include <helpers/radiolib/CustomSX1262Wrapper.h> |
|||
#include <helpers/radiolib/RadioLibWrappers.h> |
|||
#ifdef DISPLAY_CLASS |
|||
#include <helpers/ui/MomentaryButton.h> |
|||
#include <helpers/ui/SSD1306Display.h> |
|||
#endif |
|||
#include <helpers/sensors/EnvironmentSensorManager.h> |
|||
|
|||
extern MeshtinyBoard board; |
|||
extern WRAPPER_CLASS radio_driver; |
|||
extern AutoDiscoverRTCClock rtc_clock; |
|||
extern EnvironmentSensorManager sensors; |
|||
|
|||
#ifdef DISPLAY_CLASS |
|||
extern DISPLAY_CLASS display; |
|||
extern MomentaryButton user_btn; |
|||
extern MomentaryButton joystick_left; |
|||
extern MomentaryButton joystick_right; |
|||
extern MomentaryButton back_btn; |
|||
#endif |
|||
|
|||
bool radio_init(); |
|||
uint32_t radio_get_rng_seed(); |
|||
void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); |
|||
void radio_set_tx_power(uint8_t dbm); |
|||
mesh::LocalIdentity radio_new_identity(); |
|||
@ -0,0 +1,51 @@ |
|||
/*
|
|||
Copyright (c) 2014-2015 Arduino LLC. All right reserved. |
|||
Copyright (c) 2016 Sandeep Mistry All right reserved. |
|||
Copyright (c) 2018, Adafruit Industries (adafruit.com) |
|||
|
|||
This library is free software; you can redistribute it and/or |
|||
modify it under the terms of the GNU Lesser General Public |
|||
License as published by the Free Software Foundation; either |
|||
version 2.1 of the License, or (at your option) any later version. |
|||
|
|||
This library is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
|||
See the GNU Lesser General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU Lesser General Public |
|||
License along with this library; if not, write to the Free Software |
|||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
|||
*/ |
|||
|
|||
#include "variant.h" |
|||
|
|||
#include "nrf.h" |
|||
#include "wiring_constants.h" |
|||
#include "wiring_digital.h" |
|||
|
|||
const uint32_t g_ADigitalPinMap[] = { |
|||
// P0
|
|||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, |
|||
29, 30, 31, |
|||
|
|||
// P1
|
|||
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47 |
|||
}; |
|||
|
|||
void initVariant() { |
|||
// LED1 & LED2
|
|||
#ifdef PIN_LED1 |
|||
pinMode(PIN_LED1, OUTPUT); |
|||
ledOff(PIN_LED1); |
|||
#endif |
|||
|
|||
#ifdef PIN_LED2 |
|||
pinMode(PIN_LED2, OUTPUT); |
|||
ledOff(PIN_LED2); |
|||
#endif |
|||
|
|||
// 3V3 Power Rail - nothing connected on meshtiny
|
|||
pinMode(PIN_3V3_EN, OUTPUT); |
|||
digitalWrite(PIN_3V3_EN, LOW); |
|||
} |
|||
@ -0,0 +1,98 @@ |
|||
#ifndef _MESHTINY_H_ |
|||
#define _MESHTINY_H_ |
|||
|
|||
/** Master clock frequency */ |
|||
#define VARIANT_MCK (64000000ul) |
|||
|
|||
#define USE_LFXO // Board uses 32khz crystal for LF
|
|||
|
|||
/*----------------------------------------------------------------------------
|
|||
* Headers |
|||
*----------------------------------------------------------------------------*/ |
|||
|
|||
#include "WVariant.h" |
|||
|
|||
#define PINS_COUNT (48) |
|||
#define NUM_DIGITAL_PINS (48) |
|||
#define NUM_ANALOG_INPUTS (6) |
|||
#define NUM_ANALOG_OUTPUTS (0) |
|||
|
|||
// LEDs
|
|||
#define PIN_LED1 (35) // Green LED
|
|||
#define PIN_LED2 (36) // Blue LED
|
|||
|
|||
#define LED_RED (-1) |
|||
#define LED_GREEN PIN_LED1 |
|||
#define LED_BLUE (-1) // Disable annoying flashing caused by Bluefruit
|
|||
|
|||
#define P_LORA_TX_LED PIN_LED2 // Blue LED
|
|||
// #define PIN_STATUS_LED LED_GREEN // disable status led.
|
|||
#define LED_BUILTIN LED_GREEN |
|||
#define PIN_LED LED_BUILTIN |
|||
#define LED_PIN LED_BUILTIN |
|||
#define LED_STATE_ON HIGH |
|||
|
|||
// Buttons
|
|||
#define PIN_BUTTON1 (9) // side button
|
|||
#define PIN_BUTTON2 (4) // encoder left
|
|||
#define PIN_BUTTON3 (26) // encoder right
|
|||
#define PIN_BUTTON4 (28) // encoder press
|
|||
#define PIN_SIDE_BUTTON PIN_BUTTON1 |
|||
#define ENCODER_LEFT PIN_BUTTON2 |
|||
#define ENCODER_RIGHT PIN_BUTTON3 |
|||
#define ENCODER_PRESS PIN_BUTTON4 |
|||
#define PIN_USER_BTN PIN_SIDE_BUTTON |
|||
|
|||
// VBAT sensing
|
|||
#define PIN_VBAT_READ (5) |
|||
#define BATTERY_SENSE_RESOLUTION_BITS 12 |
|||
#define BATTERY_SENSE_RESOLUTION 4096.0 |
|||
#define AREF_VOLTAGE 3.0 |
|||
#define VBAT_AR_INTERNAL AR_INTERNAL_3_0 |
|||
#define ADC_MULTIPLIER 1.73 |
|||
#define ADC_RESOLUTION 14 |
|||
|
|||
// Serial interfaces
|
|||
#define PIN_SERIAL1_RX (15) |
|||
#define PIN_SERIAL1_TX (16) |
|||
#define PIN_SERIAL2_RX (8) // Connected to Jlink CDC
|
|||
#define PIN_SERIAL2_TX (6) |
|||
|
|||
// SPI Interfaces
|
|||
#define SPI_INTERFACES_COUNT 2 |
|||
|
|||
#define PIN_SPI_MISO (45) |
|||
#define PIN_SPI_MOSI (44) |
|||
#define PIN_SPI_SCK (43) |
|||
|
|||
#define PIN_SPI1_MISO (29) |
|||
#define PIN_SPI1_MOSI (30) |
|||
#define PIN_SPI1_SCK (3) |
|||
|
|||
// LoRa SX1262 module pins
|
|||
#define P_LORA_SCLK PIN_SPI_SCK |
|||
#define P_LORA_MISO PIN_SPI_MISO |
|||
#define P_LORA_MOSI PIN_SPI_MOSI |
|||
#define P_LORA_DIO_1 (47) |
|||
#define P_LORA_RESET (38) |
|||
#define P_LORA_BUSY (46) |
|||
#define P_LORA_NSS (42) |
|||
#define SX126X_POWER_EN (37) |
|||
|
|||
#define SX126X_RXEN RADIOLIB_NC |
|||
#define SX126X_TXEN RADIOLIB_NC |
|||
|
|||
#define SX126X_DIO2_AS_RF_SWITCH true |
|||
#define SX126X_DIO3_TCXO_VOLTAGE (1.8f) |
|||
|
|||
// Wire Interfaces
|
|||
#define WIRE_INTERFACES_COUNT 1 |
|||
#define PIN_WIRE_SDA (13) |
|||
#define PIN_WIRE_SCL (14) |
|||
#define PIN_BOARD_SDA (13) |
|||
#define PIN_BOARD_SCL (14) |
|||
|
|||
// Power control
|
|||
#define PIN_3V3_EN (34) // nothing connected on meshtiny board
|
|||
|
|||
#endif // _MESHTINY_H_
|
|||
@ -0,0 +1,96 @@ |
|||
#pragma once |
|||
|
|||
#include <Arduino.h> |
|||
#include <helpers/RefCountedDigitalPin.h> |
|||
#include <helpers/ESP32Board.h> |
|||
|
|||
// built-ins
|
|||
#ifndef PIN_VBAT_READ |
|||
#define PIN_VBAT_READ 1 |
|||
#endif |
|||
#ifndef PIN_ADC_CTRL |
|||
#define PIN_ADC_CTRL 36 |
|||
#endif |
|||
#define PIN_ADC_CTRL_ACTIVE LOW |
|||
#define PIN_ADC_CTRL_INACTIVE HIGH |
|||
#define ADC_MULTIPLIER (3 * 1.73 * 1.187 * 1000) |
|||
#define BATTERY_SAMPLES 8 |
|||
|
|||
#include <driver/rtc_io.h> |
|||
|
|||
class RAK3112Board : public ESP32Board { |
|||
private: |
|||
bool adc_active_state; |
|||
|
|||
public: |
|||
RefCountedDigitalPin periph_power; |
|||
|
|||
RAK3112Board() : periph_power(PIN_VEXT_EN) { } |
|||
|
|||
void begin() { |
|||
ESP32Board::begin(); |
|||
|
|||
// Auto-detect correct ADC_CTRL pin polarity (different for boards >3.2)
|
|||
pinMode(PIN_ADC_CTRL, INPUT); |
|||
adc_active_state = !digitalRead(PIN_ADC_CTRL); |
|||
|
|||
pinMode(PIN_ADC_CTRL, OUTPUT); |
|||
digitalWrite(PIN_ADC_CTRL, !adc_active_state); // Initially inactive
|
|||
|
|||
periph_power.begin(); |
|||
|
|||
esp_reset_reason_t reason = esp_reset_reason(); |
|||
if (reason == ESP_RST_DEEPSLEEP) { |
|||
long wakeup_source = esp_sleep_get_ext1_wakeup_status(); |
|||
if (wakeup_source & (1 << P_LORA_DIO_1)) { // received a LoRa packet (while in deep sleep)
|
|||
startup_reason = BD_STARTUP_RX_PACKET; |
|||
} |
|||
|
|||
rtc_gpio_hold_dis((gpio_num_t)P_LORA_NSS); |
|||
rtc_gpio_deinit((gpio_num_t)P_LORA_DIO_1); |
|||
} |
|||
} |
|||
|
|||
void enterDeepSleep(uint32_t secs, int pin_wake_btn = -1) { |
|||
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON); |
|||
|
|||
// Make sure the DIO1 and NSS GPIOs are hold on required levels during deep sleep
|
|||
rtc_gpio_set_direction((gpio_num_t)P_LORA_DIO_1, RTC_GPIO_MODE_INPUT_ONLY); |
|||
rtc_gpio_pulldown_en((gpio_num_t)P_LORA_DIO_1); |
|||
|
|||
rtc_gpio_hold_en((gpio_num_t)P_LORA_NSS); |
|||
|
|||
if (pin_wake_btn < 0) { |
|||
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet
|
|||
} else { |
|||
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1) | (1L << pin_wake_btn), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet OR wake btn
|
|||
} |
|||
|
|||
if (secs > 0) { |
|||
esp_sleep_enable_timer_wakeup(secs * 1000000); |
|||
} |
|||
|
|||
// Finally set ESP32 into sleep
|
|||
esp_deep_sleep_start(); // CPU halts here and never returns!
|
|||
} |
|||
|
|||
void powerOff() override { |
|||
enterDeepSleep(0); |
|||
} |
|||
|
|||
uint16_t getBattMilliVolts() override { |
|||
analogReadResolution(12); |
|||
|
|||
uint32_t raw = 0; |
|||
for (int i = 0; i < BATTERY_SAMPLES; i++) { |
|||
raw += analogRead(PIN_VBAT_READ); |
|||
} |
|||
raw = raw / BATTERY_SAMPLES; |
|||
|
|||
return (ADC_MULTIPLIER * raw) / 4096; |
|||
} |
|||
|
|||
const char* getManufacturerName() const override { |
|||
return "RAK 3112"; |
|||
} |
|||
}; |
|||
@ -0,0 +1,223 @@ |
|||
[rak3112] |
|||
extends = esp32_base |
|||
board = esp32-s3-devkitc-1 |
|||
build_flags = |
|||
${esp32_base.build_flags} |
|||
${sensor_base.build_flags} |
|||
-I variants/rak3112 |
|||
-D RAK_3112=1 |
|||
-D ESP32_CPU_FREQ=80 |
|||
-D P_LORA_DIO_1=47 |
|||
-D P_LORA_NSS=7 |
|||
-D P_LORA_RESET=8 |
|||
-D P_LORA_BUSY=48 |
|||
-D P_LORA_SCLK=5 |
|||
-D P_LORA_MISO=3 |
|||
-D P_LORA_MOSI=6 |
|||
-D RADIO_CLASS=CustomSX1262 |
|||
-D WRAPPER_CLASS=CustomSX1262Wrapper |
|||
-D LORA_TX_POWER=22 |
|||
-D P_LORA_TX_LED=46 |
|||
-D PIN_BOARD_SDA=9 |
|||
-D PIN_BOARD_SCL=40 |
|||
-D PIN_USER_BTN=-1 |
|||
-D PIN_VEXT_EN=14 |
|||
-D SX126X_DIO2_AS_RF_SWITCH=true |
|||
-D SX126X_DIO3_TCXO_VOLTAGE=1.8 |
|||
-D SX126X_CURRENT_LIMIT=140 |
|||
-D SX126X_RX_BOOSTED_GAIN=1 |
|||
-D PIN_GPS_RX=43 |
|||
-D PIN_GPS_TX=44 |
|||
; -D PIN_GPS_EN=26 |
|||
build_src_filter = ${esp32_base.build_src_filter} |
|||
+<../variants/rak3112> |
|||
+<helpers/sensors> |
|||
lib_deps = |
|||
${esp32_base.lib_deps} |
|||
${sensor_base.lib_deps} |
|||
|
|||
[env:RAK3112_repeater] |
|||
extends = rak3112 |
|||
build_flags = |
|||
${rak3112.build_flags} |
|||
-D DISPLAY_CLASS=SSD1306Display |
|||
-D ADVERT_NAME='"RAK3112 Repeater"' |
|||
-D ADVERT_LAT=0.0 |
|||
-D ADVERT_LON=0.0 |
|||
-D ADMIN_PASSWORD='"password"' |
|||
-D MAX_NEIGHBOURS=50 |
|||
; -D MESH_PACKET_LOGGING=1 |
|||
; -D MESH_DEBUG=1 |
|||
build_src_filter = ${rak3112.build_src_filter} |
|||
+<helpers/ui/SSD1306Display.cpp> |
|||
+<../examples/simple_repeater> |
|||
lib_deps = |
|||
${rak3112.lib_deps} |
|||
${esp32_ota.lib_deps} |
|||
bakercp/CRC32 @ ^2.0.0 |
|||
|
|||
[env:RAK3112_repeater_bridge_rs232] |
|||
extends = rak3112 |
|||
build_flags = |
|||
${rak3112.build_flags} |
|||
-D DISPLAY_CLASS=SSD1306Display |
|||
-D ADVERT_NAME='"RS232 Bridge"' |
|||
-D ADVERT_LAT=0.0 |
|||
-D ADVERT_LON=0.0 |
|||
-D ADMIN_PASSWORD='"password"' |
|||
-D MAX_NEIGHBOURS=50 |
|||
-D WITH_RS232_BRIDGE=Serial2 |
|||
-D WITH_RS232_BRIDGE_RX=5 |
|||
-D WITH_RS232_BRIDGE_TX=6 |
|||
; -D BRIDGE_DEBUG=1 |
|||
; -D MESH_PACKET_LOGGING=1 |
|||
; -D MESH_DEBUG=1 |
|||
build_src_filter = ${rak3112.build_src_filter} |
|||
+<helpers/bridges/RS232Bridge.cpp> |
|||
+<helpers/ui/SSD1306Display.cpp> |
|||
+<../examples/simple_repeater> |
|||
lib_deps = |
|||
${rak3112.lib_deps} |
|||
${esp32_ota.lib_deps} |
|||
|
|||
[env:RAK3112_repeater_bridge_espnow] |
|||
extends = rak3112 |
|||
build_flags = |
|||
${rak3112.build_flags} |
|||
-D DISPLAY_CLASS=SSD1306Display |
|||
-D ADVERT_NAME='"ESPNow Bridge"' |
|||
-D ADVERT_LAT=0.0 |
|||
-D ADVERT_LON=0.0 |
|||
-D ADMIN_PASSWORD='"password"' |
|||
-D MAX_NEIGHBOURS=50 |
|||
-D WITH_ESPNOW_BRIDGE=1 |
|||
; -D BRIDGE_DEBUG=1 |
|||
; -D MESH_PACKET_LOGGING=1 |
|||
; -D MESH_DEBUG=1 |
|||
build_src_filter = ${rak3112.build_src_filter} |
|||
+<helpers/bridges/ESPNowBridge.cpp> |
|||
+<helpers/ui/SSD1306Display.cpp> |
|||
+<../examples/simple_repeater> |
|||
lib_deps = |
|||
${rak3112.lib_deps} |
|||
${esp32_ota.lib_deps} |
|||
|
|||
[env:RAK3112_room_server] |
|||
extends = rak3112 |
|||
build_flags = |
|||
${rak3112.build_flags} |
|||
-D DISPLAY_CLASS=SSD1306Display |
|||
-D ADVERT_NAME='"RAK3112 Room"' |
|||
-D ADVERT_LAT=0.0 |
|||
-D ADVERT_LON=0.0 |
|||
-D ADMIN_PASSWORD='"password"' |
|||
-D ROOM_PASSWORD='"hello"' |
|||
; -D MESH_PACKET_LOGGING=1 |
|||
; -D MESH_DEBUG=1 |
|||
build_src_filter = ${rak3112.build_src_filter} |
|||
+<helpers/ui/SSD1306Display.cpp> |
|||
+<../examples/simple_room_server> |
|||
lib_deps = |
|||
${rak3112.lib_deps} |
|||
${esp32_ota.lib_deps} |
|||
|
|||
[env:RAK3112_terminal_chat] |
|||
extends = rak3112 |
|||
build_flags = |
|||
${rak3112.build_flags} |
|||
-D MAX_CONTACTS=350 |
|||
-D MAX_GROUP_CHANNELS=1 |
|||
; -D MESH_PACKET_LOGGING=1 |
|||
; -D MESH_DEBUG=1 |
|||
build_src_filter = ${rak3112.build_src_filter} |
|||
+<../examples/simple_secure_chat/main.cpp> |
|||
lib_deps = |
|||
${rak3112.lib_deps} |
|||
densaugeo/base64 @ ~1.4.0 |
|||
|
|||
[env:RAK3112_companion_radio_usb] |
|||
extends = rak3112 |
|||
build_flags = |
|||
${rak3112.build_flags} |
|||
-I examples/companion_radio/ui-new |
|||
-D MAX_CONTACTS=350 |
|||
-D MAX_GROUP_CHANNELS=40 |
|||
-D DISPLAY_CLASS=SSD1306Display |
|||
; NOTE: DO NOT ENABLE --> -D MESH_PACKET_LOGGING=1 |
|||
; NOTE: DO NOT ENABLE --> -D MESH_DEBUG=1 |
|||
build_src_filter = ${rak3112.build_src_filter} |
|||
+<helpers/ui/SSD1306Display.cpp> |
|||
+<helpers/ui/MomentaryButton.cpp> |
|||
+<../examples/companion_radio/*.cpp> |
|||
+<../examples/companion_radio/ui-new/*.cpp> |
|||
lib_deps = |
|||
${rak3112.lib_deps} |
|||
densaugeo/base64 @ ~1.4.0 |
|||
|
|||
[env:RAK3112_companion_radio_ble] |
|||
extends = rak3112 |
|||
build_flags = |
|||
${rak3112.build_flags} |
|||
-I examples/companion_radio/ui-new |
|||
-D MAX_CONTACTS=350 |
|||
-D MAX_GROUP_CHANNELS=40 |
|||
-D DISPLAY_CLASS=SSD1306Display |
|||
-D BLE_PIN_CODE=123456 ; dynamic, random PIN |
|||
-D AUTO_SHUTDOWN_MILLIVOLTS=3400 |
|||
-D BLE_DEBUG_LOGGING=1 |
|||
-D OFFLINE_QUEUE_SIZE=256 |
|||
; -D MESH_PACKET_LOGGING=1 |
|||
; -D MESH_DEBUG=1 |
|||
build_src_filter = ${rak3112.build_src_filter} |
|||
+<helpers/ui/SSD1306Display.cpp> |
|||
+<helpers/ui/MomentaryButton.cpp> |
|||
+<helpers/esp32/*.cpp> |
|||
+<../examples/companion_radio/*.cpp> |
|||
+<../examples/companion_radio/ui-new/*.cpp> |
|||
lib_deps = |
|||
${rak3112.lib_deps} |
|||
densaugeo/base64 @ ~1.4.0 |
|||
|
|||
[env:RAK3112_companion_radio_wifi] |
|||
extends = rak3112 |
|||
build_flags = |
|||
${rak3112.build_flags} |
|||
-I examples/companion_radio/ui-new |
|||
-D MAX_CONTACTS=350 |
|||
-D MAX_GROUP_CHANNELS=40 |
|||
-D DISPLAY_CLASS=SSD1306Display |
|||
-D WIFI_DEBUG_LOGGING=1 |
|||
-D WIFI_SSID='"myssid"' |
|||
-D WIFI_PWD='"mypwd"' |
|||
-D OFFLINE_QUEUE_SIZE=256 |
|||
; -D MESH_PACKET_LOGGING=1 |
|||
; -D MESH_DEBUG=1 |
|||
build_src_filter = ${rak3112.build_src_filter} |
|||
+<helpers/ui/SSD1306Display.cpp> |
|||
+<helpers/ui/MomentaryButton.cpp> |
|||
+<helpers/esp32/*.cpp> |
|||
+<../examples/companion_radio/*.cpp> |
|||
+<../examples/companion_radio/ui-new/*.cpp> |
|||
lib_deps = |
|||
${rak3112.lib_deps} |
|||
densaugeo/base64 @ ~1.4.0 |
|||
|
|||
[env:RAK3112_sensor] |
|||
extends = rak3112 |
|||
build_flags = |
|||
${rak3112.build_flags} |
|||
-D ADVERT_NAME='"RAK3112 v3 Sensor"' |
|||
-D ADVERT_LAT=0.0 |
|||
-D ADVERT_LON=0.0 |
|||
-D ADMIN_PASSWORD='"password"' |
|||
-D ENV_PIN_SDA=33 |
|||
-D ENV_PIN_SCL=34 |
|||
-D DISPLAY_CLASS=SSD1306Display |
|||
; -D MESH_PACKET_LOGGING=1 |
|||
; -D MESH_DEBUG=1 |
|||
build_src_filter = ${rak3112.build_src_filter} |
|||
+<helpers/ui/SSD1306Display.cpp> |
|||
+<../examples/simple_sensor> |
|||
lib_deps = |
|||
${rak3112.lib_deps} |
|||
${esp32_ota.lib_deps} |
|||
@ -0,0 +1,60 @@ |
|||
#include <Arduino.h> |
|||
#include "target.h" |
|||
|
|||
RAK3112Board board; |
|||
|
|||
#if defined(P_LORA_SCLK) |
|||
static SPIClass spi; |
|||
RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, spi); |
|||
#else |
|||
RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY); |
|||
#endif |
|||
|
|||
WRAPPER_CLASS radio_driver(radio, board); |
|||
|
|||
ESP32RTCClock fallback_clock; |
|||
AutoDiscoverRTCClock rtc_clock(fallback_clock); |
|||
|
|||
#if ENV_INCLUDE_GPS |
|||
#include <helpers/sensors/MicroNMEALocationProvider.h> |
|||
MicroNMEALocationProvider nmea = MicroNMEALocationProvider(Serial1); |
|||
EnvironmentSensorManager sensors = EnvironmentSensorManager(nmea); |
|||
#else |
|||
EnvironmentSensorManager sensors; |
|||
#endif |
|||
|
|||
#ifdef DISPLAY_CLASS |
|||
DISPLAY_CLASS display; |
|||
MomentaryButton user_btn(PIN_USER_BTN, 1000, true); |
|||
#endif |
|||
|
|||
bool radio_init() { |
|||
fallback_clock.begin(); |
|||
rtc_clock.begin(Wire); |
|||
|
|||
#if defined(P_LORA_SCLK) |
|||
return radio.std_init(&spi); |
|||
#else |
|||
return radio.std_init(); |
|||
#endif |
|||
} |
|||
|
|||
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); |
|||
} |
|||
|
|||
mesh::LocalIdentity radio_new_identity() { |
|||
RadioNoiseListener rng(radio); |
|||
return mesh::LocalIdentity(&rng); // create new random identity
|
|||
} |
|||
@ -0,0 +1,30 @@ |
|||
#pragma once |
|||
|
|||
#define RADIOLIB_STATIC_ONLY 1 |
|||
#include <RadioLib.h> |
|||
#include <helpers/radiolib/RadioLibWrappers.h> |
|||
#include <RAK3112Board.h> |
|||
#include <helpers/radiolib/CustomSX1262Wrapper.h> |
|||
#include <helpers/AutoDiscoverRTCClock.h> |
|||
#include <helpers/SensorManager.h> |
|||
#include <helpers/sensors/EnvironmentSensorManager.h> |
|||
#ifdef DISPLAY_CLASS |
|||
#include <helpers/ui/SSD1306Display.h> |
|||
#include <helpers/ui/MomentaryButton.h> |
|||
#endif |
|||
|
|||
extern RAK3112Board board; |
|||
extern WRAPPER_CLASS radio_driver; |
|||
extern AutoDiscoverRTCClock rtc_clock; |
|||
extern EnvironmentSensorManager sensors; |
|||
|
|||
#ifdef DISPLAY_CLASS |
|||
extern DISPLAY_CLASS display; |
|||
extern MomentaryButton user_btn; |
|||
#endif |
|||
|
|||
bool radio_init(); |
|||
uint32_t radio_get_rng_seed(); |
|||
void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); |
|||
void radio_set_tx_power(uint8_t dbm); |
|||
mesh::LocalIdentity radio_new_identity(); |
|||
@ -0,0 +1,32 @@ |
|||
#include <Arduino.h> |
|||
#include <Wire.h> |
|||
|
|||
#include "RAK3401Board.h" |
|||
|
|||
void RAK3401Board::begin() { |
|||
NRF52BoardDCDC::begin(); |
|||
pinMode(PIN_VBAT_READ, INPUT); |
|||
#ifdef PIN_USER_BTN |
|||
pinMode(PIN_USER_BTN, INPUT_PULLUP); |
|||
#endif |
|||
|
|||
#ifdef PIN_USER_BTN_ANA |
|||
pinMode(PIN_USER_BTN_ANA, INPUT_PULLUP); |
|||
#endif |
|||
|
|||
#if defined(PIN_BOARD_SDA) && defined(PIN_BOARD_SCL) |
|||
Wire.setPins(PIN_BOARD_SDA, PIN_BOARD_SCL); |
|||
#endif |
|||
|
|||
Wire.begin(); |
|||
|
|||
pinMode(PIN_3V3_EN, OUTPUT); |
|||
digitalWrite(PIN_3V3_EN, HIGH); |
|||
|
|||
#ifdef P_LORA_PA_EN |
|||
// Initialize RAK13302 1W LoRa transceiver module PA control pin
|
|||
pinMode(P_LORA_PA_EN, OUTPUT); |
|||
digitalWrite(P_LORA_PA_EN, LOW); // Start with PA disabled
|
|||
delay(10); // Allow PA module to initialize
|
|||
#endif |
|||
} |
|||
@ -0,0 +1,50 @@ |
|||
#pragma once |
|||
|
|||
#include <MeshCore.h> |
|||
#include <Arduino.h> |
|||
#include <helpers/NRF52Board.h> |
|||
|
|||
// built-ins
|
|||
#define PIN_VBAT_READ 5 |
|||
#define ADC_MULTIPLIER (3 * 1.73 * 1.187 * 1000) |
|||
|
|||
#define PIN_3V3_EN (34) |
|||
#define WB_IO2 PIN_3V3_EN |
|||
|
|||
class RAK3401Board : public NRF52BoardDCDC { |
|||
protected: |
|||
#ifdef NRF52_POWER_MANAGEMENT |
|||
void initiateShutdown(uint8_t reason) override; |
|||
#endif |
|||
public: |
|||
RAK3401Board() : NRF52Board("RAK3401_OTA") {} |
|||
void begin(); |
|||
|
|||
#define BATTERY_SAMPLES 8 |
|||
|
|||
uint16_t getBattMilliVolts() override { |
|||
analogReadResolution(12); |
|||
|
|||
uint32_t raw = 0; |
|||
for (int i = 0; i < BATTERY_SAMPLES; i++) { |
|||
raw += analogRead(PIN_VBAT_READ); |
|||
} |
|||
raw = raw / BATTERY_SAMPLES; |
|||
|
|||
return (ADC_MULTIPLIER * raw) / 4096; |
|||
} |
|||
|
|||
const char* getManufacturerName() const override { |
|||
return "RAK 3401"; |
|||
} |
|||
|
|||
#ifdef P_LORA_PA_EN |
|||
void onBeforeTransmit() override { |
|||
digitalWrite(P_LORA_PA_EN, HIGH); // Enable PA before transmission
|
|||
} |
|||
|
|||
void onAfterTransmit() override { |
|||
digitalWrite(P_LORA_PA_EN, LOW); // Disable PA after transmission to save power
|
|||
} |
|||
#endif |
|||
}; |
|||
@ -0,0 +1,127 @@ |
|||
[rak3401] |
|||
extends = nrf52_base |
|||
board = rak3401 |
|||
board_check = true |
|||
build_flags = ${nrf52_base.build_flags} |
|||
${sensor_base.build_flags} |
|||
-I variants/rak3401 |
|||
-D RAK_3401 |
|||
-D RAK13302 |
|||
-D RADIO_CLASS=CustomSX1262 |
|||
-D WRAPPER_CLASS=CustomSX1262Wrapper |
|||
-D LORA_TX_POWER=22 |
|||
-D SX126X_CURRENT_LIMIT=140 |
|||
-D SX126X_RX_BOOSTED_GAIN=1 |
|||
build_src_filter = ${nrf52_base.build_src_filter} |
|||
+<../variants/rak3401> |
|||
+<helpers/sensors> |
|||
+<helpers/ui/SSD1306Display.cpp> |
|||
+<helpers/ui/MomentaryButton.cpp> |
|||
lib_deps = |
|||
${nrf52_base.lib_deps} |
|||
${sensor_base.lib_deps} |
|||
adafruit/Adafruit SSD1306 @ ^2.5.13 |
|||
sparkfun/SparkFun u-blox GNSS Arduino Library@^2.2.27 |
|||
|
|||
[env:RAK_3401_repeater] |
|||
extends = rak3401 |
|||
build_flags = |
|||
${rak3401.build_flags} |
|||
-D DISPLAY_CLASS=SSD1306Display |
|||
-D ADVERT_NAME='"RAK3401 1W Repeater"' |
|||
-D ADVERT_LAT=0.0 |
|||
-D ADVERT_LON=0.0 |
|||
-D ADMIN_PASSWORD='"password"' |
|||
-D MAX_NEIGHBOURS=50 |
|||
;-D MESH_PACKET_LOGGING=1 |
|||
;-D MESH_DEBUG=1 |
|||
build_src_filter = ${rak3401.build_src_filter} |
|||
+<helpers/ui/SSD1306Display.cpp> |
|||
+<../examples/simple_repeater> |
|||
|
|||
[env:RAK_3401_room_server] |
|||
extends = rak3401 |
|||
build_flags = |
|||
${rak3401.build_flags} |
|||
-D DISPLAY_CLASS=SSD1306Display |
|||
-D ADVERT_NAME='"Test Room"' |
|||
-D ADVERT_LAT=0.0 |
|||
-D ADVERT_LON=0.0 |
|||
-D ADMIN_PASSWORD='"password"' |
|||
-D ROOM_PASSWORD='"hello"' |
|||
;-D MESH_PACKET_LOGGING=1 |
|||
;-D MESH_DEBUG=1 |
|||
build_src_filter = ${rak3401.build_src_filter} |
|||
+<helpers/ui/SSD1306Display.cpp> |
|||
+<../examples/simple_room_server> |
|||
|
|||
[env:RAK_3401_companion_radio_usb] |
|||
extends = rak3401 |
|||
board_build.ldscript = boards/nrf52840_s140_v6_extrafs.ld |
|||
board_upload.maximum_size = 712704 |
|||
build_flags = |
|||
${rak3401.build_flags} |
|||
-I examples/companion_radio/ui-new |
|||
-D DISPLAY_CLASS=SSD1306Display |
|||
-D MAX_CONTACTS=350 |
|||
-D MAX_GROUP_CHANNELS=40 |
|||
; NOTE: DO NOT ENABLE --> -D MESH_PACKET_LOGGING=1 |
|||
; NOTE: DO NOT ENABLE --> -D MESH_DEBUG=1 |
|||
build_src_filter = ${rak3401.build_src_filter} |
|||
+<../examples/companion_radio/*.cpp> |
|||
+<../examples/companion_radio/ui-new/*.cpp> |
|||
lib_deps = |
|||
${rak3401.lib_deps} |
|||
densaugeo/base64 @ ~1.4.0 |
|||
|
|||
[env:RAK_3401_companion_radio_ble] |
|||
extends = rak3401 |
|||
board_build.ldscript = boards/nrf52840_s140_v6_extrafs.ld |
|||
board_upload.maximum_size = 712704 |
|||
build_flags = |
|||
${rak3401.build_flags} |
|||
-I examples/companion_radio/ui-new |
|||
-D DISPLAY_CLASS=SSD1306Display |
|||
-D MAX_CONTACTS=350 |
|||
-D MAX_GROUP_CHANNELS=40 |
|||
-D BLE_PIN_CODE=123456 |
|||
-D BLE_DEBUG_LOGGING=1 |
|||
-D OFFLINE_QUEUE_SIZE=256 |
|||
;-D MESH_PACKET_LOGGING=1 |
|||
;-D MESH_DEBUG=1 |
|||
build_src_filter = ${rak3401.build_src_filter} |
|||
+<helpers/nrf52/SerialBLEInterface.cpp> |
|||
+<../examples/companion_radio/*.cpp> |
|||
+<../examples/companion_radio/ui-new/*.cpp> |
|||
lib_deps = |
|||
${rak3401.lib_deps} |
|||
densaugeo/base64 @ ~1.4.0 |
|||
|
|||
[env:RAK_3401_terminal_chat] |
|||
extends = rak3401 |
|||
build_flags = |
|||
${rak3401.build_flags} |
|||
-D MAX_CONTACTS=100 |
|||
-D MAX_GROUP_CHANNELS=1 |
|||
;-D MESH_PACKET_LOGGING=1 |
|||
;-D MESH_DEBUG=1 |
|||
build_src_filter = ${rak3401.build_src_filter} |
|||
+<../examples/simple_secure_chat/main.cpp> |
|||
lib_deps = |
|||
${rak3401.lib_deps} |
|||
densaugeo/base64 @ ~1.4.0 |
|||
|
|||
[env:RAK_3401_sensor] |
|||
extends = rak3401 |
|||
build_flags = |
|||
${rak3401.build_flags} |
|||
-D DISPLAY_CLASS=SSD1306Display |
|||
-D ADVERT_NAME='"RAK3401 Sensor"' |
|||
-D ADVERT_LAT=0.0 |
|||
-D ADVERT_LON=0.0 |
|||
-D ADMIN_PASSWORD='"password"' |
|||
;-D MESH_PACKET_LOGGING=1 |
|||
;-D MESH_DEBUG=1 |
|||
build_src_filter = ${rak3401.build_src_filter} |
|||
+<helpers/ui/SSD1306Display.cpp> |
|||
+<../examples/simple_sensor> |
|||
@ -0,0 +1,58 @@ |
|||
#include <Arduino.h> |
|||
#include "target.h" |
|||
#include <helpers/ArduinoHelpers.h> |
|||
|
|||
RAK3401Board board; |
|||
|
|||
#ifndef PIN_USER_BTN |
|||
#define PIN_USER_BTN (-1) |
|||
#endif |
|||
|
|||
#ifdef DISPLAY_CLASS |
|||
DISPLAY_CLASS display; |
|||
MomentaryButton user_btn(PIN_USER_BTN, 1000, true, true); |
|||
|
|||
#if defined(PIN_USER_BTN_ANA) |
|||
MomentaryButton analog_btn(PIN_USER_BTN_ANA, 1000, 20); |
|||
#endif |
|||
#endif |
|||
|
|||
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 |
|||
#include <helpers/sensors/MicroNMEALocationProvider.h> |
|||
MicroNMEALocationProvider nmea = MicroNMEALocationProvider(Serial1); |
|||
EnvironmentSensorManager sensors = EnvironmentSensorManager(nmea); |
|||
#else |
|||
EnvironmentSensorManager sensors; |
|||
#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); |
|||
} |
|||
|
|||
mesh::LocalIdentity radio_new_identity() { |
|||
RadioNoiseListener rng(radio); |
|||
return mesh::LocalIdentity(&rng); // create new random identity
|
|||
} |
|||
@ -0,0 +1,30 @@ |
|||
#pragma once |
|||
|
|||
#define RADIOLIB_STATIC_ONLY 1 |
|||
#include <RadioLib.h> |
|||
#include <helpers/radiolib/RadioLibWrappers.h> |
|||
#include <RAK3401Board.h> |
|||
#include <helpers/radiolib/CustomSX1262Wrapper.h> |
|||
#include <helpers/AutoDiscoverRTCClock.h> |
|||
#include <helpers/sensors/EnvironmentSensorManager.h> |
|||
|
|||
#ifdef DISPLAY_CLASS |
|||
#include <helpers/ui/SSD1306Display.h> |
|||
extern DISPLAY_CLASS display; |
|||
#include <helpers/ui/MomentaryButton.h> |
|||
extern MomentaryButton user_btn; |
|||
#if defined(PIN_USER_BTN_ANA) |
|||
extern MomentaryButton analog_btn; |
|||
#endif |
|||
#endif |
|||
|
|||
extern RAK3401Board board; |
|||
extern WRAPPER_CLASS radio_driver; |
|||
extern AutoDiscoverRTCClock rtc_clock; |
|||
extern EnvironmentSensorManager sensors; |
|||
|
|||
bool radio_init(); |
|||
uint32_t radio_get_rng_seed(); |
|||
void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); |
|||
void radio_set_tx_power(uint8_t dbm); |
|||
mesh::LocalIdentity radio_new_identity(); |
|||
@ -0,0 +1,52 @@ |
|||
/*
|
|||
Copyright (c) 2014-2015 Arduino LLC. All right reserved. |
|||
Copyright (c) 2016 Sandeep Mistry All right reserved. |
|||
Copyright (c) 2018, Adafruit Industries (adafruit.com) |
|||
|
|||
This library is free software; you can redistribute it and/or |
|||
modify it under the terms of the GNU Lesser General Public |
|||
License as published by the Free Software Foundation; either |
|||
version 2.1 of the License, or (at your option) any later version. |
|||
|
|||
This library is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
|||
See the GNU Lesser General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU Lesser General Public |
|||
License along with this library; if not, write to the Free Software |
|||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
|||
*/ |
|||
|
|||
#include "variant.h" |
|||
#include "wiring_constants.h" |
|||
#include "wiring_digital.h" |
|||
#include "nrf.h" |
|||
|
|||
const uint32_t g_ADigitalPinMap[] = |
|||
{ |
|||
// P0
|
|||
0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , |
|||
8 , 9 , 10, 11, 12, 13, 14, 15, |
|||
16, 17, 18, 19, 20, 21, 22, 23, |
|||
24, 25, 26, 27, 28, 29, 30, 31, |
|||
|
|||
// P1
|
|||
32, 33, 34, 35, 36, 37, 38, 39, |
|||
40, 41, 42, 43, 44, 45, 46, 47 |
|||
}; |
|||
|
|||
|
|||
void initVariant() |
|||
{ |
|||
// LED1 & LED2
|
|||
pinMode(PIN_LED1, OUTPUT); |
|||
ledOff(PIN_LED1); |
|||
|
|||
pinMode(PIN_LED2, OUTPUT); |
|||
ledOff(PIN_LED2); |
|||
|
|||
// 3V3 Power Rail
|
|||
pinMode(PIN_3V3_EN, OUTPUT); |
|||
digitalWrite(PIN_3V3_EN, HIGH); |
|||
} |
|||
@ -0,0 +1,207 @@ |
|||
/*
|
|||
Copyright (c) 2014-2015 Arduino LLC. All right reserved. |
|||
Copyright (c) 2016 Sandeep Mistry All right reserved. |
|||
Copyright (c) 2018, Adafruit Industries (adafruit.com) |
|||
|
|||
This library is free software; you can redistribute it and/or |
|||
modify it under the terms of the GNU Lesser General Public |
|||
License as published by the Free Software Foundation; either |
|||
version 2.1 of the License, or (at your option) any later version. |
|||
This library is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
|||
See the GNU Lesser General Public License for more details. |
|||
You should have received a copy of the GNU Lesser General Public |
|||
License along with this library; if not, write to the Free Software |
|||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
|||
*/ |
|||
|
|||
#ifndef _VARIANT_RAK3401_ |
|||
#define _VARIANT_RAK3401_ |
|||
|
|||
#define RAK4630 |
|||
|
|||
/** Master clock frequency */ |
|||
#define VARIANT_MCK (64000000ul) |
|||
|
|||
#define USE_LFXO // Board uses 32khz crystal for LF
|
|||
// define USE_LFRC // Board uses RC for LF
|
|||
|
|||
/*----------------------------------------------------------------------------
|
|||
* Headers |
|||
*----------------------------------------------------------------------------*/ |
|||
|
|||
#include "WVariant.h" |
|||
|
|||
#ifdef __cplusplus |
|||
extern "C" |
|||
{ |
|||
#endif // __cplusplus
|
|||
|
|||
// Number of pins defined in PinDescription array
|
|||
#define PINS_COUNT (48) |
|||
#define NUM_DIGITAL_PINS (48) |
|||
#define NUM_ANALOG_INPUTS (6) |
|||
#define NUM_ANALOG_OUTPUTS (0) |
|||
|
|||
// LEDs
|
|||
#define PIN_LED1 (35) |
|||
#define PIN_LED2 (36) |
|||
|
|||
#define LED_BUILTIN PIN_LED1 |
|||
#define LED_CONN PIN_LED2 |
|||
|
|||
#define LED_GREEN PIN_LED1 |
|||
#define LED_BLUE PIN_LED2 |
|||
|
|||
#define LED_STATE_ON 1 // State when LED is litted
|
|||
|
|||
/*
|
|||
* Analog pins |
|||
*/ |
|||
#define PIN_A0 (5) //(3)
|
|||
#define PIN_A1 (31) //(4)
|
|||
#define PIN_A2 (28) |
|||
#define PIN_A3 (29) |
|||
#define PIN_A4 (30) |
|||
#define PIN_A5 (31) |
|||
#define PIN_A6 (0xff) |
|||
#define PIN_A7 (0xff) |
|||
|
|||
static const uint8_t A0 = PIN_A0; |
|||
static const uint8_t A1 = PIN_A1; |
|||
static const uint8_t A2 = PIN_A2; |
|||
static const uint8_t A3 = PIN_A3; |
|||
static const uint8_t A4 = PIN_A4; |
|||
static const uint8_t A5 = PIN_A5; |
|||
static const uint8_t A6 = PIN_A6; |
|||
static const uint8_t A7 = PIN_A7; |
|||
#define ADC_RESOLUTION 14 |
|||
|
|||
// Other pins
|
|||
#define WB_I2C1_SDA (13) // SENSOR_SLOT IO_SLOT
|
|||
#define WB_I2C1_SCL (14) // SENSOR_SLOT IO_SLOT
|
|||
|
|||
#define PIN_AREF (2) |
|||
#define PIN_NFC1 (9) |
|||
#define WB_IO5 PIN_NFC1 |
|||
#define WB_IO4 (4) |
|||
#define PIN_NFC2 (10) |
|||
|
|||
static const uint8_t AREF = PIN_AREF; |
|||
|
|||
/*
|
|||
* Serial interfaces |
|||
*/ |
|||
// TXD1 RXD1 on Base Board
|
|||
#define PIN_SERIAL1_RX (15) |
|||
#define PIN_SERIAL1_TX (16) |
|||
|
|||
// Connected to Jlink CDC
|
|||
#define PIN_SERIAL2_RX (8) |
|||
#define PIN_SERIAL2_TX (6) |
|||
|
|||
/*
|
|||
* SPI Interfaces |
|||
*/ |
|||
#define SPI_INTERFACES_COUNT 2 |
|||
|
|||
#define PIN_SPI_MISO (45) |
|||
#define PIN_SPI_MOSI (44) |
|||
#define PIN_SPI_SCK (43) |
|||
|
|||
#define PIN_SPI1_MISO (29) |
|||
#define PIN_SPI1_MOSI (30) |
|||
#define PIN_SPI1_SCK (3) |
|||
|
|||
static const uint8_t SS = 42; |
|||
static const uint8_t MOSI = PIN_SPI_MOSI; |
|||
static const uint8_t MISO = PIN_SPI_MISO; |
|||
static const uint8_t SCK = PIN_SPI_SCK; |
|||
|
|||
/*
|
|||
* Wire Interfaces |
|||
*/ |
|||
#define WIRE_INTERFACES_COUNT 1 |
|||
|
|||
#define PIN_WIRE_SDA (WB_I2C1_SDA) |
|||
#define PIN_WIRE_SCL (WB_I2C1_SCL) |
|||
|
|||
// QSPI Pins
|
|||
// QSPI occupied by GPIO's
|
|||
#define PIN_QSPI_SCK 3 |
|||
#define PIN_QSPI_CS 26 |
|||
#define PIN_QSPI_IO0 30 |
|||
#define PIN_QSPI_IO1 29 |
|||
#define PIN_QSPI_IO2 28 |
|||
#define PIN_QSPI_IO3 2 |
|||
|
|||
// On-board QSPI Flash
|
|||
// No onboard flash
|
|||
#define EXTERNAL_FLASH_DEVICES IS25LP080D |
|||
#define EXTERNAL_FLASH_USE_QSPI |
|||
|
|||
#define USE_SX1262 |
|||
#define SX126X_CS (26) |
|||
#define SX126X_DIO1 (10) |
|||
#define SX126X_BUSY (9) |
|||
#define SX126X_RESET (4) |
|||
|
|||
#define SX126X_POWER_EN (21) |
|||
// DIO2 controlls an antenna switch and the TCXO voltage is controlled by DIO3
|
|||
#define SX126X_DIO2_AS_RF_SWITCH |
|||
#define SX126X_DIO3_TCXO_VOLTAGE 1.8 |
|||
|
|||
#define P_LORA_SCLK PIN_SPI1_SCK |
|||
#define P_LORA_MISO PIN_SPI1_MISO |
|||
#define P_LORA_MOSI PIN_SPI1_MOSI |
|||
#define P_LORA_NSS SX126X_CS |
|||
#define P_LORA_DIO_1 SX126X_DIO1 |
|||
#define P_LORA_BUSY SX126X_BUSY |
|||
#define P_LORA_RESET SX126X_RESET |
|||
#define P_LORA_PA_EN 31 |
|||
|
|||
// enables 3.3V periphery like GPS or IO Module
|
|||
// Do not toggle this for GPS power savings
|
|||
#define PIN_3V3_EN (34) |
|||
#define WB_IO2 PIN_3V3_EN |
|||
|
|||
// RAK1910 GPS module
|
|||
// If using the wisblock GPS module and pluged into Port A on WisBlock base
|
|||
// IO1 is hooked to PPS (pin 12 on header) = gpio 17
|
|||
// IO2 is hooked to GPS RESET = gpio 34, but it can not be used to this because IO2 is ALSO used to control 3V3_S power (1 is on).
|
|||
// Therefore must be 1 to keep peripherals powered
|
|||
// Power is on the controllable 3V3_S rail
|
|||
#define PIN_GPS_PPS (17) // Pulse per second input from the GPS
|
|||
|
|||
#define PIN_GPS_RX PIN_SERIAL1_RX |
|||
#define PIN_GPS_TX PIN_SERIAL1_TX |
|||
|
|||
#define PIN_GPS_1PPS PIN_GPS_PPS |
|||
#define GPS_BAUD_RATE 9600 |
|||
#define GPS_ADDRESS 0x42 //i2c address for GPS
|
|||
|
|||
// Battery
|
|||
// The battery sense is hooked to pin A0 (5)
|
|||
#define BATTERY_PIN PIN_A0 |
|||
// and has 12 bit resolution
|
|||
#define BATTERY_SENSE_RESOLUTION_BITS 12 |
|||
#define BATTERY_SENSE_RESOLUTION 4096.0 |
|||
#undef AREF_VOLTAGE |
|||
#define AREF_VOLTAGE 3.0 |
|||
#define VBAT_AR_INTERNAL AR_INTERNAL_3_0 |
|||
#define ADC_MULTIPLIER 1.73 |
|||
|
|||
#define HAS_RTC 1 |
|||
|
|||
#define RAK_4631 1 |
|||
|
|||
#ifdef __cplusplus |
|||
} |
|||
#endif |
|||
|
|||
/*----------------------------------------------------------------------------
|
|||
* Arduino objects - C++ only |
|||
*----------------------------------------------------------------------------*/ |
|||
|
|||
#endif |
|||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue