Polishing code (#803)

This commit is contained in:
Olivier
2017-04-02 20:03:59 +02:00
committed by Embedded Innovation
parent f84960dc28
commit 818f887926
21 changed files with 393 additions and 443 deletions
+203 -162
View File
@@ -6,7 +6,7 @@
* network topology allowing messages to be routed to nodes.
*
* Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
* Copyright (C) 2013-2015 Sensnology AB
* Copyright (C) 2013-2017 Sensnology AB
* Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
*
* Documentation: http://www.mysensors.org
@@ -32,34 +32,34 @@
***********************************/
/**
* @def MY_DEBUG
* @brief Enable MY_DEBUG in sketch to show debug prints. This option will add a lot to the size of the
* final sketch but is helpful to see what is actually is happening during development
*/
* @def MY_DEBUG
* @brief Enable MY_DEBUG in sketch to show debug prints. This option will add a lot to the size of the
* final sketch but is helpful to see what is actually is happening during development
*/
//#define MY_DEBUG
/**
* @def MY_SPECIAL_DEBUG
* @brief Enable MY_SPECIAL_DEBUG in sketch to activate I_DEBUG messages if MY_DEBUG is disabled.
* I_DEBUG requests are:
* R: routing info (only repeaters): received msg XXYY (as stream), where XX is the node and YY the routing node
* V: CPU voltage
* F: CPU frequency
* M: free memory
* E: clear MySensors EEPROM area and reboot (i.e. "factory" reset)
*/
* @def MY_SPECIAL_DEBUG
* @brief Enable MY_SPECIAL_DEBUG to enable I_DEBUG messages.
* I_DEBUG requests are:
* R: routing info (only repeaters): received msg XXYY (as stream), where XX is the node and YY the routing node
* V: CPU voltage
* F: CPU frequency
* M: free memory
* E: clear MySensors EEPROM area and reboot (i.e. "factory" reset)
*/
//#define MY_SPECIAL_DEBUG
/**
* @def MY_DISABLED_SERIAL
* @brief Enable MY_DISABLED_SERIAL in sketch if you want to use TX(1), RX(0) as normal I/O pins
*/
* @def MY_DISABLED_SERIAL
* @brief Enable MY_DISABLED_SERIAL in sketch if you want to use TX(1), RX(0) as normal I/O pins
*/
//#define MY_DISABLED_SERIAL
/**
* @def MY_CORE_ONLY
* @brief Enable MY_CORE_ONLY flag if you want to use core functions without loading the framework
*/
* @def MY_CORE_ONLY
* @brief Enable MY_CORE_ONLY flag if you want to use core functions without loading the framework
*/
//#define MY_CORE_ONLY
// Turn off debug if serial pins is used for other stuff
@@ -75,17 +75,17 @@
#define MY_BAUD_RATE (115200ul)
#endif
/**
* @def MY_SERIAL_OUTPUT_SIZE
* @brief Max. characters for serial output.
*/
* @def MY_SERIAL_OUTPUT_SIZE
* @brief Max. characters for serial output.
*/
#ifndef MY_SERIAL_OUTPUT_SIZE
#define MY_SERIAL_OUTPUT_SIZE (120u)
#endif
/**
* @def MY_DISABLE_REMOTE_RESET
* @brief Disables over-the-air reset of node
*/
* @def MY_DISABLE_REMOTE_RESET
* @brief Disables over-the-air reset of node
*/
//#define MY_DISABLE_REMOTE_RESET
/**********************************
@@ -105,37 +105,37 @@
#endif
/**
* @def MY_RAM_ROUTING_TABLE_FEATURE
* @brief If enabled, the routing table is kept in RAM (if memory allows) and saved in regular intervals.
* note: AVR has limited memory, use with care
*/
* @def MY_RAM_ROUTING_TABLE_FEATURE
* @brief If enabled, the routing table is kept in RAM (if memory allows) and saved in regular intervals.
* note: AVR has limited memory, use with care
*/
#define MY_RAM_ROUTING_TABLE_FEATURE
/**
* @def MY_ROUTING_TABLE_SAVE_INTERVAL_MS
* @brief Interval to dump content of routing table to eeprom
*/
* @def MY_ROUTING_TABLE_SAVE_INTERVAL_MS
* @brief Interval to dump content of routing table to eeprom
*/
#ifndef MY_ROUTING_TABLE_SAVE_INTERVAL_MS
#define MY_ROUTING_TABLE_SAVE_INTERVAL_MS (30*60*1000ul)
#endif
/**
* @def MY_TRANSPORT_SANITY_CHECK
* @brief If enabled, node will check transport in regular intervals to detect HW issues and re-initialize in case of failure.
* This feature is enabled for all repeater nodes (incl. GW)
*/
* @def MY_TRANSPORT_SANITY_CHECK
* @brief If enabled, node will check transport in regular intervals to detect HW issues and re-initialize in case of failure.
* This feature is enabled for all repeater nodes (incl. GW)
*/
//#define MY_TRANSPORT_SANITY_CHECK
/**
* @def MY_TRANSPORT_SANITY_CHECK_INTERVAL_MS
* @brief Interval (in ms) for transport sanity checks
*/
* @def MY_TRANSPORT_SANITY_CHECK_INTERVAL_MS
* @brief Interval (in ms) for transport sanity checks
*/
#ifndef MY_TRANSPORT_SANITY_CHECK_INTERVAL_MS
#define MY_TRANSPORT_SANITY_CHECK_INTERVAL_MS (15*60*1000ul)
#endif
/**
* @def MY_TRANSPORT_DISCOVERY_INTERVAL_MS
* @brief This is a gateway-only feature: Interval (in ms) to issue network discovery checks
*/
* @def MY_TRANSPORT_DISCOVERY_INTERVAL_MS
* @brief This is a gateway-only feature: Interval (in ms) to issue network discovery checks
*/
#ifndef MY_TRANSPORT_DISCOVERY_INTERVAL_MS
#define MY_TRANSPORT_DISCOVERY_INTERVAL_MS (20*60*1000ul)
#endif
@@ -159,9 +159,9 @@
#define MY_REGISTRATION_FEATURE
/**
* @def MY_REGISTRATION_RETRIES
* @brief Number of registration retries if no reply received from GW/controller
*/
* @def MY_REGISTRATION_RETRIES
* @brief Number of registration retries if no reply received from GW/controller
*/
#ifndef MY_REGISTRATION_RETRIES
#define MY_REGISTRATION_RETRIES (3u)
@@ -174,32 +174,32 @@
#define MY_REGISTRATION_DEFAULT true
/**
* @def MY_REGISTRATION_CONTROLLER
* @brief If enabled, node registration request has to be handled by controller
*/
* @def MY_REGISTRATION_CONTROLLER
* @brief If enabled, node registration request has to be handled by controller
*/
// #define MY_REGISTRATION_CONTROLLER
/**
* @def MY_CORE_COMPATIBILITY_CHECK
* @brief If enabled, library compatibility is checked during node registration. Incompatible libraries are unable to send sensor data.
*/
* @def MY_CORE_COMPATIBILITY_CHECK
* @brief If enabled, library compatibility is checked during node registration. Incompatible libraries are unable to send sensor data.
*/
#define MY_CORE_COMPATIBILITY_CHECK
/**
* @def MY_TRANSPORT_WAIT_READY_MS
* @brief Timeout in MS until transport is ready during startup, set to 0 for no timeout
*/
* @def MY_TRANSPORT_WAIT_READY_MS
* @brief Timeout in MS until transport is ready during startup, set to 0 for no timeout
*/
#ifndef MY_TRANSPORT_WAIT_READY_MS
#define MY_TRANSPORT_WAIT_READY_MS (0ul)
#endif
/**
* @def MY_PASSIVE_NODE
* @brief If enabled, the node operates fully autonomously, i.e. messages are sent without ACKing
* note: All transport-related checks and safety-mechanisms are disabled, also @ref MY_NODE_ID,
* @ref MY_PARENT_NODE_ID and @ref MY_PARENT_NODE_IS_STATIC need to be set.
* Singing, registration, and OTA FW update are disabled.
*/
* @def MY_PASSIVE_NODE
* @brief If enabled, the node operates fully autonomously, i.e. messages are sent without ACKing.
* note: All transport-related checks and safety-mechanisms are disabled.
* Requirement: @ref MY_NODE_ID needs to be set, @ref MY_PARENT_NODE_ID and @ref MY_PARENT_NODE_IS_STATIC are optional.
* Singing, registration, and OTA FW update are disabled.
*/
//#define MY_PASSIVE_NODE
@@ -226,15 +226,15 @@
//#define MY_PARENT_NODE_IS_STATIC
/**
* @def MY_REPEATER_FEATURE
* @brief Enables repeater functionality (relays messages from other nodes)
*/
* @def MY_REPEATER_FEATURE
* @brief Enables repeater functionality (relays messages from other nodes)
*/
//#define MY_REPEATER_FEATURE
/**
* @def MY_SLEEP_TRANSPORT_RECONNECT_TIMEOUT_MS
* @brief Timeout (in ms) to re-establish link if node is send to sleep and transport is not ready.
*/
* @def MY_SLEEP_TRANSPORT_RECONNECT_TIMEOUT_MS
* @brief Timeout (in ms) to re-establish link if node is send to sleep and transport is not ready.
*/
#ifndef MY_SLEEP_TRANSPORT_RECONNECT_TIMEOUT_MS
#define MY_SLEEP_TRANSPORT_RECONNECT_TIMEOUT_MS (10*1000ul)
#endif
@@ -270,7 +270,7 @@
/**
* @def MY_OTA_FLASH_JDECID
* @brief Flash jdecid.
* @brief Flash JDECID. Use (0x00) if unknown.
*/
#ifndef MY_OTA_FLASH_JDECID
#define MY_OTA_FLASH_JDECID (0x1F65)
@@ -320,26 +320,43 @@
//#define MY_DEFAULT_TX_LED_PIN x
//#define MY_DEFAULT_RX_LED_PIN x
// The following setting allows you to inverse the LED blinking
// When MY_WITH_LEDS_BLINKING_INVERSE is enabled LEDSs are normally turned on and switches
// off when blinking
/**
* @def MY_WITH_LEDS_BLINKING_INVERSE
* @brief The following setting allows you to inverse the LED blinking.
* When MY_WITH_LEDS_BLINKING_INVERSE is enabled LEDSs are normally turned on and switches off when blinking.
*/
//#define MY_WITH_LEDS_BLINKING_INVERSE
/**
* @def MY_INDICATION_HANDLER
* @brief Enable to use own indication handler
*/
* @def MY_INDICATION_HANDLER
* @brief Enable to use own indication handler.
*/
//#define MY_INDICATION_HANDLER
/**
* @def MY_DEFAULT_LED_BLINK_PERIOD
* @brief Default LEDs blinking period in milliseconds.
*/
#ifndef MY_DEFAULT_LED_BLINK_PERIOD
#define MY_DEFAULT_LED_BLINK_PERIOD 300
#endif
/**********************************************
* Gateway inclusion button/mode configuration
**********************************************/
// Enabled inclusion mode feature
/**
* @def MY_INCLUSION_MODE_FEATURE
* @brief Enables inclusion mode feature.
*/
//#define MY_INCLUSION_MODE_FEATURE
// Enables inclusion-mode button feature on the gateway device
/**
* @def MY_INCLUSION_BUTTON_FEATURE
* @brief Enables inclusion-mode button feature on the gateway device
*/
//#define MY_INCLUSION_BUTTON_FEATURE
// Disable inclusion mode button if inclusion mode feature is not enabled
@@ -373,7 +390,7 @@
* @brief The logical level indicating a pressed inclusion mode button.
*/
#if defined(MY_INCLUSION_BUTTON_EXTERNAL_PULLUP)
#define MY_INCLUSION_BUTTON_PRESSED HIGH
#define MY_INCLUSION_BUTTON_PRESSED HIGH
#else
#define MY_INCLUSION_BUTTON_PRESSED LOW
#endif
@@ -382,9 +399,10 @@
* Message Signing Settings
***********************************/
/**
* @def MY_DEBUG_VERBOSE_SIGNING
* @brief Flag for verbose debug prints related to signing. Requires DEBUG to be enabled. This will add even more to the size of the final sketch!
*/
* @def MY_DEBUG_VERBOSE_SIGNING
* @brief Flag for verbose debug prints related to signing. Requires DEBUG to be enabled.
* This will add even more to the size of the final sketch!
*/
//#define MY_DEBUG_VERBOSE_SIGNING
/**
@@ -414,7 +432,8 @@
/**
* @def MY_SIGNING_GW_REQUEST_SIGNATURES_FROM_ALL
* @brief Enable this to have gateway require all nodes in the network to sign messages sent to it. @ref MY_SIGNING_REQUEST_SIGNATURES must also be set.
* @brief Enable this to have gateway require all nodes in the network to sign messages sent to it.
* @ref MY_SIGNING_REQUEST_SIGNATURES must also be set.
*
* Use this for maximum security, but be aware that every single node will have to be personalized before they can be used.
* Note that if this is enabled, and whitelisting is also enabled, whitelisting will also be in effect for all nodes.
@@ -540,17 +559,17 @@
#endif
/**
* @def MY_RF24_POWER_PIN
* @brief NRF24 power pin, uncomment if used
*/
* @def MY_RF24_POWER_PIN
* @brief NRF24 power pin, uncomment if used
*/
//#define MY_RF24_POWER_PIN (3)
/**
* @def MY_RX_MESSAGE_BUFFER_FEATURE
* @brief This enabled the receiving buffer feature.
*
* This feature is currently not supported for RFM69 and RS485, for RF24 MY_RF24_IRQ_PIN has to be defined.
*/
* @def MY_RX_MESSAGE_BUFFER_FEATURE
* @brief This enabled the receiving buffer feature.
*
* This feature is currently not supported for RFM69 and RS485, for RF24 MY_RF24_IRQ_PIN has to be defined.
*/
//#define MY_RX_MESSAGE_BUFFER_FEATURE
/**
@@ -654,21 +673,22 @@
***********************************/
/**
* @def MY_DEBUG_VERBOSE_RFM69
* @brief Enable MY_DEBUG_VERBOSE_RFM69 flag for verbose debug prints related to the RFM69 driver.
*/
* @def MY_DEBUG_VERBOSE_RFM69
* @brief Enable MY_DEBUG_VERBOSE_RFM69 flag for verbose debug prints related to the RFM69 driver.
*/
//#define MY_DEBUG_VERBOSE_RFM69
/**
* @def MY_DEBUG_VERBOSE_RFM69_REGISTERS
* @brief Enable MY_DEBUG_VERBOSE_RFM69_REGISTERS
*/
* @def MY_DEBUG_VERBOSE_RFM69_REGISTERS
* @brief Print content of RFM69 radio registers.
*/
//#define MY_DEBUG_VERBOSE_RFM69_REGISTERS
/**
* @def MY_RFM69_NEW_DRIVER
* @brief Enable MY_RFM69_NEW_DRIVER to include the refactored RFM69 driver
*/
* @def MY_RFM69_NEW_DRIVER
* @brief Enable MY_RFM69_NEW_DRIVER to enable the refactored RFM69 driver.
* IMPORTANT: This driver is not compatible with the old (=default) RFM69 driver.
*/
//#define MY_RFM69_NEW_DRIVER
/**
@@ -676,6 +696,7 @@
* @brief RFM69 frequency to use: RFM69_433MHZ, RFM69_868MHZ, RFM69_915MHZ, or custom frequency in Hz (new RFM69 driver only).
*
* This must match the hardware version of the RFM69 radio.
* Additional information: https://en.wikipedia.org/wiki/Short_Range_Devices
*/
#ifndef MY_RFM69_FREQUENCY
#define MY_RFM69_FREQUENCY RFM69_868MHZ
@@ -699,7 +720,7 @@
/**
* @def MY_RFM69_TX_POWER_DBM
* @brief Set TX power level (0..31), default 5
* @brief Set TX power level, default 5dBm (overriden if ATC mode enabled).
*/
#ifndef MY_RFM69_TX_POWER_DBM
#define MY_RFM69_TX_POWER_DBM (5)
@@ -707,7 +728,7 @@
/**
* @def MY_RFM69_ATC_TARGET_RSSI_DBM
* @brief MY_RFM69_ATC_TARGET_RSSI_DBM
* @brief Target RSSI level (in dBm) for RFM69 ATC mode.
*/
#ifndef MY_RFM69_ATC_TARGET_RSSI_DBM
#define MY_RFM69_ATC_TARGET_RSSI_DBM (-80)
@@ -715,16 +736,17 @@
/**
* @def MY_RFM69_ATC_MODE_DISABLED
* @brief MY_RFM69_ATC_MODE_DISABLED
* @brief Switch to disable ATC mode of RFM69 driver.
*/
//#define MY_RFM69_ATC_MODE_DISABLED
/**
* @def RFM69_MAX_POWER_LEVEL_DBM
* @def MY_RFM69_MAX_POWER_LEVEL_DBM
* @brief Set max TX power in dBm if local legislation requires
* 1mW = 0dBm, 10mW = 10dBm, 25mW = 14dBm, 100mW = 20dBm
* see here: https://en.wikipedia.org/wiki/Short_Range_Devices
*/
//#define RFM69_MAX_POWER_LEVEL_DBM (10u)
//#define MY_RFM69_MAX_POWER_LEVEL_DBM (10u)
/**
* @def MY_RFM69_NETWORKID
@@ -736,25 +758,24 @@
/**
* @def MY_RFM69_RST_PIN
* @brief RFM69 Reset pin, uncomment if used
* @brief RFM69 reset pin, uncomment if used.
*/
//#define MY_RFM69_RST_PIN (9)
// legacy, older board files
#ifdef MY_RF69_RESET
// legacy, older board files
#define MY_RFM69_RST_PIN MY_RF69_RESET
#endif
/**
* @def MY_RFM69_POWER_PIN
* @brief RFM69 power pin, uncomment if used
*/
* @def MY_RFM69_POWER_PIN
* @brief RFM69 power pin
*/
//#define MY_RFM69_POWER_PIN (3)
/**
* @def MY_RFM69_IRQ_PIN
* @brief RFM69 IRQ pin.
* @brief RFM69 IRQ pin
*/
#ifndef MY_RFM69_IRQ_PIN
#ifdef MY_RF69_IRQ_PIN
@@ -808,7 +829,7 @@
//#define MY_RFM69_ENABLE_ENCRYPTION
/**
* Uncomment if you need listenmode. else comment it and save memory
* Uncomment if you need listenmode, else comment it and save memory
*/
//#define MY_RFM69_ENABLE_LISTENMODE
@@ -842,9 +863,9 @@
***********************************/
/**
* @def MY_DEBUG_VERBOSE_RFM95
* @brief Enable MY_DEBUG_VERBOSE_RFM95 flag for verbose debug prints related to the RFM95 driver.
*/
* @def MY_DEBUG_VERBOSE_RFM95
* @brief Enable MY_DEBUG_VERBOSE_RFM95 flag for verbose debug prints related to the RFM95 driver.
*/
//#define MY_DEBUG_VERBOSE_RFM95
/**
@@ -852,111 +873,126 @@
* @brief RFM95 frequency to use: RFM95_169MHZ, RFM95_315MHZ, RFM95_434MHZ, RFM95_868MHZ, RFM95_915MHZ, or custom frequency in Hz.
*
* This must match the hardware version of the RFM95 radio.
* Additional information: https://en.wikipedia.org/wiki/Short_Range_Devices
*/
#ifndef MY_RFM95_FREQUENCY
#define MY_RFM95_FREQUENCY RFM95_868MHZ
#endif
/**
* @def MY_RFM95_MODEM_CONFIGRUATION
* @brief RFM95 modem configuration, see table. Default RFM95 modem configuration: RFM95_BW125CR45SF128
*
* BW = Bandwidth in kHz
* CR = Error correction code
* SF = Spreading factor, chips / symbol
*
* | CONFIG | BW | CR | SF | Comment
* |-------------------------|-------|-----|------|-----------------------------
* | RFM95_BW125CR45SF128 | 125 | 4/5 | 128 | Default, medium range
* | RFM95_BW500CR45SF128 | 500 | 4/5 | 128 | Fast, short range
* | RFM95_BW31_25CR48SF512 | 31.25 | 4/8 | 512 | Slow, long range
* | RFM95_BW125CR48SF4096 | 125 | 4/8 | 4096 | Slow, long range
*
*/
* @def MY_RFM95_MODEM_CONFIGRUATION
* @brief RFM95 modem configuration, see table. Default RFM95 modem configuration: @ref RFM95_BW125CR45SF128
*
* BW = Bandwidth in kHz
* CR = Error correction code
* SF = Spreading factor, chips / symbol
*
* | CONFIG | BW | CR | SF | Comment
* |------------------------|-------|-----|------|-----------------------------
* | RFM95_BW125CR45SF128 | 125 | 4/5 | 128 | Default, medium range
* | RFM95_BW500CR45SF128 | 500 | 4/5 | 128 | Fast, short range
* | RFM95_BW31_25CR48SF512 | 31.25 | 4/8 | 512 | Slow, long range
* | RFM95_BW125CR48SF4096 | 125 | 4/8 | 4096 | Slow, long range
*
*/
#ifndef MY_RFM95_MODEM_CONFIGRUATION
#define MY_RFM95_MODEM_CONFIGRUATION RFM95_BW125CR45SF128
#endif
/**
* @def MY_RFM95_RST_PIN
* @brief RFM95 reset pin, uncomment if used
* @brief RFM95 reset pin, uncomment if used.
*/
//#define MY_RFM95_RST_PIN (9)
/**
* @def MY_RFM95_POWER_PIN
* @brief RFM95 power pin, uncomment if used
*/
* @def MY_RFM95_POWER_PIN
* @brief RFM95 power pin, uncomment if used
*/
//#define MY_RFM95_POWER_PIN (3)
/**
* @def MY_RFM95_IRQ_PIN
* @brief RFM95 IRQ pin
* @brief RFM95 IRQ pin.
*/
#ifndef MY_RFM95_IRQ_PIN
#define MY_RFM95_IRQ_PIN DEFAULT_RFM95_IRQ_PIN
#endif
/**
* @def MY_RFM95_IRQ_NUM
* @brief RFM95 IRQ number
*/
* @def MY_RFM95_IRQ_NUM
* @brief RFM95 IRQ number.
*/
#ifndef MY_RFM95_IRQ_NUM
#define MY_RFM95_IRQ_NUM DEFAULT_RFM95_IRQ_NUM
#endif
/**
* @def MY_RFM95_CS_PIN
* @brief RFM95 SPI chip select pin
* @brief RFM95 SPI chip select pin.
*/
#ifndef MY_RFM95_CS_PIN
#define MY_RFM95_CS_PIN DEFAULT_RFM95_CS_PIN
#endif
/**
* @def MY_RFM95_SPI_SPEED
* @brief Set to overrule default RFM95 SPI speed, default 4Mhz.
*/
* @def MY_RFM95_SPI_SPEED
* @brief Set to overrule default RFM95 SPI speed, default 4Mhz.
*/
#ifndef MY_RFM95_SPI_SPEED
#define MY_RFM95_SPI_SPEED (4*1000000ul)
#endif
/**
* @def MY_RFM95_TX_POWER_DBM
* @brief RFM95 TX power level.
* @brief Set TX power level, default 13dBm (overriden if ATC mode enabled)
* see here: https://en.wikipedia.org/wiki/Short_Range_Devices
*/
#ifndef MY_RFM95_TX_POWER_DBM
#define MY_RFM95_TX_POWER_DBM (13u) // 20mW
#endif
/**
* @def MY_RFM95_ATC_MODE_DISABLED
* @brief Enable to disable ATC mode
*/
* @def MY_RFM95_ATC_MODE_DISABLED
* @brief Switch to disable RFM95 ATC mode
*/
//#define MY_RFM95_ATC_MODE_DISABLED
/**
* @def MY_RFM95_ATC_TARGET_RSSI
* @brief Traget RSSI level for ATC mode
*/
* @def MY_RFM95_ATC_TARGET_RSSI
* @brief Target RSSI level (in dBm) for RFM95 ATC mode
*/
#ifndef MY_RFM95_ATC_TARGET_RSSI
#define MY_RFM95_ATC_TARGET_RSSI (-60)
#endif
/**
* @def RFM95_MAX_POWER_LEVEL_DBM
* @brief Set max TX power in dBm if local legislation requires
* 1mW = 0dBm, 10mW = 10dBm, 25mW = 14dBm, 100mW = 20dBm
*/
//#define RFM95_MAX_POWER_LEVEL_DBM (10u)
* @def MY_RFM95_MAX_POWER_LEVEL_DBM
* @brief Set max TX power in dBm if local legislation requires
* 1mW = 0dBm, 10mW = 10dBm, 25mW = 14dBm, 100mW = 20dBm
* see here: https://en.wikipedia.org/wiki/Short_Range_Devices
*/
//#define MY_RFM95_MAX_POWER_LEVEL_DBM (10u)
/**
* @def MY_RFM95_TCXO
* @brief Enable to force your radio to use an external frequency source (e.g. TCXO, if present).
* This allows for better stability using SF 9 to 12.
*/
* @def MY_RFM95_TCXO
* @brief Enable to force your radio to use an external frequency source (e.g. TCXO, if present).
* This allows for better stability using SF 9 to 12.
*/
//#define MY_RFM95_TCXO
/**************************************
* Signal report
***************************************/
/**
* @def MY_SIGNAL_REPORT_ENABLED
* @brief Enables signal report functionality, see @ref transportSignalReport().
* NOTE: This feature adds ~1kB code to the sketch.
*/
#define MY_SIGNAL_REPORT_ENABLED
/**************************************
* Ethernet Gateway Transport Defaults
@@ -993,11 +1029,11 @@
//#define MY_USE_UDP
/**
* @def MY_IP_RENEWAL_INTERVAL
* @def MY_IP_RENEWAL_INTERVAL_MS
* @brief DHCP, default renewal setting in milliseconds.
*/
#ifndef MY_IP_RENEWAL_INTERVAL
#define MY_IP_RENEWAL_INTERVAL (60*1000ul)
#ifndef MY_IP_RENEWAL_INTERVAL_MS
#define MY_IP_RENEWAL_INTERVAL_MS (60*1000ul)
#endif
/**
@@ -1146,6 +1182,9 @@
// linux
#define MY_LINUX_SERIAL_GROUPNAME
#define MY_LINUX_IS_SERIAL_PTY
// inclusion mode
#define MY_INCLUSION_MODE_FEATURE
#define MY_INCLUSION_BUTTON_FEATURE
// transport
#define MY_PARENT_NODE_IS_STATIC
#define MY_REGISTRATION_CONTROLLER
@@ -1156,6 +1195,7 @@
#define MY_PASSIVE_NODE
#define MY_MQTT_CLIENT_PUBLISH_RETAIN
// general
#define MY_WITH_LEDS_BLINKING_INVERSE
#define MY_INDICATION_HANDLER
#define MY_DISABLE_REMOTE_RESET
// signing
@@ -1179,7 +1219,7 @@
#define MY_RFM69_POWER_PIN
#define MY_RFM69_ENABLE_ENCRYPTION
#define MY_RFM69_ATC_MODE_DISABLED
#define RFM69_MAX_POWER_LEVEL_DBM
#define MY_RFM69_MAX_POWER_LEVEL_DBM
#define MY_RFM69_RST_PIN
#define MY_DEBUG_VERBOSE_RFM69
#define MY_DEBUG_VERBOSE_RFM69_REGISTERS
@@ -1190,5 +1230,6 @@
#define MY_RFM95_MODEM_CONFIGRUATION
#define MY_RFM95_POWER_PIN
#define MY_RFM95_TCXO
#define MY_RFM95_MAX_POWER_LEVEL_DBM
#endif
+9 -16
View File
@@ -25,7 +25,11 @@
#ifndef MySensors_h
#define MySensors_h
#ifdef __cplusplus
#include <Arduino.h>
#endif
#include "MyConfig.h"
#include "core/MySensorsCore.h"
// Detect node type
@@ -57,13 +61,13 @@
// DEBUG
#if defined(MY_DEBUG)
// standard debug output
#define MY_DEBUG_VERBOSE_CORE
#define MY_DEBUG_VERBOSE_TRANSPORT
#define MY_DEBUG_VERBOSE_OTA_UPDATE
#define MY_DEBUG_VERBOSE_CORE //!< MY_DEBUG_VERBOSE_CORE
#define MY_DEBUG_VERBOSE_TRANSPORT //!< MY_DEBUG_VERBOSE_TRANSPORT
#define MY_DEBUG_VERBOSE_OTA_UPDATE //!< MY_DEBUG_VERBOSE_OTA_UPDATE
#endif
#if defined(MY_DEBUG) || defined(MY_DEBUG_VERBOSE_CORE) || defined(MY_DEBUG_VERBOSE_TRANSPORT) || defined(MY_DEBUG_VERBOSE_SIGNING) || defined(MY_DEBUG_VERBOSE_OTA_UPDATE) || defined(MY_DEBUG_VERBOSE_RF24) || defined(MY_DEBUG_VERBOSE_RFM69) || defined(MY_DEBUG_VERBOSE_RFM95)
#define DEBUG_OUTPUT_ENABLED
#define DEBUG_OUTPUT_ENABLED //!< DEBUG_OUTPUT_ENABLED
#define DEBUG_OUTPUT(x,...) hwDebugPrint(x, ##__VA_ARGS__) //!< debug
#else
#define DEBUG_OUTPUT(x,...) //!< debug NULL
@@ -112,17 +116,6 @@ define MY_DEFAULT_ERR_LED_PIN, MY_DEFAULT_TX_LED_PIN or\
MY_DEFAULT_RX_LED_PIN in your sketch instead to enable LEDs
#endif
// tk: move to MyConfig.h
/**
* @def MY_DEFAULT_LED_BLINK_PERIOD
* @brief Default LEDs blinking period in milliseconds.
*/
#ifndef MY_DEFAULT_LED_BLINK_PERIOD
#define MY_DEFAULT_LED_BLINK_PERIOD 300
#endif
// ===
#if defined(MY_DEFAULT_RX_LED_PIN) || defined(MY_DEFAULT_TX_LED_PIN) || defined(MY_DEFAULT_ERR_LED_PIN)
#include "core/MyLeds.cpp"
#else
@@ -140,7 +133,7 @@ MY_DEFAULT_RX_LED_PIN in your sketch instead to enable LEDs
// SIGNING
#if defined(MY_SIGNING_ATSHA204) || defined(MY_SIGNING_SOFT)
#define MY_SIGNING_FEATURE
#define MY_SIGNING_FEATURE //!< MY_SIGNING_FEATURE
#endif
#include "core/MySigning.cpp"
#include "drivers/ATSHA204/sha256.cpp"
+3 -3
View File
@@ -1,12 +1,12 @@
/**
/*
* The MySensors Arduino library handles the wireless radio link and protocol
* between your home built sensors/actuators and HA controller of choice.
* The sensors forms a self healing radio network with optional repeaters. Each
* repeater and gateway builds a routing tables in EEPROM which keeps track of the
* network topology allowing messages to be routed to nodes.
*
* Created by Tomas Hozza <thozza@gmail.com>
* Copyright (C) 2015 Tomas Hozza
* Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
* Copyright (C) 2013-2017 Sensnology AB
* Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
*
* Documentation: http://www.mysensors.org
+2 -2
View File
@@ -428,7 +428,7 @@ void gatewayTransportRenewIP(void)
3 - rebinf failed
4 - rebind success
*/
static unsigned long next_time = hwMillis() + MY_IP_RENEWAL_INTERVAL;
static unsigned long next_time = hwMillis() + MY_IP_RENEWAL_INTERVAL_MS;
unsigned long now = hwMillis();
// http://playground.arduino.cc/Code/TimingRollover
@@ -441,6 +441,6 @@ void gatewayTransportRenewIP(void)
return;
}
_w5100_spi_en(false);
next_time = now + MY_IP_RENEWAL_INTERVAL;
next_time = now + MY_IP_RENEWAL_INTERVAL_MS;
}
#endif
-8
View File
@@ -26,14 +26,6 @@
#ifndef MyHw_h
#define MyHw_h
#include "MyConfig.h"
#include "MyMessage.h"
#ifdef __cplusplus
#include <Arduino.h>
#endif
// Implement these as functions or macros
/*
#define hwInit() MY_SERIALDEVICE.begin(BAUD_RATE)
+28 -13
View File
@@ -559,12 +559,13 @@ bool transportRouteMessage(MyMessage &message)
_transportSM.failedUplinkTransmissions++;
} else {
_transportSM.failedUplinkTransmissions = 0u;
#if defined(MY_SIGNAL_REPORT_ENABLED)
// update uplink quality monitor
const int16_t signalStrengthRSSI = transportGetSignalReport(SR_TX_RSSI);
_transportSM.uplinkQualityRSSI = static_cast<transportRSSI_t>((1 - UPLINK_QUALITY_WEIGHT) *
_transportSM.uplinkQualityRSSI
+ (UPLINK_QUALITY_WEIGHT * transportRSSItoInternal(signalStrengthRSSI)));
#endif
}
}
#else
@@ -791,21 +792,27 @@ void transportProcessMessage(void)
return; // no further processing required
}
if (type == I_SIGNAL_REPORT_REVERSE) {
if (_msg.data[1] == '!') {
const int16_t value = transportSignalReport(_msg.data[0]);
(void)_msg.set(value);
_msg.type = I_SIGNAL_REPORT_RESPONSE;
}
return; // no further processing required
}
if (type == I_SIGNAL_REPORT_REQUEST) {
const char command = _msg.data[0];
int16_t value = INVALID_RSSI;
#if defined(MY_SIGNAL_REPORT_ENABLED)
if (_msg.data[1] != '!') {
const int16_t value = transportSignalReport(_msg.data[0]);
(void)transportRouteMessage(build(_msgTmp, GATEWAY_ADDRESS, NODE_SENSOR_ID, C_INTERNAL,
I_SIGNAL_REPORT_RESPONSE).set(value));
value = transportSignalReport(command);
} else {
(void)transportRouteMessage(build(_msgTmp, _msg.sender, NODE_SENSOR_ID, C_INTERNAL,
I_SIGNAL_REPORT_REVERSE).set(_msg.data, 2));
// send request
if (transportRouteMessage(build(_msgTmp, _msg.last, NODE_SENSOR_ID, C_INTERNAL,
I_SIGNAL_REPORT_REVERSE).set((uint8_t)255))) {
// S>s, R>r, ascii delta = 32
value = transportSignalReport(command + 32); // reverse
};
}
#else
(void)command;
#endif
(void)transportRouteMessage(build(_msgTmp, GATEWAY_ADDRESS, NODE_SENSOR_ID, C_INTERNAL,
I_SIGNAL_REPORT_RESPONSE).set(value));
return;
}
} else if (command == C_STREAM) {
@@ -1117,13 +1124,21 @@ int16_t transportSignalReport(const char command)
signalReport_t reportCommand;
switch (command) {
case 'S':
// SNR (if available) of incoming message (this)
// SNR (if available) of incoming message
reportCommand = SR_RX_SNR;
break;
case 's':
// SNR (if available) of incoming ACK message
reportCommand = SR_TX_SNR;
break;
case 'R':
// RSSI (if available) of incoming message (this)
// RSSI (if available) of incoming message
reportCommand = SR_RX_RSSI;
break;
case 'r':
// RSSI (if available) of incoming ACK message
reportCommand = SR_TX_RSSI;
break;
case 'P':
// TX powerlevel in %
reportCommand = SR_TX_POWER_PERCENT;
+9 -8
View File
@@ -159,7 +159,6 @@
#ifndef MyTransport_h
#define MyTransport_h
#include "MySensorsCore.h"
#include "hal/transport/MyTransportHAL.h"
#ifndef MY_TRANSPORT_MAX_TX_FAILURES
@@ -520,13 +519,15 @@ void transportDisable(void);
void transportReInitialise(void);
/**
* @brief Get transport signal report
* @param command
* S=SNR (if available) of incoming message (this)
* R=RSSI (if available) of incoming message (this)
* P=TX powerlevel in %
* T=TX powerlevel in dBm
* U=Uplink quality
* @return report
* @param command:
* R = RSSI (if available) of incoming @ref I_SIGNAL_REPORT_REQUEST message (from last hop)
* R! = RSSI (if available) of ACK to @ref I_SIGNAL_REPORT_REVERSE message received from last hop
* S = SNR (if available) of incoming @ref I_SIGNAL_REPORT_REQUEST message (from last hop)
* S! = SNR (if available) of ACK to @ref I_SIGNAL_REPORT_REVERSE message received from last hop
* P = TX powerlevel in %
* T = TX powerlevel in dBm
* U = Uplink quality (via ACK from parent node), avg. RSSI
* @return Signal report (if report is not available, INVALID_RSSI, INVALID_SNR, INVALID_PERCENT, or INVALID_LEVEL is sent instead)
*/
int16_t transportSignalReport(const char command);
-93
View File
@@ -1,93 +0,0 @@
/*
* The MySensors Arduino library handles the wireless radio link and protocol
* between your home built sensors/actuators and HA controller of choice.
* The sensors forms a self healing radio network with optional repeaters. Each
* repeater and gateway builds a routing tables in EEPROM which keeps track of the
* network topology allowing messages to be routed to nodes.
*
* Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
* Copyright (C) 2013-2017 Sensnology AB
* Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
*
* Documentation: http://www.mysensors.org
* Support Forum: http://forum.mysensors.org
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 2 as published by the Free Software Foundation.
*/
#include "MyConfig.h"
#include "MyTransport.h"
#include <stdint.h>
#include "drivers/RFM69/RFM69.h"
RFM69 _radio(MY_RF69_SPI_CS, MY_RF69_IRQ_PIN, MY_RFM69HW, MY_RF69_IRQ_NUM);
uint8_t _address;
bool transportInit(void)
{
#ifdef MY_RF69_RESET
pinMode(MY_RF69_RESET, OUTPUT);
digitalWrite(MY_RF69_RESET, LOW);
#endif
#ifdef MY_RF69_DIO5
pinMode(MY_RF69_DIO5, INPUT);
#endif
// Start up the radio library (_address will be set later by the MySensors library)
if (_radio.initialize(MY_RFM69_FREQUENCY, _address, MY_RFM69_NETWORKID)) {
#ifdef MY_RFM69_ENABLE_ENCRYPTION
uint8_t _psk[16];
hwReadConfigBlock((void*)_psk, (void*)EEPROM_RF_ENCRYPTION_AES_KEY_ADDRESS, 16);
_radio.encrypt((const char*)_psk);
memset(_psk, 0, 16); // Make sure it is purged from memory when set
#endif
return true;
}
return false;
}
void transportSetAddress(const uint8_t address)
{
_address = address;
_radio.setAddress(address);
}
uint8_t transportGetAddress(void)
{
return _address;
}
bool transportSend(const uint8_t to, const void* data, const uint8_t len)
{
return _radio.sendWithRetry(to,data,len);
}
bool transportAvailable(void)
{
return _radio.receiveDone();
}
bool transportSanityCheck(void)
{
// not implemented yet
return true;
}
uint8_t transportReceive(void* data)
{
memcpy(data,(const void *)_radio.DATA, _radio.DATALEN);
// save payload length
const uint8_t dataLen = _radio.DATALEN;
// Send ack back if this message wasn't a broadcast
if(_radio.ACKRequested()) {
_radio.sendACK();
}
return dataLen;
}
void transportPowerDown(void)
{
_radio.sleep();
}
-92
View File
@@ -1,92 +0,0 @@
/*
* The MySensors Arduino library handles the wireless radio link and protocol
* between your home built sensors/actuators and HA controller of choice.
* The sensors forms a self healing radio network with optional repeaters. Each
* repeater and gateway builds a routing tables in EEPROM which keeps track of the
* network topology allowing messages to be routed to nodes.
*
* Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
* Copyright (C) 2013-2017 Sensnology AB
* Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
*
* Documentation: http://www.mysensors.org
* Support Forum: http://forum.mysensors.org
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 2 as published by the Free Software Foundation.
*
*/
#include "MyConfig.h"
#include "MyTransport.h"
#include "drivers/RFM95/RFM95.h"
bool transportInit(void)
{
const bool result = RFM95_initialise(MY_RFM95_FREQUENCY);
#if !defined(MY_GATEWAY_FEATURE) && !defined(MY_RFM95_ATC_MODE_DISABLED)
// only enable ATC mode nodes
RFM95_ATCmode(true, MY_RFM95_ATC_TARGET_RSSI);
#endif
return result;
}
void transportSetAddress(const uint8_t address)
{
RFM95_setAddress(address);
}
uint8_t transportGetAddress(void)
{
return RFM95_getAddress();
}
bool transportSend(const uint8_t to, const void* data, const uint8_t len)
{
return RFM95_sendWithRetry(to, data, len);
}
bool transportAvailable(void)
{
return RFM95_available();
}
bool transportSanityCheck(void)
{
return RFM95_sanityCheck();
}
uint8_t transportReceive(void* data)
{
return RFM95_recv((uint8_t*)data);
}
void transportPowerDown(void)
{
(void)RFM95_sleep();
}
// experimental
// **********************************************
int16_t transportGetReceivingSignalStrength(void)
{
return RFM95_getReceivingRSSI();
}
int16_t transportGetSendingSignalStrength(void)
{
return RFM95_getSendingRSSI();
}
int8_t transportGetReceivingSNR(void)
{
return RFM95_getReceivingSNR();
}
int8_t transportGetSendingSNR(void)
{
return RFM95_getSendingSNR();
}
uint8_t transportGetTxPower(void)
{
return RFM95_getTxPowerPercent();
}
// **********************************************
+2 -2
View File
@@ -1093,7 +1093,7 @@ LOCAL void RFM69_listenModeSendBurst(const uint8_t recipient, uint8_t* data, con
RFM69_DEBUG(PSTR("RFM69:LSM:Send burst for %d ms\n"), cycleDurationMs);
(void)RFM69_setRadioMode(RFM69_RADIO_MODE_TX);
uint32_t startTime = millis();
uint32_t startTime = hwMillis();
while (timeRemaining.l > 0) {
// send burst
@@ -1119,7 +1119,7 @@ LOCAL void RFM69_listenModeSendBurst(const uint8_t recipient, uint8_t* data, con
while ((RFM69_readReg(RFM69_REG_IRQFLAGS2) & RFM69_IRQFLAGS2_FIFONOTEMPTY) !=
0x00); // make sure packet is sent before putting more into the FIFO
timeRemaining.l = cycleDurationMs - (millis() - startTime);
timeRemaining.l = cycleDurationMs - (hwMillis() - startTime);
}
(void)RFM69_setRadioMode(RFM69_RADIO_MODE_TX);
+8 -4
View File
@@ -35,7 +35,7 @@
/**
* @file RFM69.h
*
* @defgroup RFM69grp RFM69
* @defgroup RFM69Newgrp RFM69New
* @ingroup internals
* @{
*
@@ -144,13 +144,17 @@ extern HardwareSPI SPI; //!< SPI
// RFM69H(C)W
#define RFM69_VERSION_HW //!< HW version
#define RFM69_MIN_POWER_LEVEL_DBM ((rfm69_powerlevel_t)-2) //!< min. power level, -18dBm
#if !defined(RFM69_MAX_POWER_LEVEL_DBM)
#if defined(MY_RFM69_MAX_POWER_LEVEL_DBM)
#define RFM69_MAX_POWER_LEVEL_DBM MY_RFM69_MAX_POWER_LEVEL_DBM //!< MY_RFM69_MAX_POWER_LEVEL_DBM
#else
#define RFM69_MAX_POWER_LEVEL_DBM ((rfm69_powerlevel_t)20) //!< max. power level, +20dBm
#endif
#else
// RFM69(C)W
#define RFM69_MIN_POWER_LEVEL_DBM ((rfm69_powerlevel_t)-18) //!< min. power level, -18dBm
#if !defined(RFM69_MAX_POWER_LEVEL_DBM)
#if defined(MY_RFM69_MAX_POWER_LEVEL_DBM)
#define RFM69_MAX_POWER_LEVEL_DBM MY_RFM69_MAX_POWER_LEVEL_DBM //!< MY_RFM69_MAX_POWER_LEVEL_DBM
#else
#define RFM69_MAX_POWER_LEVEL_DBM ((rfm69_powerlevel_t)13) //!< max. power level, +13dBm
#endif
#endif
@@ -352,7 +356,7 @@ LOCAL uint8_t RFM69_getAddress(void);
/**
* @brief Tests whether a new message is available
* @return True if a new, complete, error-free uncollected message is available to be retreived by @ref RFM95_recv()
* @return True if a new, complete, error-free uncollected message is available to be retreived by @ref RFM69_recv()
*/
LOCAL bool RFM69_available(void);
-1
View File
@@ -325,7 +325,6 @@ bool RFM69::sendWithRetry(uint8_t toAddress, const void* buffer, uint8_t bufferS
uint32_t sentTime = hwMillis();
while (hwMillis() - sentTime < retryWaitTime) {
if (ACKReceived(toAddress)) {
//Serial.print(" ~ms:"); Serial.print(millis() - sentTime);
return true;
}
}
+3 -3
View File
@@ -128,7 +128,7 @@ LOCAL uint8_t RFM95_RAW_writeByteRegister(const uint8_t address, uint8_t value)
#define RFM95_burstReadReg(__reg, __buf, __len) RFM95_spiMultiByteTransfer( __reg & RFM95_READ_REGISTER, (uint8_t*)__buf, __len, true )
#define RFM95_burstWriteReg(__reg, __buf, __len) RFM95_spiMultiByteTransfer( __reg | RFM95_WRITE_REGISTER, (uint8_t*)__buf, __len, false )
LOCAL bool RFM95_initialise(const float frequency)
LOCAL bool RFM95_initialise(const uint32_t frequencyHz)
{
RFM95_DEBUG(PSTR("RFM95:INIT\n"));
// reset radio module if rst pin defined
@@ -181,7 +181,7 @@ LOCAL bool RFM95_initialise(const float frequency)
const rfm95_modemConfig_t configuration = { MY_RFM95_MODEM_CONFIGRUATION };
RFM95_setModemRegisters(&configuration);
RFM95_setPreambleLength(RFM95_PREAMBLE_LENGTH);
RFM95_setFrequency(frequency);
RFM95_setFrequency(frequencyHz);
(void)RFM95_setTxPowerLevel(MY_RFM95_TX_POWER_DBM);
// IRQ
hwPinMode(MY_RFM95_IRQ_PIN, INPUT);
@@ -438,7 +438,7 @@ LOCAL void RFM95_powerUp(void)
LOCAL void RFM95_powerDown(void)
{
#if defined(MY_RFM95_POWER_PIN)
hwDigitalWrite(RFM69_POWER_PIN, LOW);
hwDigitalWrite(MY_RFM95_POWER_PIN, LOW);
#endif
}
+7 -5
View File
@@ -60,14 +60,14 @@
* CR = Error correction code
* SF = Spreading factor, chips / symbol
*
* | CONFIG | REG_1D | REG_1E | REG_26 | BW | CR | SF | Comment | air-time (~15 bytes)
* | CONFIG | REG_1D | REG_1E | REG_26 | BW | CR | SF | Comment | air-time (15 bytes)
* |------------------|--------|--------|--------|-------|-----|------|------------------------------------------------
* | BW125CR45SF128 | 0x72 | 0x74 | 0x04 | 125 | 4/5 | 128 | Default, medium range | 50ms
* | BW500CR45SF128 | 0x92 | 0x74 | 0x04 | 500 | 4/5 | 128 | Fast, short range | 15ms
* | BW31_25CR48SF512 | 0x48 | 0x94 | 0x04 | 31.25 | 4/8 | 512 | Slow, long range | 900ms
* | BW125CR48SF4096 | 0x78 | 0xC4 | 0x0C | 125 | 4/8 | 4096 | Slow, long range | 1500ms
*
* See here for air-time calculation: https://docs.google.com/spreadsheets/d/1voGAtQAjC1qBmaVuP1ApNKs1ekgUjavHuVQIXyYSvNc/edit#gid=0
* See here for air-time calculation: https://docs.google.com/spreadsheets/d/1voGAtQAjC1qBmaVuP1ApNKs1ekgUjavHuVQIXyYSvNc
*
* @brief API declaration for RFM95
*
@@ -189,7 +189,9 @@ extern HardwareSPI SPI; //!< SPI
#define RFM95_internalToSNR(__value) ((int8_t)(__value / 4)) //!< Convert internal SNR to SNR
#define RFM95_MIN_POWER_LEVEL_DBM ((rfm95_powerLevel_t)5u) //!< min. power level
#if !defined(RFM95_MAX_POWER_LEVEL_DBM)
#if defined(MY_RFM95_MAX_POWER_LEVEL_DBM)
#define RFM95_MAX_POWER_LEVEL_DBM MY_RFM95_MAX_POWER_LEVEL_DBM //!< MY_RFM95_MAX_POWER_LEVEL_DBM
#else
#define RFM95_MAX_POWER_LEVEL_DBM ((rfm95_powerLevel_t)23u) //!< max. power level
#endif
/**
@@ -298,10 +300,10 @@ typedef struct {
/**
* @brief Initialise the driver transport hardware and software
* @param frequency
* @param frequencyHz Transmitter frequency in Hz
* @return True if initialisation succeeded
*/
LOCAL bool RFM95_initialise(const float frequency);
LOCAL bool RFM95_initialise(const uint32_t frequencyHz);
/**
* @brief Set the driver/node address
* @param addr
@@ -0,0 +1,99 @@
/**
* The MySensors Arduino library handles the wireless radio link and protocol
* between your home built sensors/actuators and HA controller of choice.
* The sensors forms a self healing radio network with optional repeaters. Each
* repeater and gateway builds a routing tables in EEPROM which keeps track of the
* network topology allowing messages to be routed to nodes.
*
* Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
* Copyright (C) 2013-2017 Sensnology AB
* Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
*
* Documentation: http://www.mysensors.org
* Support Forum: http://forum.mysensors.org
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 2 as published by the Free Software Foundation.
*
*******************************
*
* REVISION HISTORY
* Version 1.0 - tekka
*
* DESCRIPTION
* ATC mode settings and signal report functions, on RFM69 and RFM95 nodes
*
*/
// Enable debug prints
#define MY_DEBUG
// Enable and select radio type attached
// RFM69
//#define MY_RADIO_RFM69
//#define MY_RFM69_NEW_DRIVER // ATC on RFM69 works only with the new driver (not compatible with old=default driver)
//#define MY_RFM69_ATC_TARGET_RSSI_DBM (-70) // target RSSI -70dBm
//#define MY_RFM69_MAX_POWER_LEVEL_DBM (10) // max. TX power 10dBm = 10mW
// RFM95
#define MY_RADIO_RFM95
#define MY_RFM95_ATC_TARGET_RSSI_DBM (-70) // target RSSI -70dBm
#define MY_RFM95_MAX_POWER_LEVEL_DBM (10) // max. TX power 10dBm = 10mW
#include <MySensors.h>
// ID of the sensor child
#define CHILD_ID_UPLINK_QUALITY (0)
#define CHILD_ID_TX_LEVEL (1)
#define CHILD_ID_TX_PERCENT (2)
#define CHILD_ID_TX_RSSI (3)
#define CHILD_ID_RX_RSSI (4)
#define CHILD_ID_TX_SNR (5)
#define CHILD_ID_RX_SNR (6)
// Initialize general message
MyMessage msgTxRSSI(CHILD_ID_TX_RSSI, V_CUSTOM);
MyMessage msgRxRSSI(CHILD_ID_RX_RSSI, V_CUSTOM);
MyMessage msgTxSNR(CHILD_ID_TX_SNR, V_CUSTOM);
MyMessage msgRxSNR(CHILD_ID_RX_SNR, V_CUSTOM);
MyMessage msgTxLevel(CHILD_ID_TX_LEVEL, V_CUSTOM);
MyMessage msgTxPercent(CHILD_ID_TX_PERCENT, V_CUSTOM);
MyMessage msgUplinkQuality(CHILD_ID_UPLINK_QUALITY, V_CUSTOM);
void setup()
{
}
void presentation()
{
// Send the sketch version information to the gateway and controller
sendSketchInfo("ATC", "1.0");
// Register all sensors to gw (they will be created as child devices)
present(CHILD_ID_UPLINK_QUALITY, S_CUSTOM, "UPLINK QUALITY RSSI");
present(CHILD_ID_TX_LEVEL, S_CUSTOM, "TX LEVEL DBM");
present(CHILD_ID_TX_PERCENT, S_CUSTOM, "TX LEVEL PERCENT");
present(CHILD_ID_TX_RSSI, S_CUSTOM, "TX RSSI");
present(CHILD_ID_RX_RSSI, S_CUSTOM, "RX RSSI");
present(CHILD_ID_TX_SNR, S_CUSTOM, "TX SNR");
present(CHILD_ID_RX_SNR, S_CUSTOM, "RX SNR");
}
void loop()
{
// send messages to GW
send(msgUplinkQuality.set(transportGetSignalReport(SR_UPLINK_QUALITY)));
send(msgTxLevel.set(transportGetSignalReport(SR_TX_POWER_LEVEL)));
send(msgTxPercent.set(transportGetSignalReport(SR_TX_POWER_PERCENT)));
// retrieve RSSI / SNR reports from incoming ACK
send(msgTxRSSI.set(transportGetSignalReport(SR_TX_RSSI)));
send(msgRxRSSI.set(transportGetSignalReport(SR_RX_RSSI)));
send(msgTxSNR.set(transportGetSignalReport(SR_TX_SNR)));
send(msgRxSNR.set(transportGetSignalReport(SR_RX_SNR)));
// wait a bit
wait(5000);
}
+3 -18
View File
@@ -23,6 +23,7 @@
#define INVALID_SNR ((int16_t)-256) //!< INVALID_SNR
#define INVALID_RSSI ((int16_t)-256) //!< INVALID_RSSI
#define INVALID_PERCENT ((int16_t)-100) //!< INVALID_PERCENT
#define INVALID_LEVEL ((int16_t)-256) //!< INVALID_LEVEL
#if defined(MY_RX_MESSAGE_BUFFER_FEATURE)
#if defined(MY_RADIO_RFM69)
@@ -92,11 +93,11 @@ bool transportSanityCheck(void);
*/
uint8_t transportReceive(void* data);
/**
* @brief Power down transport HW (if corresponding MY_XXXX_POWER_PIN defined)
* @brief Power down transport HW (if corresponding MY_XYZ_POWER_PIN defined)
*/
void transportPowerDown(void);
/**
* @brief Power up transport HW (if corresponding MY_XXXX_POWER_PIN defined)
* @brief Power up transport HW (if corresponding MY_XYZ_POWER_PIN defined)
*/
void transportPowerUp(void);
/**
@@ -107,22 +108,6 @@ void transportSleep(void);
* @brief Set transport HW to standby
*/
void transportStandBy(void);
// experimental
/**
* @brief transportSignalReport
* @param command
* @return
*/
int16_t transportSignalReport(const char command);
/**
* @brief transportGetSignalReport
* @param signalReport
* @return
*/
int16_t transportGetSignalReport(const signalReport_t signalReport = SR_RX_RSSI);
/**
* @brief transportGetSendingRSSI
* @return RSSI
+3 -3
View File
@@ -174,17 +174,17 @@ int16_t transportGetSendingRSSI(void)
int16_t transportGetReceivingRSSI(void)
{
// not available, only bool RPD
return static_cast<int16_t>(INVALID_RSSI);
return INVALID_RSSI;
}
int16_t transportGetSendingSNR(void)
{
return static_cast<int16_t>(INVALID_SNR);
return INVALID_SNR;
}
int16_t transportGetReceivingSNR(void)
{
return static_cast<int16_t>(INVALID_SNR);
return INVALID_SNR;
}
int16_t transportGetTxPowerPercent(void)
+2 -2
View File
@@ -252,12 +252,12 @@ int16_t transportGetReceivingSNR(void)
int16_t transportGetTxPowerPercent(void)
{
return 0;
return INVALID_PERCENT;
}
int16_t transportGetTxPowerLevel(void)
{
return 0;
return INVALID_LEVEL;
}
#endif
+4 -4
View File
@@ -106,22 +106,22 @@ int16_t transportGetReceivingRSSI(void)
int16_t transportGetSendingSNR(void)
{
return static_cast<int16_t>(RFM95_getSendingSNR());
return RFM95_getSendingSNR();
}
int16_t transportGetReceivingSNR(void)
{
return static_cast<int16_t>(RFM95_getReceivingSNR());
return RFM95_getReceivingSNR();
}
int16_t transportGetTxPowerPercent(void)
{
return static_cast<int16_t>(RFM95_getTxPowerPercent());
return RFM95_getTxPowerPercent();
}
int16_t transportGetTxPowerLevel(void)
{
return static_cast<int16_t>(RFM95_getTxPowerLevel());
return RFM95_getTxPowerLevel();
}
bool transportSetTxPowerPercent(const uint8_t powerPercent)
+4 -4
View File
@@ -381,25 +381,25 @@ void transportStandBy(void)
int16_t transportGetSendingRSSI(void)
{
// not implemented
return static_cast<int16_t>(INVALID_RSSI);
return INVALID_RSSI;
}
int16_t transportGetReceivingRSSI(void)
{
// not implemented
return static_cast<int16_t>(INVALID_RSSI);
return INVALID_RSSI;
}
int16_t transportGetSendingSNR(void)
{
// not implemented
return static_cast<int16_t>(INVALID_SNR);
return INVALID_SNR;
}
int16_t transportGetReceivingSNR(void)
{
// not implemented
return static_cast<int16_t>(INVALID_SNR);
return INVALID_SNR;
}
int16_t transportGetTxPowerPercent(void)
+4
View File
@@ -115,10 +115,13 @@ MY_RFM95_MODEM_CONFIGRUATION LITERAL1
MY_RFM95_FREQUENCY LITERAL1
MY_RFM95_TX_POWER LITERAL1
MY_RFM95_CS_PIN LITERAL1
MY_RFM95_RST_PIN LITERAL1
MY_RFM95_SPI_SPEED LITERAL1
MY_RFM95_IRQ_PIN LITERAL1
MY_RFM95_ATC_TARGET_RSSI LITERAL1
MY_RFM95_ATC_MODE_DISABLED LITERAL1
MY_RFM95_ATC_TARGET_RSSI_DBM LITERAL1
MY_RFM95_MAX_POWER_LEVEL_DBM LITERAL1
# RFM69
MY_RADIO_RFM69 LITERAL1
@@ -130,6 +133,7 @@ MY_RFM69_NEW_DRIVER LITERAL1
MY_RFM69_TX_POWER_DBM LITERAL1
MY_RFM69_ATC_TARGET_RSSI_DBM LITERAL1
MY_RFM69_ATC_MODE_DISABLED LITERAL1
MY_RFM69_MAX_POWER_LEVEL_DBM LITERAL1
MY_RFM69_NETWORKID LITERAL1
MY_RFM69_RST_PIN LITERAL1
MY_RFM69_IRQ_PIN LITERAL1