mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-25 19:56:30 +00:00
Merge branch 'development' into pre-release
This commit is contained in:
commit
b532430ff8
@ -11,7 +11,7 @@ To enable device groups, execute the command SetOption85 1.
|
|||||||
|
|
||||||
## Device Groups Operation
|
## Device Groups Operation
|
||||||
|
|
||||||
The device group name is the MQTT group topic set with the GroupTopic command. All devices in the same IP network with the same group topic are in the same group. Some modules may define additional device groups. For example, if Remote Device Mode is enabled, the PWM Dimmer module defines three devices groups.
|
The device group name is set with the DevGroupName command. If the device group name is not set for a group, the MQTT group topic is used (with the device group number appended for device group numbers > 1). All devices in the same IP network with the same device group name are in the same group. Some modules may define additional device groups. For example, if Remote Device Mode is enabled, the PWM Dimmer module defines three devices groups.
|
||||||
|
|
||||||
The items that are sent to the group and the items that are received from the group are selected with the DevGroupShare command. By default all items are sent and received from the group. An example of when the DevGroupShare command would be used is when you have a group of lights that you control with a dimmer switch and home automation software. You want the dimmer switch to be able to control all items. The home automation software controls each light individually. When it controls the whole group, it actually sends command to each light in the group. If you use the home automation software to turn an individual light on or off or change it’s brightness, color or scheme, you do not want the change to be replicated to the other lights. In this case, you would set the incoming and outgoing item masks to 0xffffffff (all items) on the dimmer switch (DevGroupShare 0xffffffff,0xffffffff) and set the incoming item mask to 0xffffffff and outgoing item mask to 0 on all the lights (DevGroupShare 0xffffffff,0).
|
The items that are sent to the group and the items that are received from the group are selected with the DevGroupShare command. By default all items are sent and received from the group. An example of when the DevGroupShare command would be used is when you have a group of lights that you control with a dimmer switch and home automation software. You want the dimmer switch to be able to control all items. The home automation software controls each light individually. When it controls the whole group, it actually sends command to each light in the group. If you use the home automation software to turn an individual light on or off or change it’s brightness, color or scheme, you do not want the change to be replicated to the other lights. In this case, you would set the incoming and outgoing item masks to 0xffffffff (all items) on the dimmer switch (DevGroupShare 0xffffffff,0xffffffff) and set the incoming item mask to 0xffffffff and outgoing item mask to 0 on all the lights (DevGroupShare 0xffffffff,0).
|
||||||
|
|
||||||
@ -34,10 +34,10 @@ The items that are sent to the group and the items that are received from the gr
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>GroupTopic<x>
|
<td>DevGroupName<x>
|
||||||
</td>
|
</td>
|
||||||
<td>1 = reset device group <x> MQTT group topic to firmware default (MQTT_GRPTOPIC) and restart<br>
|
<td>0 = clear device group <x> name and restart<br>
|
||||||
<value> = set device group <x> MQTT group topic (32 chars max) and restart
|
<value> = set device group <x>name and restart
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
@ -17,63 +17,81 @@
|
|||||||
|
|
||||||
bool NtpServer::beginListening()
|
bool NtpServer::beginListening()
|
||||||
{
|
{
|
||||||
if (timeServerPort_.begin(NTP_PORT)){
|
if (timeServerPort_.begin(NTP_PORT)){
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NtpServer::processOneRequest(uint32_t utc, uint32_t millisecs)
|
bool NtpServer::processOneRequest(uint32_t utc, uint32_t millisecs)
|
||||||
{
|
{
|
||||||
// We need the time we've received the packet in our response.
|
// millisecs is millis() at the time of the last iTOW reception, where iTOW%1000 == 0
|
||||||
uint32_t recvSecs = utc + NTP_TIMESTAMP_DIFF;
|
uint32_t refMillis = millis()-millisecs;
|
||||||
double recvFractDouble = (double)millisecs/0.00023283064365386963; // millisec/((10^6)/(2^32))
|
if (refMillis>999){
|
||||||
uint32_t recvFract = (double)recvFractDouble; //TODO: really handle this!!!
|
utc++;
|
||||||
bool processed = false;
|
refMillis = refMillis%1000;
|
||||||
|
}
|
||||||
int packetDataSize = timeServerPort_.parsePacket();
|
|
||||||
if (packetDataSize && packetDataSize >= NtpPacket::PACKET_SIZE)
|
|
||||||
{
|
|
||||||
// Received what is probably an NTP packet. Read it in and verify
|
|
||||||
// that it's legit.
|
|
||||||
NtpPacket packet;
|
|
||||||
timeServerPort_.read((char*)&packet, NtpPacket::PACKET_SIZE);
|
|
||||||
// TODO: verify packet.
|
|
||||||
|
|
||||||
// Populate response.
|
bool processed = false;
|
||||||
packet.swapEndian();
|
|
||||||
packet.leapIndicator(0);
|
int packetDataSize = timeServerPort_.parsePacket();
|
||||||
packet.versionNumber(4);
|
if (packetDataSize && packetDataSize >= NtpPacket::PACKET_SIZE)
|
||||||
packet.mode(4);
|
{
|
||||||
packet.stratum = 2; // I guess stratum 1 is too optimistic
|
// We need the time we've received the packet in our response.
|
||||||
packet.poll = 10; // 6-10 per RFC 5905.
|
uint32_t recvSecs = utc + NTP_TIMESTAMP_DIFF;
|
||||||
packet.precision = -21; // ~0.5 microsecond precision.
|
|
||||||
packet.rootDelay = 0; //60 * (0xFFFF / 1000); // ~60 milliseconds, TBD
|
uint64_t recvFract64 = refMillis;
|
||||||
packet.rootDispersion = 0; //10 * (0xFFFF / 1000); // ~10 millisecond dispersion, TBD
|
recvFract64 <<= 32;
|
||||||
packet.referenceId[0] = 'G';
|
recvFract64 /= 1000;
|
||||||
packet.referenceId[1] = 'P';
|
uint32_t recvFract = recvFract64 & 0xffffffff;
|
||||||
packet.referenceId[2] = 'S';
|
// is equal to:
|
||||||
packet.referenceId[3] = 0;
|
// uint32_t recvFract = (double)(refMillis)/0.00000023283064365386963;
|
||||||
packet.referenceTimestampSeconds = utc;
|
|
||||||
packet.referenceTimestampFraction = recvFract;
|
// Received what is probably an NTP packet. Read it in and verify
|
||||||
packet.originTimestampSeconds = packet.transmitTimestampSeconds;
|
// that it's legit.
|
||||||
packet.originTimestampFraction = packet.transmitTimestampFraction;
|
NtpPacket packet;
|
||||||
packet.receiveTimestampSeconds = recvSecs;
|
timeServerPort_.read((char*)&packet, NtpPacket::PACKET_SIZE);
|
||||||
packet.receiveTimestampFraction = recvFract;
|
// TODO: verify packet.
|
||||||
|
|
||||||
// ...and the transmit time.
|
// Populate response.
|
||||||
// timeSource_.now(&packet.transmitTimestampSeconds, &packet.transmitTimestampFraction);
|
packet.swapEndian();
|
||||||
|
packet.leapIndicator(0);
|
||||||
// Now transmit the response to the client.
|
packet.versionNumber(4);
|
||||||
packet.swapEndian();
|
packet.mode(4);
|
||||||
timeServerPort_.beginPacket(timeServerPort_.remoteIP(), timeServerPort_.remotePort());
|
packet.stratum = 1; // >1 will lead to misinterpretation of refId
|
||||||
for (int count = 0; count < NtpPacket::PACKET_SIZE; count++)
|
packet.poll = 10; // 6-10 per RFC 5905.
|
||||||
{
|
packet.precision = -21; // ~0.5 microsecond precision.
|
||||||
timeServerPort_.write(packet.packet()[count]);
|
packet.rootDelay = 100 * (0xFFFF / 1000); //~100 milliseconds
|
||||||
}
|
packet.rootDispersion = 50 * (0xFFFF / 1000);; //~50 millisecond dispersion
|
||||||
timeServerPort_.endPacket();
|
packet.referenceId[0] = 'G';
|
||||||
processed = true;
|
packet.referenceId[1] = 'P';
|
||||||
}
|
packet.referenceId[2] = 'S';
|
||||||
|
packet.referenceId[3] = 0;
|
||||||
return processed;
|
packet.referenceTimestampSeconds = recvSecs;
|
||||||
|
packet.referenceTimestampFraction = 0; // the "click" of the GPS
|
||||||
|
packet.originTimestampSeconds = packet.transmitTimestampSeconds;
|
||||||
|
packet.originTimestampFraction = packet.transmitTimestampFraction;
|
||||||
|
packet.receiveTimestampSeconds = recvSecs;
|
||||||
|
packet.receiveTimestampFraction = recvFract;
|
||||||
|
|
||||||
|
// ...and the transmit time.
|
||||||
|
// the latency has been between 135 and 175 microseconds in internal testing, so we harcode 150
|
||||||
|
uint32_t transFract = recvFract+(150*(10^3)/(2^32)); // microsec/((10^3)/(2^32))
|
||||||
|
if (recvFract>transFract){
|
||||||
|
recvSecs++; //overflow
|
||||||
|
}
|
||||||
|
packet.transmitTimestampSeconds = recvSecs;
|
||||||
|
packet.transmitTimestampFraction = transFract;
|
||||||
|
|
||||||
|
// Now transmit the response to the client.
|
||||||
|
packet.swapEndian();
|
||||||
|
|
||||||
|
timeServerPort_.beginPacket(timeServerPort_.remoteIP(), timeServerPort_.remotePort());
|
||||||
|
timeServerPort_.write(packet.packet(), NtpPacket::PACKET_SIZE);
|
||||||
|
timeServerPort_.endPacket();
|
||||||
|
|
||||||
|
processed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return processed;
|
||||||
}
|
}
|
@ -57,8 +57,7 @@ default_envs =
|
|||||||
framework = arduino
|
framework = arduino
|
||||||
board = esp01_1m
|
board = esp01_1m
|
||||||
board_build.flash_mode = dout
|
board_build.flash_mode = dout
|
||||||
; board_build.ldscript = eagle.flash.1m.ld
|
board_build.ldscript = eagle.flash.1m.ld
|
||||||
board_build.ldscript = ${PROJECTSRC_DIR}/ld/eagle.flash.1m.ld_FP_IN_IROM
|
|
||||||
|
|
||||||
platform = ${core_active.platform}
|
platform = ${core_active.platform}
|
||||||
platform_packages = ${core_active.platform_packages}
|
platform_packages = ${core_active.platform_packages}
|
||||||
@ -92,6 +91,7 @@ extra_scripts = pio/strip-floats.py
|
|||||||
build_flags = -D NDEBUG
|
build_flags = -D NDEBUG
|
||||||
-mtarget-align
|
-mtarget-align
|
||||||
-Wl,-Map,firmware.map
|
-Wl,-Map,firmware.map
|
||||||
|
-DFP_IN_IROM
|
||||||
; new mechanism to set the IRremoteESP8266 supported protocols: none except HASH, NEC, RC5, RC6
|
; new mechanism to set the IRremoteESP8266 supported protocols: none except HASH, NEC, RC5, RC6
|
||||||
-D_IR_ENABLE_DEFAULT_=false
|
-D_IR_ENABLE_DEFAULT_=false
|
||||||
-DDECODE_HASH=true -DDECODE_NEC=true -DSEND_NEC=true
|
-DDECODE_HASH=true -DDECODE_NEC=true -DSEND_NEC=true
|
||||||
|
@ -179,7 +179,7 @@ build_flags = ${esp82xx_defaults.build_flags}
|
|||||||
[tasmota_feature_stage]
|
[tasmota_feature_stage]
|
||||||
; *** Esp8266 core for Arduino version Tasmota feature stage
|
; *** Esp8266 core for Arduino version Tasmota feature stage
|
||||||
platform = espressif8266@2.4.0
|
platform = espressif8266@2.4.0
|
||||||
platform_packages = framework-arduinoespressif8266 @ https://github.com/esp8266/Arduino.git#e64cb619f79a3c888dd56b957d8f48ce74f35735
|
platform_packages = framework-arduinoespressif8266 @ https://github.com/esp8266/Arduino.git#d600cc7fa6c3fc5c31ed903ec12fd2e2da2c3678
|
||||||
build_flags = ${esp82xx_defaults.build_flags}
|
build_flags = ${esp82xx_defaults.build_flags}
|
||||||
-DBEARSSL_SSL_BASIC
|
-DBEARSSL_SSL_BASIC
|
||||||
; NONOSDK221
|
; NONOSDK221
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
- Add command ``SetOption90 1`` to disable non-json MQTT messages (#8044)
|
- Add command ``SetOption90 1`` to disable non-json MQTT messages (#8044)
|
||||||
- Add command ``Sensor10 0/1/2`` to control BH1750 resolution - 0 = High (default), 1 = High2, 2 = Low (#8016)
|
- Add command ``Sensor10 0/1/2`` to control BH1750 resolution - 0 = High (default), 1 = High2, 2 = Low (#8016)
|
||||||
- Add command ``Sensor10 31..254`` to control BH1750 measurement time which defaults to 69 (#8016)
|
- Add command ``Sensor10 31..254`` to control BH1750 measurement time which defaults to 69 (#8016)
|
||||||
|
- Add command ``SetOption91 1`` to enable fading at startup / power on
|
||||||
|
|
||||||
### 8.2.0.2 20200328
|
### 8.2.0.2 20200328
|
||||||
|
|
||||||
|
@ -293,6 +293,7 @@
|
|||||||
#define D_CMND_SPEEDUNIT "SpeedUnit"
|
#define D_CMND_SPEEDUNIT "SpeedUnit"
|
||||||
#define D_CMND_I2CSCAN "I2CScan"
|
#define D_CMND_I2CSCAN "I2CScan"
|
||||||
#define D_CMND_I2CDRIVER "I2CDriver"
|
#define D_CMND_I2CDRIVER "I2CDriver"
|
||||||
|
#define D_CMND_DEVGROUP_NAME "DevGroupName"
|
||||||
#define D_CMND_DEVGROUP_SHARE "DevGroupShare"
|
#define D_CMND_DEVGROUP_SHARE "DevGroupShare"
|
||||||
#define D_CMND_SERIALSEND "SerialSend"
|
#define D_CMND_SERIALSEND "SerialSend"
|
||||||
#define D_CMND_SERIALDELIMITER "SerialDelimiter"
|
#define D_CMND_SERIALDELIMITER "SerialDelimiter"
|
||||||
|
@ -1,336 +0,0 @@
|
|||||||
/* Flash Split for 1M chips */
|
|
||||||
/* sketch @0x40200000 (~999KB) (1023984B) */
|
|
||||||
/* empty @0x402F9FF0 (~4KB) (4112B) */
|
|
||||||
/* spiffs @0x402FB000 (~0KB) (0B) */
|
|
||||||
/* eeprom @0x402FB000 (4KB) */
|
|
||||||
/* rfcal @0x402FC000 (4KB) */
|
|
||||||
/* wifi @0x402FD000 (12KB) */
|
|
||||||
|
|
||||||
MEMORY
|
|
||||||
{
|
|
||||||
dport0_0_seg : org = 0x3FF00000, len = 0x10
|
|
||||||
dram0_0_seg : org = 0x3FFE8000, len = 0x14000
|
|
||||||
iram1_0_seg : org = 0x40100000, len = 0x8000
|
|
||||||
irom0_0_seg : org = 0x40201010, len = 0xf9ff0
|
|
||||||
}
|
|
||||||
|
|
||||||
PROVIDE ( _FS_start = 0x402FB000 );
|
|
||||||
PROVIDE ( _FS_end = 0x402FB000 );
|
|
||||||
PROVIDE ( _FS_page = 0x0 );
|
|
||||||
PROVIDE ( _FS_block = 0x0 );
|
|
||||||
PROVIDE ( _EEPROM_start = 0x402fb000 );
|
|
||||||
/* The following symbols are DEPRECATED and will be REMOVED in a future release */
|
|
||||||
PROVIDE ( _SPIFFS_start = 0x402FB000 );
|
|
||||||
PROVIDE ( _SPIFFS_end = 0x402FB000 );
|
|
||||||
PROVIDE ( _SPIFFS_page = 0x0 );
|
|
||||||
PROVIDE ( _SPIFFS_block = 0x0 );
|
|
||||||
|
|
||||||
/* This linker script generated from xt-genldscripts.tpp for LSP . */
|
|
||||||
/* Linker Script for ld -N */
|
|
||||||
|
|
||||||
PHDRS
|
|
||||||
{
|
|
||||||
dport0_0_phdr PT_LOAD;
|
|
||||||
dram0_0_phdr PT_LOAD;
|
|
||||||
dram0_0_bss_phdr PT_LOAD;
|
|
||||||
iram1_0_phdr PT_LOAD;
|
|
||||||
irom0_0_phdr PT_LOAD;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Default entry point: */
|
|
||||||
ENTRY(app_entry)
|
|
||||||
EXTERN(_DebugExceptionVector)
|
|
||||||
EXTERN(_DoubleExceptionVector)
|
|
||||||
EXTERN(_KernelExceptionVector)
|
|
||||||
EXTERN(_NMIExceptionVector)
|
|
||||||
EXTERN(_UserExceptionVector)
|
|
||||||
EXTERN(core_version)
|
|
||||||
PROVIDE(_memmap_vecbase_reset = 0x40000000);
|
|
||||||
/* Various memory-map dependent cache attribute settings: */
|
|
||||||
_memmap_cacheattr_wb_base = 0x00000110;
|
|
||||||
_memmap_cacheattr_wt_base = 0x00000110;
|
|
||||||
_memmap_cacheattr_bp_base = 0x00000220;
|
|
||||||
_memmap_cacheattr_unused_mask = 0xFFFFF00F;
|
|
||||||
_memmap_cacheattr_wb_trapnull = 0x2222211F;
|
|
||||||
_memmap_cacheattr_wba_trapnull = 0x2222211F;
|
|
||||||
_memmap_cacheattr_wbna_trapnull = 0x2222211F;
|
|
||||||
_memmap_cacheattr_wt_trapnull = 0x2222211F;
|
|
||||||
_memmap_cacheattr_bp_trapnull = 0x2222222F;
|
|
||||||
_memmap_cacheattr_wb_strict = 0xFFFFF11F;
|
|
||||||
_memmap_cacheattr_wt_strict = 0xFFFFF11F;
|
|
||||||
_memmap_cacheattr_bp_strict = 0xFFFFF22F;
|
|
||||||
_memmap_cacheattr_wb_allvalid = 0x22222112;
|
|
||||||
_memmap_cacheattr_wt_allvalid = 0x22222112;
|
|
||||||
_memmap_cacheattr_bp_allvalid = 0x22222222;
|
|
||||||
PROVIDE(_memmap_cacheattr_reset = _memmap_cacheattr_wb_trapnull);
|
|
||||||
|
|
||||||
SECTIONS
|
|
||||||
{
|
|
||||||
|
|
||||||
.dport0.rodata : ALIGN(4)
|
|
||||||
{
|
|
||||||
_dport0_rodata_start = ABSOLUTE(.);
|
|
||||||
*(.dport0.rodata)
|
|
||||||
*(.dport.rodata)
|
|
||||||
_dport0_rodata_end = ABSOLUTE(.);
|
|
||||||
} >dport0_0_seg :dport0_0_phdr
|
|
||||||
|
|
||||||
.dport0.literal : ALIGN(4)
|
|
||||||
{
|
|
||||||
_dport0_literal_start = ABSOLUTE(.);
|
|
||||||
*(.dport0.literal)
|
|
||||||
*(.dport.literal)
|
|
||||||
_dport0_literal_end = ABSOLUTE(.);
|
|
||||||
} >dport0_0_seg :dport0_0_phdr
|
|
||||||
|
|
||||||
.dport0.data : ALIGN(4)
|
|
||||||
{
|
|
||||||
_dport0_data_start = ABSOLUTE(.);
|
|
||||||
*(.dport0.data)
|
|
||||||
*(.dport.data)
|
|
||||||
_dport0_data_end = ABSOLUTE(.);
|
|
||||||
} >dport0_0_seg :dport0_0_phdr
|
|
||||||
|
|
||||||
.data : ALIGN(4)
|
|
||||||
{
|
|
||||||
_data_start = ABSOLUTE(.);
|
|
||||||
*(.data)
|
|
||||||
*(.data.*)
|
|
||||||
*(.gnu.linkonce.d.*)
|
|
||||||
*(.data1)
|
|
||||||
*(.sdata)
|
|
||||||
*(.sdata.*)
|
|
||||||
*(.gnu.linkonce.s.*)
|
|
||||||
*(.sdata2)
|
|
||||||
*(.sdata2.*)
|
|
||||||
*(.gnu.linkonce.s2.*)
|
|
||||||
*(.jcr)
|
|
||||||
. = ALIGN(4);
|
|
||||||
_Pri_3_HandlerAddress = ABSOLUTE(.);
|
|
||||||
_data_end = ABSOLUTE(.);
|
|
||||||
} >dram0_0_seg :dram0_0_phdr
|
|
||||||
|
|
||||||
.noinit : ALIGN(4)
|
|
||||||
{
|
|
||||||
*(.noinit)
|
|
||||||
} >dram0_0_seg :dram0_0_phdr
|
|
||||||
|
|
||||||
/* IRAM is split into .text and .text1 to allow for moving specific */
|
|
||||||
/* functions into IRAM that would be matched by the irom0.text matcher */
|
|
||||||
.text : ALIGN(4)
|
|
||||||
{
|
|
||||||
_stext = .;
|
|
||||||
_text_start = ABSOLUTE(.);
|
|
||||||
*(.UserEnter.text)
|
|
||||||
. = ALIGN(16);
|
|
||||||
*(.DebugExceptionVector.text)
|
|
||||||
. = ALIGN(16);
|
|
||||||
*(.NMIExceptionVector.text)
|
|
||||||
. = ALIGN(16);
|
|
||||||
*(.KernelExceptionVector.text)
|
|
||||||
LONG(0)
|
|
||||||
LONG(0)
|
|
||||||
LONG(0)
|
|
||||||
LONG(0)
|
|
||||||
. = ALIGN(16);
|
|
||||||
*(.UserExceptionVector.text)
|
|
||||||
LONG(0)
|
|
||||||
LONG(0)
|
|
||||||
LONG(0)
|
|
||||||
LONG(0)
|
|
||||||
. = ALIGN(16);
|
|
||||||
*(.DoubleExceptionVector.text)
|
|
||||||
LONG(0)
|
|
||||||
LONG(0)
|
|
||||||
LONG(0)
|
|
||||||
LONG(0)
|
|
||||||
. = ALIGN (16);
|
|
||||||
*(.entry.text)
|
|
||||||
*(.init.literal)
|
|
||||||
*(.init)
|
|
||||||
|
|
||||||
*(.text.app_entry*) /* The main startup code */
|
|
||||||
|
|
||||||
*(.text.gdbstub*, .text.gdb_init) /* Any GDB hooks */
|
|
||||||
|
|
||||||
/* all functional callers are placed in IRAM (including SPI/IRQ callbacks/etc) here */
|
|
||||||
*(.text._ZNKSt8functionIF*EE*) /* std::function<any(...)>::operator()() const */
|
|
||||||
} >iram1_0_seg :iram1_0_phdr
|
|
||||||
|
|
||||||
.irom0.text : ALIGN(4)
|
|
||||||
{
|
|
||||||
_irom0_text_start = ABSOLUTE(.);
|
|
||||||
*(.ver_number)
|
|
||||||
*.c.o(.literal*, .text*)
|
|
||||||
*.cpp.o(EXCLUDE_FILE (umm_malloc.cpp.o) .literal*, EXCLUDE_FILE (umm_malloc.cpp.o) .text*)
|
|
||||||
*.cc.o(.literal*, .text*)
|
|
||||||
/* #ifdef VTABLES_IN_FLASH */
|
|
||||||
*(.rodata._ZTV*) /* C++ vtables */
|
|
||||||
/* #endif */
|
|
||||||
|
|
||||||
*libgcc.a:unwind-dw2.o(.literal .text .rodata .literal.* .text.* .rodata.*)
|
|
||||||
*libgcc.a:unwind-dw2-fde.o(.literal .text .rodata .literal.* .text.* .rodata.*)
|
|
||||||
|
|
||||||
*libc.a:(.literal .text .literal.* .text.*)
|
|
||||||
*libm.a:(.literal .text .literal.* .text.*)
|
|
||||||
/* #ifdef FP_IN_IROM */
|
|
||||||
*libgcc.a:*f2.o(.literal .text)
|
|
||||||
*libgcc.a:*f3.o(.literal .text)
|
|
||||||
*libgcc.a:*fsi.o(.literal .text)
|
|
||||||
*libgcc.a:*fdi.o(.literal .text)
|
|
||||||
*libgcc.a:*ifs.o(.literal .text)
|
|
||||||
*libgcc.a:*idf.o(.literal .text)
|
|
||||||
/* #endif */
|
|
||||||
*libgcc.a:_umoddi3.o(.literal .text)
|
|
||||||
*libgcc.a:_udivdi3.o(.literal .text)
|
|
||||||
*libstdc++.a:( .literal .text .literal.* .text.*)
|
|
||||||
*libstdc++-exc.a:( .literal .text .literal.* .text.*)
|
|
||||||
*libsmartconfig.a:(.literal .text .literal.* .text.*)
|
|
||||||
*liblwip_gcc.a:(.literal .text .literal.* .text.*)
|
|
||||||
*liblwip_src.a:(.literal .text .literal.* .text.*)
|
|
||||||
*liblwip2-536.a:(.literal .text .literal.* .text.*)
|
|
||||||
*liblwip2-1460.a:(.literal .text .literal.* .text.*)
|
|
||||||
*liblwip2-536-feat.a:(.literal .text .literal.* .text.*)
|
|
||||||
*liblwip2-1460-feat.a:(.literal .text .literal.* .text.*)
|
|
||||||
*liblwip6-536-feat.a:(.literal .text .literal.* .text.*)
|
|
||||||
*liblwip6-1460-feat.a:(.literal .text .literal.* .text.*)
|
|
||||||
*libbearssl.a:(.literal .text .literal.* .text.*)
|
|
||||||
*libaxtls.a:(.literal .text .literal.* .text.*)
|
|
||||||
*libat.a:(.literal.* .text.*)
|
|
||||||
*libcrypto.a:(.literal.* .text.*)
|
|
||||||
*libespnow.a:(.literal.* .text.*)
|
|
||||||
*libjson.a:(.literal.* .text.*)
|
|
||||||
*liblwip.a:(.literal.* .text.*)
|
|
||||||
*libmesh.a:(.literal.* .text.*)
|
|
||||||
*libnet80211.a:(.literal.* .text.*)
|
|
||||||
*libsmartconfig.a:(.literal.* .text.*)
|
|
||||||
*libssl.a:(.literal.* .text.*)
|
|
||||||
*libupgrade.a:(.literal.* .text.*)
|
|
||||||
*libwpa.a:(.literal.* .text.*)
|
|
||||||
*libwpa2.a:(.literal.* .text.*)
|
|
||||||
*libwps.a:(.literal.* .text.*)
|
|
||||||
*(.irom0.literal .irom.literal .irom.text.literal .irom0.text .irom0.text.* .irom.text .irom.text.*)
|
|
||||||
|
|
||||||
/* Constant strings in flash (PSTRs) */
|
|
||||||
*(.irom0.pstr.*)
|
|
||||||
|
|
||||||
/* __FUNCTION__ locals */
|
|
||||||
*(.rodata._ZZ*__FUNCTION__)
|
|
||||||
*(.rodata._ZZ*__PRETTY_FUNCTION__)
|
|
||||||
*(.rodata._ZZ*__func__)
|
|
||||||
|
|
||||||
/* std::* exception strings, in their own section to allow string coalescing */
|
|
||||||
*(.irom.exceptiontext)
|
|
||||||
|
|
||||||
/* c++ typeof IDs, etc. */
|
|
||||||
*(.rodata._ZTIN* .rodata._ZTSN10* .rodata._ZTISt* .rodata._ZTSSt*)
|
|
||||||
|
|
||||||
/* Fundamental type info */
|
|
||||||
*(.rodata._ZTIPKc .rodata._ZTIc .rodata._ZTIv .rodata._ZTSv .rodata._ZTSc .rodata._ZTSPKc .rodata._ZTSi .rodata._ZTIi)
|
|
||||||
|
|
||||||
. = ALIGN(4);
|
|
||||||
*(.gcc_except_table .gcc_except_table.*)
|
|
||||||
. = ALIGN(4);
|
|
||||||
__eh_frame = ABSOLUTE(.);
|
|
||||||
KEEP(*(.eh_frame))
|
|
||||||
. = (. + 7) & ~ 3; /* Add a 0 entry to terminate the list */
|
|
||||||
|
|
||||||
_irom0_text_end = ABSOLUTE(.);
|
|
||||||
_flash_code_end = ABSOLUTE(.);
|
|
||||||
} >irom0_0_seg :irom0_0_phdr
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.text1 : ALIGN(4)
|
|
||||||
{
|
|
||||||
*(.literal .text .iram.literal .iram.text .iram.text.* .literal.* .text.* .stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*)
|
|
||||||
|
|
||||||
*(.fini.literal)
|
|
||||||
*(.fini)
|
|
||||||
*(.gnu.version)
|
|
||||||
_text_end = ABSOLUTE(.);
|
|
||||||
_etext = .;
|
|
||||||
} >iram1_0_seg :iram1_0_phdr
|
|
||||||
|
|
||||||
.rodata : ALIGN(4)
|
|
||||||
{
|
|
||||||
_rodata_start = ABSOLUTE(.);
|
|
||||||
*(.sdk.version)
|
|
||||||
*(.rodata)
|
|
||||||
*(.rodata.*)
|
|
||||||
*(.gnu.linkonce.r.*)
|
|
||||||
*(.rodata1)
|
|
||||||
__XT_EXCEPTION_TABLE__ = ABSOLUTE(.);
|
|
||||||
*(.xt_except_table)
|
|
||||||
*(.gcc_except_table)
|
|
||||||
*(.gnu.linkonce.e.*)
|
|
||||||
*(.gnu.version_r)
|
|
||||||
*(.eh_frame)
|
|
||||||
. = (. + 3) & ~ 3;
|
|
||||||
/* C++ constructor and destructor tables, properly ordered: */
|
|
||||||
__init_array_start = ABSOLUTE(.);
|
|
||||||
KEEP (*crtbegin.o(.ctors))
|
|
||||||
KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
|
|
||||||
KEEP (*(SORT(.ctors.*)))
|
|
||||||
KEEP (*(.ctors))
|
|
||||||
__init_array_end = ABSOLUTE(.);
|
|
||||||
KEEP (*crtbegin.o(.dtors))
|
|
||||||
KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
|
|
||||||
KEEP (*(SORT(.dtors.*)))
|
|
||||||
KEEP (*(.dtors))
|
|
||||||
/* C++ exception handlers table: */
|
|
||||||
__XT_EXCEPTION_DESCS__ = ABSOLUTE(.);
|
|
||||||
*(.xt_except_desc)
|
|
||||||
*(.gnu.linkonce.h.*)
|
|
||||||
__XT_EXCEPTION_DESCS_END__ = ABSOLUTE(.);
|
|
||||||
*(.xt_except_desc_end)
|
|
||||||
*(.dynamic)
|
|
||||||
*(.gnu.version_d)
|
|
||||||
. = ALIGN(4); /* this table MUST be 4-byte aligned */
|
|
||||||
_bss_table_start = ABSOLUTE(.);
|
|
||||||
LONG(_bss_start)
|
|
||||||
LONG(_bss_end)
|
|
||||||
_bss_table_end = ABSOLUTE(.);
|
|
||||||
_rodata_end = ABSOLUTE(.);
|
|
||||||
} >dram0_0_seg :dram0_0_phdr
|
|
||||||
|
|
||||||
.bss ALIGN(8) (NOLOAD) : ALIGN(4)
|
|
||||||
{
|
|
||||||
. = ALIGN (8);
|
|
||||||
_bss_start = ABSOLUTE(.);
|
|
||||||
*(.dynsbss)
|
|
||||||
*(.sbss)
|
|
||||||
*(.sbss.*)
|
|
||||||
*(.gnu.linkonce.sb.*)
|
|
||||||
*(.scommon)
|
|
||||||
*(.sbss2)
|
|
||||||
*(.sbss2.*)
|
|
||||||
*(.gnu.linkonce.sb2.*)
|
|
||||||
*(.dynbss)
|
|
||||||
*(.bss)
|
|
||||||
*(.bss.*)
|
|
||||||
*(.gnu.linkonce.b.*)
|
|
||||||
*(COMMON)
|
|
||||||
. = ALIGN (8);
|
|
||||||
_bss_end = ABSOLUTE(.);
|
|
||||||
_heap_start = ABSOLUTE(.);
|
|
||||||
/* _stack_sentry = ALIGN(0x8); */
|
|
||||||
} >dram0_0_seg :dram0_0_bss_phdr
|
|
||||||
/* __stack = 0x3ffc8000; */
|
|
||||||
|
|
||||||
|
|
||||||
.lit4 : ALIGN(4)
|
|
||||||
{
|
|
||||||
_lit4_start = ABSOLUTE(.);
|
|
||||||
*(*.lit4)
|
|
||||||
*(.lit4.*)
|
|
||||||
*(.gnu.linkonce.lit4.*)
|
|
||||||
_lit4_end = ABSOLUTE(.);
|
|
||||||
} >iram1_0_seg :iram1_0_phdr
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get ROM code address */
|
|
||||||
INCLUDE "../ld/eagle.rom.addr.v6.ld"
|
|
@ -1,352 +0,0 @@
|
|||||||
PROVIDE ( Cache_Read_Disable = 0x400047f0 );
|
|
||||||
PROVIDE ( Cache_Read_Enable = 0x40004678 );
|
|
||||||
PROVIDE ( FilePacketSendReqMsgProc = 0x400035a0 );
|
|
||||||
PROVIDE ( FlashDwnLdParamCfgMsgProc = 0x4000368c );
|
|
||||||
PROVIDE ( FlashDwnLdStartMsgProc = 0x40003538 );
|
|
||||||
PROVIDE ( FlashDwnLdStopReqMsgProc = 0x40003658 );
|
|
||||||
PROVIDE ( GetUartDevice = 0x40003f4c );
|
|
||||||
PROVIDE ( MD5Final = 0x40009900 );
|
|
||||||
PROVIDE ( MD5Init = 0x40009818 );
|
|
||||||
PROVIDE ( MD5Update = 0x40009834 );
|
|
||||||
PROVIDE ( MemDwnLdStartMsgProc = 0x400036c4 );
|
|
||||||
PROVIDE ( MemDwnLdStopReqMsgProc = 0x4000377c );
|
|
||||||
PROVIDE ( MemPacketSendReqMsgProc = 0x400036f0 );
|
|
||||||
PROVIDE ( RcvMsg = 0x40003eac );
|
|
||||||
PROVIDE ( SHA1Final = 0x4000b648 );
|
|
||||||
PROVIDE ( SHA1Init = 0x4000b584 );
|
|
||||||
PROVIDE ( SHA1Transform = 0x4000a364 );
|
|
||||||
PROVIDE ( SHA1Update = 0x4000b5a8 );
|
|
||||||
PROVIDE ( SPI_read_status = 0x400043c8 );
|
|
||||||
PROVIDE ( SPI_write_status = 0x40004400 );
|
|
||||||
PROVIDE ( SPI_write_enable = 0x4000443c );
|
|
||||||
PROVIDE ( Wait_SPI_Idle = 0x4000448c );
|
|
||||||
PROVIDE ( Enable_QMode = 0x400044c0 );
|
|
||||||
PROVIDE ( SPIEraseArea = 0x40004b44 );
|
|
||||||
PROVIDE ( SPIEraseBlock = 0x400049b4 );
|
|
||||||
PROVIDE ( SPIEraseChip = 0x40004984 );
|
|
||||||
PROVIDE ( SPIEraseSector = 0x40004a00 );
|
|
||||||
PROVIDE ( SPILock = 0x400048a8 );
|
|
||||||
PROVIDE ( SPIParamCfg = 0x40004c2c );
|
|
||||||
PROVIDE ( SPIRead = 0x40004b1c );
|
|
||||||
PROVIDE ( SPIReadModeCnfig = 0x400048ec );
|
|
||||||
PROVIDE ( SPIUnlock = 0x40004878 );
|
|
||||||
PROVIDE ( SPIWrite = 0x40004a4c );
|
|
||||||
PROVIDE ( SelectSpiFunction = 0x40003f58 );
|
|
||||||
PROVIDE ( SendMsg = 0x40003cf4 );
|
|
||||||
PROVIDE ( UartConnCheck = 0x40003230 );
|
|
||||||
PROVIDE ( UartConnectProc = 0x400037a0 );
|
|
||||||
PROVIDE ( UartDwnLdProc = 0x40003368 );
|
|
||||||
PROVIDE ( UartGetCmdLn = 0x40003ef4 );
|
|
||||||
PROVIDE ( UartRegReadProc = 0x4000381c );
|
|
||||||
PROVIDE ( UartRegWriteProc = 0x400037ac );
|
|
||||||
PROVIDE ( UartRxString = 0x40003c30 );
|
|
||||||
PROVIDE ( Uart_Init = 0x40003a14 );
|
|
||||||
PROVIDE ( _ResetHandler = 0x400000a4 );
|
|
||||||
PROVIDE ( _ResetVector = 0x40000080 );
|
|
||||||
PROVIDE ( __adddf3 = 0x4000c538 );
|
|
||||||
PROVIDE ( __addsf3 = 0x4000c180 );
|
|
||||||
PROVIDE ( __divdf3 = 0x4000cb94 );
|
|
||||||
PROVIDE ( __divdi3 = 0x4000ce60 );
|
|
||||||
PROVIDE ( __divsi3 = 0x4000dc88 );
|
|
||||||
PROVIDE ( __extendsfdf2 = 0x4000cdfc );
|
|
||||||
PROVIDE ( __fixdfsi = 0x4000ccb8 );
|
|
||||||
PROVIDE ( __fixunsdfsi = 0x4000cd00 );
|
|
||||||
PROVIDE ( __fixunssfsi = 0x4000c4c4 );
|
|
||||||
PROVIDE ( __floatsidf = 0x4000e2f0 );
|
|
||||||
PROVIDE ( __floatsisf = 0x4000e2ac );
|
|
||||||
PROVIDE ( __floatunsidf = 0x4000e2e8 );
|
|
||||||
PROVIDE ( __floatunsisf = 0x4000e2a4 );
|
|
||||||
PROVIDE ( __muldf3 = 0x4000c8f0 );
|
|
||||||
PROVIDE ( __muldi3 = 0x40000650 );
|
|
||||||
PROVIDE ( __mulsf3 = 0x4000c3dc );
|
|
||||||
PROVIDE ( __subdf3 = 0x4000c688 );
|
|
||||||
PROVIDE ( __subsf3 = 0x4000c268 );
|
|
||||||
PROVIDE ( __truncdfsf2 = 0x4000cd5c );
|
|
||||||
PROVIDE ( __udivdi3 = 0x4000d310 );
|
|
||||||
PROVIDE ( __udivsi3 = 0x4000e21c );
|
|
||||||
PROVIDE ( __umoddi3 = 0x4000d770 );
|
|
||||||
PROVIDE ( __umodsi3 = 0x4000e268 );
|
|
||||||
PROVIDE ( __umulsidi3 = 0x4000dcf0 );
|
|
||||||
PROVIDE ( _rom_store = 0x4000e388 );
|
|
||||||
PROVIDE ( _rom_store_table = 0x4000e328 );
|
|
||||||
PROVIDE ( _start = 0x4000042c );
|
|
||||||
PROVIDE ( _xtos_alloca_handler = 0x4000dbe0 );
|
|
||||||
PROVIDE ( _xtos_c_wrapper_handler = 0x40000598 );
|
|
||||||
PROVIDE ( _xtos_cause3_handler = 0x40000590 );
|
|
||||||
PROVIDE ( _xtos_ints_off = 0x4000bda4 );
|
|
||||||
PROVIDE ( _xtos_ints_on = 0x4000bd84 );
|
|
||||||
PROVIDE ( _xtos_l1int_handler = 0x4000048c );
|
|
||||||
PROVIDE ( _xtos_p_none = 0x4000dbf8 );
|
|
||||||
PROVIDE ( _xtos_restore_intlevel = 0x4000056c );
|
|
||||||
PROVIDE ( _xtos_return_from_exc = 0x4000dc54 );
|
|
||||||
PROVIDE ( _xtos_set_exception_handler = 0x40000454 );
|
|
||||||
PROVIDE ( _xtos_set_interrupt_handler = 0x4000bd70 );
|
|
||||||
PROVIDE ( _xtos_set_interrupt_handler_arg = 0x4000bd28 );
|
|
||||||
PROVIDE ( _xtos_set_intlevel = 0x4000dbfc );
|
|
||||||
PROVIDE ( _xtos_set_min_intlevel = 0x4000dc18 );
|
|
||||||
PROVIDE ( _xtos_set_vpri = 0x40000574 );
|
|
||||||
PROVIDE ( _xtos_syscall_handler = 0x4000dbe4 );
|
|
||||||
PROVIDE ( _xtos_unhandled_exception = 0x4000dc44 );
|
|
||||||
PROVIDE ( _xtos_unhandled_interrupt = 0x4000dc3c );
|
|
||||||
PROVIDE ( aes_decrypt = 0x400092d4 );
|
|
||||||
PROVIDE ( aes_decrypt_deinit = 0x400092e4 );
|
|
||||||
PROVIDE ( aes_decrypt_init = 0x40008ea4 );
|
|
||||||
PROVIDE ( aes_unwrap = 0x40009410 );
|
|
||||||
PROVIDE ( base64_decode = 0x40009648 );
|
|
||||||
PROVIDE ( base64_encode = 0x400094fc );
|
|
||||||
PROVIDE ( bzero = 0x4000de84 );
|
|
||||||
PROVIDE ( cmd_parse = 0x40000814 );
|
|
||||||
PROVIDE ( conv_str_decimal = 0x40000b24 );
|
|
||||||
PROVIDE ( conv_str_hex = 0x40000cb8 );
|
|
||||||
PROVIDE ( convert_para_str = 0x40000a60 );
|
|
||||||
PROVIDE ( dtm_get_intr_mask = 0x400026d0 );
|
|
||||||
PROVIDE ( dtm_params_init = 0x4000269c );
|
|
||||||
PROVIDE ( dtm_set_intr_mask = 0x400026c8 );
|
|
||||||
PROVIDE ( dtm_set_params = 0x400026dc );
|
|
||||||
PROVIDE ( eprintf = 0x40001d14 );
|
|
||||||
PROVIDE ( eprintf_init_buf = 0x40001cb8 );
|
|
||||||
PROVIDE ( eprintf_to_host = 0x40001d48 );
|
|
||||||
PROVIDE ( est_get_printf_buf_remain_len = 0x40002494 );
|
|
||||||
PROVIDE ( est_reset_printf_buf_len = 0x4000249c );
|
|
||||||
PROVIDE ( ets_bzero = 0x40002ae8 );
|
|
||||||
PROVIDE ( ets_char2xdigit = 0x40002b74 );
|
|
||||||
PROVIDE ( ets_delay_us = 0x40002ecc );
|
|
||||||
PROVIDE ( ets_enter_sleep = 0x400027b8 );
|
|
||||||
PROVIDE ( ets_external_printf = 0x40002578 );
|
|
||||||
PROVIDE ( ets_get_cpu_frequency = 0x40002f0c );
|
|
||||||
PROVIDE ( ets_getc = 0x40002bcc );
|
|
||||||
PROVIDE ( ets_install_external_printf = 0x40002450 );
|
|
||||||
PROVIDE ( ets_install_putc1 = 0x4000242c );
|
|
||||||
PROVIDE ( ets_install_putc2 = 0x4000248c );
|
|
||||||
PROVIDE ( ets_install_uart_printf = 0x40002438 );
|
|
||||||
/* Undocumented function to print character to UART */
|
|
||||||
PROVIDE ( ets_uart_putc1 = 0x40001dcc );
|
|
||||||
/* permanently hide reimplemented ets_intr_*lock(), see #6484
|
|
||||||
PROVIDE ( ets_intr_lock = 0x40000f74 );
|
|
||||||
PROVIDE ( ets_intr_unlock = 0x40000f80 );
|
|
||||||
*/
|
|
||||||
PROVIDE ( ets_isr_attach = 0x40000f88 );
|
|
||||||
PROVIDE ( ets_isr_mask = 0x40000f98 );
|
|
||||||
PROVIDE ( ets_isr_unmask = 0x40000fa8 );
|
|
||||||
PROVIDE ( ets_memcmp = 0x400018d4 );
|
|
||||||
PROVIDE ( ets_memcpy = 0x400018b4 );
|
|
||||||
PROVIDE ( ets_memmove = 0x400018c4 );
|
|
||||||
PROVIDE ( ets_memset = 0x400018a4 );
|
|
||||||
/* renamed to ets_post_rom(), see #6484
|
|
||||||
PROVIDE ( ets_post = 0x40000e24 );
|
|
||||||
*/
|
|
||||||
PROVIDE ( ets_post_rom = 0x40000e24 );
|
|
||||||
PROVIDE ( ets_printf = 0x400024cc );
|
|
||||||
PROVIDE ( ets_putc = 0x40002be8 );
|
|
||||||
PROVIDE ( ets_rtc_int_register = 0x40002a40 );
|
|
||||||
PROVIDE ( ets_run = 0x40000e04 );
|
|
||||||
PROVIDE ( ets_set_idle_cb = 0x40000dc0 );
|
|
||||||
PROVIDE ( ets_set_user_start = 0x40000fbc );
|
|
||||||
PROVIDE ( ets_str2macaddr = 0x40002af8 );
|
|
||||||
PROVIDE ( ets_strcmp = 0x40002aa8 );
|
|
||||||
PROVIDE ( ets_strcpy = 0x40002a88 );
|
|
||||||
PROVIDE ( ets_strlen = 0x40002ac8 );
|
|
||||||
PROVIDE ( ets_strncmp = 0x40002ab8 );
|
|
||||||
PROVIDE ( ets_strncpy = 0x40002a98 );
|
|
||||||
PROVIDE ( ets_strstr = 0x40002ad8 );
|
|
||||||
PROVIDE ( ets_task = 0x40000dd0 );
|
|
||||||
PROVIDE ( ets_timer_arm = 0x40002cc4 );
|
|
||||||
PROVIDE ( ets_timer_disarm = 0x40002d40 );
|
|
||||||
PROVIDE ( ets_timer_done = 0x40002d80 );
|
|
||||||
PROVIDE ( ets_timer_handler_isr = 0x40002da8 );
|
|
||||||
PROVIDE ( ets_timer_init = 0x40002e68 );
|
|
||||||
PROVIDE ( ets_timer_setfn = 0x40002c48 );
|
|
||||||
PROVIDE ( ets_uart_printf = 0x40002544 );
|
|
||||||
PROVIDE ( ets_update_cpu_frequency = 0x40002f04 );
|
|
||||||
PROVIDE ( ets_vprintf = 0x40001f00 );
|
|
||||||
PROVIDE ( ets_wdt_disable = 0x400030f0 );
|
|
||||||
PROVIDE ( ets_wdt_enable = 0x40002fa0 );
|
|
||||||
PROVIDE ( ets_wdt_get_mode = 0x40002f34 );
|
|
||||||
PROVIDE ( ets_wdt_init = 0x40003170 );
|
|
||||||
PROVIDE ( ets_wdt_restore = 0x40003158 );
|
|
||||||
PROVIDE ( ets_write_char = 0x40001da0 );
|
|
||||||
PROVIDE ( get_first_seg = 0x4000091c );
|
|
||||||
PROVIDE ( gpio_init = 0x40004c50 );
|
|
||||||
PROVIDE ( gpio_input_get = 0x40004cf0 );
|
|
||||||
PROVIDE ( gpio_intr_ack = 0x40004dcc );
|
|
||||||
PROVIDE ( gpio_intr_handler_register = 0x40004e28 );
|
|
||||||
PROVIDE ( gpio_intr_pending = 0x40004d88 );
|
|
||||||
PROVIDE ( gpio_intr_test = 0x40004efc );
|
|
||||||
PROVIDE ( gpio_output_set = 0x40004cd0 );
|
|
||||||
PROVIDE ( gpio_pin_intr_state_set = 0x40004d90 );
|
|
||||||
PROVIDE ( gpio_pin_wakeup_disable = 0x40004ed4 );
|
|
||||||
PROVIDE ( gpio_pin_wakeup_enable = 0x40004e90 );
|
|
||||||
PROVIDE ( gpio_register_get = 0x40004d5c );
|
|
||||||
PROVIDE ( gpio_register_set = 0x40004d04 );
|
|
||||||
PROVIDE ( hmac_md5 = 0x4000a2cc );
|
|
||||||
PROVIDE ( hmac_md5_vector = 0x4000a160 );
|
|
||||||
PROVIDE ( hmac_sha1 = 0x4000ba28 );
|
|
||||||
PROVIDE ( hmac_sha1_vector = 0x4000b8b4 );
|
|
||||||
PROVIDE ( lldesc_build_chain = 0x40004f40 );
|
|
||||||
PROVIDE ( lldesc_num2link = 0x40005050 );
|
|
||||||
PROVIDE ( lldesc_set_owner = 0x4000507c );
|
|
||||||
PROVIDE ( main = 0x40000fec );
|
|
||||||
PROVIDE ( md5_vector = 0x400097ac );
|
|
||||||
PROVIDE ( mem_calloc = 0x40001c2c );
|
|
||||||
PROVIDE ( mem_free = 0x400019e0 );
|
|
||||||
PROVIDE ( mem_init = 0x40001998 );
|
|
||||||
PROVIDE ( mem_malloc = 0x40001b40 );
|
|
||||||
PROVIDE ( mem_realloc = 0x40001c6c );
|
|
||||||
PROVIDE ( mem_trim = 0x40001a14 );
|
|
||||||
PROVIDE ( mem_zalloc = 0x40001c58 );
|
|
||||||
PROVIDE ( memcmp = 0x4000dea8 );
|
|
||||||
PROVIDE ( memcpy = 0x4000df48 );
|
|
||||||
PROVIDE ( memmove = 0x4000e04c );
|
|
||||||
PROVIDE ( memset = 0x4000e190 );
|
|
||||||
PROVIDE ( multofup = 0x400031c0 );
|
|
||||||
PROVIDE ( pbkdf2_sha1 = 0x4000b840 );
|
|
||||||
PROVIDE ( phy_get_romfuncs = 0x40006b08 );
|
|
||||||
PROVIDE ( rand = 0x40000600 );
|
|
||||||
PROVIDE ( rc4_skip = 0x4000dd68 );
|
|
||||||
PROVIDE ( recv_packet = 0x40003d08 );
|
|
||||||
PROVIDE ( remove_head_space = 0x40000a04 );
|
|
||||||
PROVIDE ( rijndaelKeySetupDec = 0x40008dd0 );
|
|
||||||
PROVIDE ( rijndaelKeySetupEnc = 0x40009300 );
|
|
||||||
PROVIDE ( rom_abs_temp = 0x400060c0 );
|
|
||||||
PROVIDE ( rom_ana_inf_gating_en = 0x40006b10 );
|
|
||||||
PROVIDE ( rom_cal_tos_v50 = 0x40007a28 );
|
|
||||||
PROVIDE ( rom_chip_50_set_channel = 0x40006f84 );
|
|
||||||
PROVIDE ( rom_chip_v5_disable_cca = 0x400060d0 );
|
|
||||||
PROVIDE ( rom_chip_v5_enable_cca = 0x400060ec );
|
|
||||||
PROVIDE ( rom_chip_v5_rx_init = 0x4000711c );
|
|
||||||
PROVIDE ( rom_chip_v5_sense_backoff = 0x4000610c );
|
|
||||||
PROVIDE ( rom_chip_v5_tx_init = 0x4000718c );
|
|
||||||
PROVIDE ( rom_dc_iq_est = 0x4000615c );
|
|
||||||
PROVIDE ( rom_en_pwdet = 0x400061b8 );
|
|
||||||
PROVIDE ( rom_get_bb_atten = 0x40006238 );
|
|
||||||
PROVIDE ( rom_get_corr_power = 0x40006260 );
|
|
||||||
PROVIDE ( rom_get_fm_sar_dout = 0x400062dc );
|
|
||||||
PROVIDE ( rom_get_noisefloor = 0x40006394 );
|
|
||||||
PROVIDE ( rom_get_power_db = 0x400063b0 );
|
|
||||||
PROVIDE ( rom_i2c_readReg = 0x40007268 );
|
|
||||||
PROVIDE ( rom_i2c_readReg_Mask = 0x4000729c );
|
|
||||||
PROVIDE ( rom_i2c_writeReg = 0x400072d8 );
|
|
||||||
PROVIDE ( rom_i2c_writeReg_Mask = 0x4000730c );
|
|
||||||
PROVIDE ( rom_iq_est_disable = 0x40006400 );
|
|
||||||
PROVIDE ( rom_iq_est_enable = 0x40006430 );
|
|
||||||
PROVIDE ( rom_linear_to_db = 0x40006484 );
|
|
||||||
PROVIDE ( rom_mhz2ieee = 0x400065a4 );
|
|
||||||
PROVIDE ( rom_pbus_dco___SA2 = 0x40007bf0 );
|
|
||||||
PROVIDE ( rom_pbus_debugmode = 0x4000737c );
|
|
||||||
PROVIDE ( rom_pbus_enter_debugmode = 0x40007410 );
|
|
||||||
PROVIDE ( rom_pbus_exit_debugmode = 0x40007448 );
|
|
||||||
PROVIDE ( rom_pbus_force_test = 0x4000747c );
|
|
||||||
PROVIDE ( rom_pbus_rd = 0x400074d8 );
|
|
||||||
PROVIDE ( rom_pbus_set_rxgain = 0x4000754c );
|
|
||||||
PROVIDE ( rom_pbus_set_txgain = 0x40007610 );
|
|
||||||
PROVIDE ( rom_pbus_workmode = 0x40007648 );
|
|
||||||
PROVIDE ( rom_pbus_xpd_rx_off = 0x40007688 );
|
|
||||||
PROVIDE ( rom_pbus_xpd_rx_on = 0x400076cc );
|
|
||||||
PROVIDE ( rom_pbus_xpd_tx_off = 0x400076fc );
|
|
||||||
PROVIDE ( rom_pbus_xpd_tx_on = 0x40007740 );
|
|
||||||
PROVIDE ( rom_pbus_xpd_tx_on__low_gain = 0x400077a0 );
|
|
||||||
PROVIDE ( rom_phy_reset_req = 0x40007804 );
|
|
||||||
PROVIDE ( rom_restart_cal = 0x4000781c );
|
|
||||||
PROVIDE ( rom_rfcal_pwrctrl = 0x40007eb4 );
|
|
||||||
PROVIDE ( rom_rfcal_rxiq = 0x4000804c );
|
|
||||||
PROVIDE ( rom_rfcal_rxiq_set_reg = 0x40008264 );
|
|
||||||
PROVIDE ( rom_rfcal_txcap = 0x40008388 );
|
|
||||||
PROVIDE ( rom_rfcal_txiq = 0x40008610 );
|
|
||||||
PROVIDE ( rom_rfcal_txiq_cover = 0x400088b8 );
|
|
||||||
PROVIDE ( rom_rfcal_txiq_set_reg = 0x40008a70 );
|
|
||||||
PROVIDE ( rom_rfpll_reset = 0x40007868 );
|
|
||||||
PROVIDE ( rom_rfpll_set_freq = 0x40007968 );
|
|
||||||
PROVIDE ( rom_rxiq_cover_mg_mp = 0x40008b6c );
|
|
||||||
PROVIDE ( rom_rxiq_get_mis = 0x40006628 );
|
|
||||||
PROVIDE ( rom_sar_init = 0x40006738 );
|
|
||||||
PROVIDE ( rom_set_ana_inf_tx_scale = 0x4000678c );
|
|
||||||
PROVIDE ( rom_set_channel_freq = 0x40006c50 );
|
|
||||||
PROVIDE ( rom_set_loopback_gain = 0x400067c8 );
|
|
||||||
PROVIDE ( rom_set_noise_floor = 0x40006830 );
|
|
||||||
PROVIDE ( rom_set_rxclk_en = 0x40006550 );
|
|
||||||
PROVIDE ( rom_set_txbb_atten = 0x40008c6c );
|
|
||||||
PROVIDE ( rom_set_txclk_en = 0x4000650c );
|
|
||||||
PROVIDE ( rom_set_txiq_cal = 0x40008d34 );
|
|
||||||
PROVIDE ( rom_start_noisefloor = 0x40006874 );
|
|
||||||
PROVIDE ( rom_start_tx_tone = 0x400068b4 );
|
|
||||||
PROVIDE ( rom_stop_tx_tone = 0x4000698c );
|
|
||||||
PROVIDE ( rom_tx_mac_disable = 0x40006a98 );
|
|
||||||
PROVIDE ( rom_tx_mac_enable = 0x40006ad4 );
|
|
||||||
PROVIDE ( rom_txtone_linear_pwr = 0x40006a1c );
|
|
||||||
PROVIDE ( rom_write_rfpll_sdm = 0x400078dc );
|
|
||||||
PROVIDE ( roundup2 = 0x400031b4 );
|
|
||||||
PROVIDE ( rtc_enter_sleep = 0x40002870 );
|
|
||||||
PROVIDE ( rtc_get_reset_reason = 0x400025e0 );
|
|
||||||
PROVIDE ( rtc_intr_handler = 0x400029ec );
|
|
||||||
PROVIDE ( rtc_set_sleep_mode = 0x40002668 );
|
|
||||||
PROVIDE ( save_rxbcn_mactime = 0x400027a4 );
|
|
||||||
PROVIDE ( save_tsf_us = 0x400027ac );
|
|
||||||
PROVIDE ( send_packet = 0x40003c80 );
|
|
||||||
PROVIDE ( sha1_prf = 0x4000ba48 );
|
|
||||||
PROVIDE ( sha1_vector = 0x4000a2ec );
|
|
||||||
PROVIDE ( sip_alloc_to_host_evt = 0x40005180 );
|
|
||||||
PROVIDE ( sip_get_ptr = 0x400058a8 );
|
|
||||||
PROVIDE ( sip_get_state = 0x40005668 );
|
|
||||||
PROVIDE ( sip_init_attach = 0x4000567c );
|
|
||||||
PROVIDE ( sip_install_rx_ctrl_cb = 0x4000544c );
|
|
||||||
PROVIDE ( sip_install_rx_data_cb = 0x4000545c );
|
|
||||||
PROVIDE ( sip_post = 0x400050fc );
|
|
||||||
PROVIDE ( sip_post_init = 0x400056c4 );
|
|
||||||
PROVIDE ( sip_reclaim_from_host_cmd = 0x4000534c );
|
|
||||||
PROVIDE ( sip_reclaim_tx_data_pkt = 0x400052c0 );
|
|
||||||
PROVIDE ( sip_send = 0x40005808 );
|
|
||||||
PROVIDE ( sip_to_host_chain_append = 0x40005864 );
|
|
||||||
PROVIDE ( sip_to_host_evt_send_done = 0x40005234 );
|
|
||||||
PROVIDE ( slc_add_credits = 0x400060ac );
|
|
||||||
PROVIDE ( slc_enable = 0x40005d90 );
|
|
||||||
PROVIDE ( slc_from_host_chain_fetch = 0x40005f24 );
|
|
||||||
PROVIDE ( slc_from_host_chain_recycle = 0x40005e94 );
|
|
||||||
PROVIDE ( slc_init_attach = 0x40005c50 );
|
|
||||||
PROVIDE ( slc_init_credit = 0x4000608c );
|
|
||||||
PROVIDE ( slc_pause_from_host = 0x40006014 );
|
|
||||||
PROVIDE ( slc_reattach = 0x40005c1c );
|
|
||||||
PROVIDE ( slc_resume_from_host = 0x4000603c );
|
|
||||||
PROVIDE ( slc_select_tohost_gpio = 0x40005dc0 );
|
|
||||||
PROVIDE ( slc_select_tohost_gpio_mode = 0x40005db8 );
|
|
||||||
PROVIDE ( slc_send_to_host_chain = 0x40005de4 );
|
|
||||||
PROVIDE ( slc_set_host_io_max_window = 0x40006068 );
|
|
||||||
PROVIDE ( slc_to_host_chain_recycle = 0x40005f10 );
|
|
||||||
PROVIDE ( software_reset = 0x4000264c );
|
|
||||||
PROVIDE ( spi_flash_attach = 0x40004644 );
|
|
||||||
PROVIDE ( srand = 0x400005f0 );
|
|
||||||
PROVIDE ( strcmp = 0x4000bdc8 );
|
|
||||||
PROVIDE ( strcpy = 0x4000bec8 );
|
|
||||||
PROVIDE ( strlen = 0x4000bf4c );
|
|
||||||
PROVIDE ( strncmp = 0x4000bfa8 );
|
|
||||||
PROVIDE ( strncpy = 0x4000c0a0 );
|
|
||||||
PROVIDE ( strstr = 0x4000e1e0 );
|
|
||||||
PROVIDE ( timer_insert = 0x40002c64 );
|
|
||||||
PROVIDE ( uartAttach = 0x4000383c );
|
|
||||||
PROVIDE ( uart_baudrate_detect = 0x40003924 );
|
|
||||||
PROVIDE ( uart_buff_switch = 0x400038a4 );
|
|
||||||
PROVIDE ( uart_rx_intr_handler = 0x40003bbc );
|
|
||||||
PROVIDE ( uart_rx_one_char = 0x40003b8c );
|
|
||||||
PROVIDE ( uart_rx_one_char_block = 0x40003b64 );
|
|
||||||
PROVIDE ( uart_rx_readbuff = 0x40003ec8 );
|
|
||||||
PROVIDE ( uart_tx_one_char = 0x40003b30 );
|
|
||||||
PROVIDE ( wepkey_128 = 0x4000bc40 );
|
|
||||||
PROVIDE ( wepkey_64 = 0x4000bb3c );
|
|
||||||
PROVIDE ( xthal_bcopy = 0x40000688 );
|
|
||||||
PROVIDE ( xthal_copy123 = 0x4000074c );
|
|
||||||
PROVIDE ( xthal_get_ccompare = 0x4000dd4c );
|
|
||||||
PROVIDE ( xthal_get_ccount = 0x4000dd38 );
|
|
||||||
PROVIDE ( xthal_get_interrupt = 0x4000dd58 );
|
|
||||||
PROVIDE ( xthal_get_intread = 0x4000dd58 );
|
|
||||||
PROVIDE ( xthal_memcpy = 0x400006c4 );
|
|
||||||
PROVIDE ( xthal_set_ccompare = 0x4000dd40 );
|
|
||||||
PROVIDE ( xthal_set_intclear = 0x4000dd60 );
|
|
||||||
PROVIDE ( xthal_spill_registers_into_stack_nw = 0x4000e320 );
|
|
||||||
PROVIDE ( xthal_window_spill = 0x4000e324 );
|
|
||||||
PROVIDE ( xthal_window_spill_nw = 0x4000e320 );
|
|
||||||
|
|
||||||
PROVIDE ( Te0 = 0x3fffccf0 );
|
|
||||||
PROVIDE ( Td0 = 0x3fffd100 );
|
|
||||||
PROVIDE ( Td4s = 0x3fffd500);
|
|
||||||
PROVIDE ( rcons = 0x3fffd0f0);
|
|
||||||
PROVIDE ( UartDev = 0x3fffde10 );
|
|
||||||
PROVIDE ( flashchip = 0x3fffc714);
|
|
@ -110,7 +110,7 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu
|
|||||||
uint32_t remote_device_mode : 1; // bit 6 (v8.1.0.9) - SetOption88 - PWM Dimmer Buttons control remote devices
|
uint32_t remote_device_mode : 1; // bit 6 (v8.1.0.9) - SetOption88 - PWM Dimmer Buttons control remote devices
|
||||||
uint32_t zigbee_distinct_topics : 1; // bit 7 (v8.1.0.10) - SetOption89 - Distinct MQTT topics per device for Zigbee (#7835)
|
uint32_t zigbee_distinct_topics : 1; // bit 7 (v8.1.0.10) - SetOption89 - Distinct MQTT topics per device for Zigbee (#7835)
|
||||||
uint32_t only_json_message : 1; // bit 8 (v8.2.0.3) - SetOption90 - Disable non-json MQTT response
|
uint32_t only_json_message : 1; // bit 8 (v8.2.0.3) - SetOption90 - Disable non-json MQTT response
|
||||||
uint32_t spare09 : 1;
|
uint32_t fade_at_startup : 1; // bit 9 (v8.2.0.3) - SetOption91 - Enable light fading at start/power on
|
||||||
uint32_t spare10 : 1;
|
uint32_t spare10 : 1;
|
||||||
uint32_t spare11 : 1;
|
uint32_t spare11 : 1;
|
||||||
uint32_t spare12 : 1;
|
uint32_t spare12 : 1;
|
||||||
|
@ -32,7 +32,7 @@ const char kTasmotaCommands[] PROGMEM = "|" // No prefix
|
|||||||
D_CMND_I2CSCAN "|" D_CMND_I2CDRIVER "|"
|
D_CMND_I2CSCAN "|" D_CMND_I2CDRIVER "|"
|
||||||
#endif
|
#endif
|
||||||
#ifdef USE_DEVICE_GROUPS
|
#ifdef USE_DEVICE_GROUPS
|
||||||
D_CMND_DEVGROUP_SHARE "|"
|
D_CMND_DEVGROUP_NAME "|" D_CMND_DEVGROUP_SHARE "|"
|
||||||
#endif // USE_DEVICE_GROUPS
|
#endif // USE_DEVICE_GROUPS
|
||||||
D_CMND_SENSOR "|" D_CMND_DRIVER;
|
D_CMND_SENSOR "|" D_CMND_DRIVER;
|
||||||
|
|
||||||
@ -51,7 +51,7 @@ void (* const TasmotaCommand[])(void) PROGMEM = {
|
|||||||
&CmndI2cScan, CmndI2cDriver,
|
&CmndI2cScan, CmndI2cDriver,
|
||||||
#endif
|
#endif
|
||||||
#ifdef USE_DEVICE_GROUPS
|
#ifdef USE_DEVICE_GROUPS
|
||||||
&CmndDevGroupShare,
|
&CmndDevGroupName, &CmndDevGroupShare,
|
||||||
#endif // USE_DEVICE_GROUPS
|
#endif // USE_DEVICE_GROUPS
|
||||||
&CmndSensor, &CmndDriver };
|
&CmndSensor, &CmndDriver };
|
||||||
|
|
||||||
@ -1707,6 +1707,21 @@ void CmndI2cDriver(void)
|
|||||||
#endif // USE_I2C
|
#endif // USE_I2C
|
||||||
|
|
||||||
#ifdef USE_DEVICE_GROUPS
|
#ifdef USE_DEVICE_GROUPS
|
||||||
|
void CmndDevGroupName(void)
|
||||||
|
{
|
||||||
|
if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_DEV_GROUP_NAMES)) {
|
||||||
|
if (XdrvMailbox.data_len > 0) {
|
||||||
|
if (XdrvMailbox.data_len > TOPSZ)
|
||||||
|
XdrvMailbox.data[TOPSZ - 1] = 0;
|
||||||
|
else if (1 == XdrvMailbox.data_len && ('"' == XdrvMailbox.data[0] || '0' == XdrvMailbox.data[0]))
|
||||||
|
XdrvMailbox.data[0] = 0;
|
||||||
|
SettingsUpdateText(SET_DEV_GROUP_NAME1 + XdrvMailbox.index - 1, XdrvMailbox.data);
|
||||||
|
restart_flag = 2;
|
||||||
|
}
|
||||||
|
ResponseCmndAll(SET_DEV_GROUP_NAME1, MAX_DEV_GROUP_NAMES);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CmndDevGroupShare(void)
|
void CmndDevGroupShare(void)
|
||||||
{
|
{
|
||||||
uint32_t parm[2] = { Settings.device_group_share_in, Settings.device_group_share_out };
|
uint32_t parm[2] = { Settings.device_group_share_in, Settings.device_group_share_out };
|
||||||
|
@ -62,7 +62,7 @@ bool udp_was_connected = false;
|
|||||||
|
|
||||||
void DeviceGroupsInit(void)
|
void DeviceGroupsInit(void)
|
||||||
{
|
{
|
||||||
// Initialize the device information for each device group. The group name is the MQTT group topic.
|
// Initialize the device information for each device group.
|
||||||
device_groups = (struct device_group *)calloc(device_group_count, sizeof(struct device_group));
|
device_groups = (struct device_group *)calloc(device_group_count, sizeof(struct device_group));
|
||||||
if (device_groups == nullptr) {
|
if (device_groups == nullptr) {
|
||||||
AddLog_P2(LOG_LEVEL_ERROR, PSTR("DGR: error allocating %u-element device group array"), device_group_count);
|
AddLog_P2(LOG_LEVEL_ERROR, PSTR("DGR: error allocating %u-element device group array"), device_group_count);
|
||||||
@ -72,7 +72,18 @@ void DeviceGroupsInit(void)
|
|||||||
|
|
||||||
for (uint32_t device_group_index = 0; device_group_index < device_group_count; device_group_index++) {
|
for (uint32_t device_group_index = 0; device_group_index < device_group_count; device_group_index++) {
|
||||||
struct device_group * device_group = &device_groups[device_group_index];
|
struct device_group * device_group = &device_groups[device_group_index];
|
||||||
strcpy(device_group->group_name, SettingsText((device_group_index == 0 ? SET_MQTT_GRP_TOPIC : SET_MQTT_GRP_TOPIC2 + device_group_index - 1)));
|
strcpy(device_group->group_name, SettingsText(SET_DEV_GROUP_NAME1 + device_group_index));
|
||||||
|
|
||||||
|
// If the device group name is not set, use the MQTT group topic (with the device group index +
|
||||||
|
// 1 appended for device group indices > 0).
|
||||||
|
if (!device_group->group_name[0]) {
|
||||||
|
strcpy(device_group->group_name, SettingsText(SET_MQTT_GRP_TOPIC));
|
||||||
|
if (device_group_index) {
|
||||||
|
char str[10];
|
||||||
|
sprintf_P(str, PSTR("%u"), device_group_index + 1);
|
||||||
|
strcat(device_group->group_name, str);
|
||||||
|
}
|
||||||
|
}
|
||||||
device_group->message_header_length = sprintf_P(device_group->message, PSTR("%s%s HTTP/1.1\n\n"), kDeviceGroupMessage, device_group->group_name);
|
device_group->message_header_length = sprintf_P(device_group->message, PSTR("%s%s HTTP/1.1\n\n"), kDeviceGroupMessage, device_group->group_name);
|
||||||
device_group->last_full_status_sequence = -1;
|
device_group->last_full_status_sequence = -1;
|
||||||
}
|
}
|
||||||
@ -106,7 +117,7 @@ char * BeginDeviceGroupMessage(struct device_group * device_group, uint16_t flag
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Return true if we're configured to share the specified item.
|
// Return true if we're configured to share the specified item.
|
||||||
bool DeviceGroupItemShared(bool incoming, uint8_t item)
|
bool DevGroupItemShared(bool incoming, uint8_t item)
|
||||||
{
|
{
|
||||||
uint8_t mask = 0;
|
uint8_t mask = 0;
|
||||||
switch (item) {
|
switch (item) {
|
||||||
@ -149,7 +160,7 @@ void SendDeviceGroupPacket(IPAddress ip, char * packet, int len, const char * la
|
|||||||
AddLog_P2(LOG_LEVEL_ERROR, PSTR("DGR: error sending %s packet"), label);
|
AddLog_P2(LOG_LEVEL_ERROR, PSTR("DGR: error sending %s packet"), label);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _SendDeviceGroupMessage(uint8_t device_group_index, DeviceGroupMessageType message_type, ...)
|
void _SendDeviceGroupMessage(uint8_t device_group_index, DevGroupMessageType message_type, ...)
|
||||||
{
|
{
|
||||||
// If device groups are not enabled, ignore this request.
|
// If device groups are not enabled, ignore this request.
|
||||||
if (!Settings.flag4.device_groups_enabled) return;
|
if (!Settings.flag4.device_groups_enabled) return;
|
||||||
@ -184,6 +195,7 @@ void _SendDeviceGroupMessage(uint8_t device_group_index, DeviceGroupMessageType
|
|||||||
device_group->message_length = 0;
|
device_group->message_length = 0;
|
||||||
SendDeviceGroupMessage(device_group_index, DGR_MSGTYP_PARTIAL_UPDATE, DGR_ITEM_POWER, power);
|
SendDeviceGroupMessage(device_group_index, DGR_MSGTYP_PARTIAL_UPDATE, DGR_ITEM_POWER, power);
|
||||||
XdrvMailbox.command_code = DGR_ITEM_STATUS;
|
XdrvMailbox.command_code = DGR_ITEM_STATUS;
|
||||||
|
XdrvMailbox.topic = (char *)&device_group_index;
|
||||||
XdrvCall(FUNC_DEVICE_GROUP_ITEM);
|
XdrvCall(FUNC_DEVICE_GROUP_ITEM);
|
||||||
building_status_message = false;
|
building_status_message = false;
|
||||||
|
|
||||||
@ -319,7 +331,7 @@ void _SendDeviceGroupMessage(uint8_t device_group_index, DeviceGroupMessageType
|
|||||||
// Itertate through the passed items adding them and their values to the message.
|
// Itertate through the passed items adding them and their values to the message.
|
||||||
va_start(ap, message_type);
|
va_start(ap, message_type);
|
||||||
while ((item = va_arg(ap, int))) {
|
while ((item = va_arg(ap, int))) {
|
||||||
shared = DeviceGroupItemShared(false, item);
|
shared = DevGroupItemShared(false, item);
|
||||||
if (shared) *message_ptr++ = item;
|
if (shared) *message_ptr++ = item;
|
||||||
if (item <= DGR_ITEM_MAX_32BIT) {
|
if (item <= DGR_ITEM_MAX_32BIT) {
|
||||||
value = va_arg(ap, int);
|
value = va_arg(ap, int);
|
||||||
@ -384,10 +396,8 @@ void _SendDeviceGroupMessage(uint8_t device_group_index, DeviceGroupMessageType
|
|||||||
|
|
||||||
uint32_t now = millis();
|
uint32_t now = millis();
|
||||||
if (message_type == DGR_MSGTYP_UPDATE_MORE_TO_COME) {
|
if (message_type == DGR_MSGTYP_UPDATE_MORE_TO_COME) {
|
||||||
|
device_group->message_length = 0;
|
||||||
device_group->next_ack_check_time = 0;
|
device_group->next_ack_check_time = 0;
|
||||||
// for (struct device_group_member * device_group_member = device_group->device_group_members; device_group_member != nullptr; device_group_member = device_group_member->flink) {
|
|
||||||
// device_group_member->acked_sequence = outgoing_sequence;
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
device_group->ack_check_interval = 100;
|
device_group->ack_check_interval = 100;
|
||||||
@ -410,7 +420,7 @@ void ProcessDeviceGroupMessage(char * packet, int packet_length)
|
|||||||
|
|
||||||
// Search for a device group with the target group name. If one isn't found, return.
|
// Search for a device group with the target group name. If one isn't found, return.
|
||||||
struct device_group * device_group;
|
struct device_group * device_group;
|
||||||
uint32_t device_group_index = 0;
|
uint8_t device_group_index = 0;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
device_group = &device_groups[device_group_index];
|
device_group = &device_groups[device_group_index];
|
||||||
if (!strcmp(message_group_name, device_group->group_name)) break;
|
if (!strcmp(message_group_name, device_group->group_name)) break;
|
||||||
@ -518,15 +528,16 @@ void ProcessDeviceGroupMessage(char * packet, int packet_length)
|
|||||||
bool grpflg
|
bool grpflg
|
||||||
bool usridx
|
bool usridx
|
||||||
uint16_t command_code Item code
|
uint16_t command_code Item code
|
||||||
uint32_t index 0:15 Flags, 16:23 Device group index
|
uint32_t index 0:15 Flags, 16:31 Message sequence
|
||||||
uint32_t data_len String item value length
|
uint32_t data_len String item value length
|
||||||
int32_t payload Integer item value
|
int32_t payload Integer item value
|
||||||
char *topic
|
char *topic Pointer to device group index
|
||||||
char *data Pointer to non-integer item value
|
char *data Pointer to non-integer item value
|
||||||
char *command nullptr
|
char *command nullptr
|
||||||
*/
|
*/
|
||||||
XdrvMailbox.command = nullptr; // Indicates the source is a device group update
|
XdrvMailbox.command = nullptr; // Indicates the source is a device group update
|
||||||
XdrvMailbox.index = flags | device_group_index << 16;
|
XdrvMailbox.index = flags | message_sequence << 16;
|
||||||
|
XdrvMailbox.topic = (char *)&device_group_index;
|
||||||
if (flags & (DGR_FLAG_MORE_TO_COME | DGR_FLAG_DIRECT)) skip_light_fade = true;
|
if (flags & (DGR_FLAG_MORE_TO_COME | DGR_FLAG_DIRECT)) skip_light_fade = true;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
@ -589,7 +600,7 @@ void ProcessDeviceGroupMessage(char * packet, int packet_length)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (DeviceGroupItemShared(true, item)) {
|
if (DevGroupItemShared(true, item)) {
|
||||||
if (item == DGR_ITEM_POWER) {
|
if (item == DGR_ITEM_POWER) {
|
||||||
if (device_group->local) {
|
if (device_group->local) {
|
||||||
uint8_t mask_devices = value >> 24;
|
uint8_t mask_devices = value >> 24;
|
||||||
@ -744,7 +755,7 @@ AddLog_P2(LOG_LEVEL_DEBUG, PSTR("DGR: Ckecking next_check_time=%u, now=%u"), nex
|
|||||||
if (device_group->next_ack_check_time < next_check_time) next_check_time = device_group->next_ack_check_time;
|
if (device_group->next_ack_check_time < next_check_time) next_check_time = device_group->next_ack_check_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If it's time to send multicast announcement for this group, send it. This is to
|
// If it's time to send a multicast announcement for this group, send it. This is to
|
||||||
// announcement ourself to any members that have somehow not heard about us. We send it at
|
// announcement ourself to any members that have somehow not heard about us. We send it at
|
||||||
// the announcement interval plus a random number of milliseconds so that even if all the
|
// the announcement interval plus a random number of milliseconds so that even if all the
|
||||||
// devices booted at the same time, they don't all multicast their announcements at the same
|
// devices booted at the same time, they don't all multicast their announcements at the same
|
||||||
@ -753,11 +764,10 @@ AddLog_P2(LOG_LEVEL_DEBUG, PSTR("DGR: Ckecking next_check_time=%u, now=%u"), nex
|
|||||||
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("DGR: next_announcement_time=%u, now=%u"), device_group->next_announcement_time, now);
|
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("DGR: next_announcement_time=%u, now=%u"), device_group->next_announcement_time, now);
|
||||||
#endif // DEVICE_GROUPS_DEBUG
|
#endif // DEVICE_GROUPS_DEBUG
|
||||||
if (device_group->next_announcement_time <= now) {
|
if (device_group->next_announcement_time <= now) {
|
||||||
device_group->message_length = BeginDeviceGroupMessage(device_group, DGR_FLAG_ANNOUNCEMENT) - device_group->message;
|
|
||||||
#ifdef DEVICE_GROUPS_DEBUG
|
#ifdef DEVICE_GROUPS_DEBUG
|
||||||
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("DGR: sending %u-byte device group %s announcement"), device_group->message_length, device_group->group_name);
|
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("DGR: sending %u-byte device group %s announcement"), device_group->message_length, device_group->group_name);
|
||||||
#endif // DEVICE_GROUPS_DEBUG
|
#endif // DEVICE_GROUPS_DEBUG
|
||||||
SendDeviceGroupPacket(0, device_group->message, device_group->message_length, PSTR("Announcement"));
|
SendDeviceGroupPacket(0, device_group->message, BeginDeviceGroupMessage(device_group, DGR_FLAG_ANNOUNCEMENT, true) - device_group->message, PSTR("Announcement"));
|
||||||
device_group->next_announcement_time = now + DGR_ANNOUNCEMENT_INTERVAL + random(10000);
|
device_group->next_announcement_time = now + DGR_ANNOUNCEMENT_INTERVAL + random(10000);
|
||||||
}
|
}
|
||||||
if (device_group->next_announcement_time < next_check_time) next_check_time = device_group->next_announcement_time;
|
if (device_group->next_announcement_time < next_check_time) next_check_time = device_group->next_announcement_time;
|
||||||
|
@ -82,6 +82,7 @@ const uint8_t MAX_RULE_MEMS = 16; // Max number of saved vars
|
|||||||
const uint8_t MAX_FRIENDLYNAMES = 8; // Max number of Friendly names
|
const uint8_t MAX_FRIENDLYNAMES = 8; // Max number of Friendly names
|
||||||
const uint8_t MAX_BUTTON_TEXT = 16; // Max number of GUI button labels
|
const uint8_t MAX_BUTTON_TEXT = 16; // Max number of GUI button labels
|
||||||
const uint8_t MAX_GROUP_TOPICS = 4; // Max number of Group Topics
|
const uint8_t MAX_GROUP_TOPICS = 4; // Max number of Group Topics
|
||||||
|
const uint8_t MAX_DEV_GROUP_NAMES = 4; // Max number of Device Group names
|
||||||
|
|
||||||
const uint8_t MAX_HUE_DEVICES = 15; // Max number of Philips Hue device per emulation
|
const uint8_t MAX_HUE_DEVICES = 15; // Max number of Philips Hue device per emulation
|
||||||
|
|
||||||
@ -302,30 +303,30 @@ enum SettingsTextIndex { SET_OTAURL,
|
|||||||
SET_BUTTON1, SET_BUTTON2, SET_BUTTON3, SET_BUTTON4, SET_BUTTON5, SET_BUTTON6, SET_BUTTON7, SET_BUTTON8,
|
SET_BUTTON1, SET_BUTTON2, SET_BUTTON3, SET_BUTTON4, SET_BUTTON5, SET_BUTTON6, SET_BUTTON7, SET_BUTTON8,
|
||||||
SET_BUTTON9, SET_BUTTON10, SET_BUTTON11, SET_BUTTON12, SET_BUTTON13, SET_BUTTON14, SET_BUTTON15, SET_BUTTON16,
|
SET_BUTTON9, SET_BUTTON10, SET_BUTTON11, SET_BUTTON12, SET_BUTTON13, SET_BUTTON14, SET_BUTTON15, SET_BUTTON16,
|
||||||
SET_MQTT_GRP_TOPIC2, SET_MQTT_GRP_TOPIC3, SET_MQTT_GRP_TOPIC4,
|
SET_MQTT_GRP_TOPIC2, SET_MQTT_GRP_TOPIC3, SET_MQTT_GRP_TOPIC4,
|
||||||
SET_TEMPLATE_NAME,
|
SET_TEMPLATE_NAME, SET_DEV_GROUP_NAME1, SET_DEV_GROUP_NAME2, SET_DEV_GROUP_NAME3, SET_DEV_GROUP_NAME4,
|
||||||
SET_MAX };
|
SET_MAX };
|
||||||
|
|
||||||
enum DeviceGroupMessageType { DGR_MSGTYP_FULL_STATUS, DGR_MSGTYP_PARTIAL_UPDATE, DGR_MSGTYP_UPDATE, DGR_MSGTYP_UPDATE_MORE_TO_COME, DGR_MSGTYP_UPDATE_DIRECT, DGR_MSGTYP_REUPDATE };
|
enum DevGroupMessageType { DGR_MSGTYP_FULL_STATUS, DGR_MSGTYP_PARTIAL_UPDATE, DGR_MSGTYP_UPDATE, DGR_MSGTYP_UPDATE_MORE_TO_COME, DGR_MSGTYP_UPDATE_DIRECT, DGR_MSGTYP_REUPDATE };
|
||||||
|
|
||||||
enum DeviceGroupMessageFlag { DGR_FLAG_RESET = 1, DGR_FLAG_STATUS_REQUEST = 2, DGR_FLAG_FULL_STATUS = 4, DGR_FLAG_ACK = 8, DGR_FLAG_MORE_TO_COME = 16, DGR_FLAG_DIRECT = 32, DGR_FLAG_ANNOUNCEMENT = 64 };
|
enum DevGroupMessageFlag { DGR_FLAG_RESET = 1, DGR_FLAG_STATUS_REQUEST = 2, DGR_FLAG_FULL_STATUS = 4, DGR_FLAG_ACK = 8, DGR_FLAG_MORE_TO_COME = 16, DGR_FLAG_DIRECT = 32, DGR_FLAG_ANNOUNCEMENT = 64 };
|
||||||
|
|
||||||
enum DeviceGroupItem { DGR_ITEM_EOL, DGR_ITEM_STATUS,
|
enum DevGroupItem { DGR_ITEM_EOL, DGR_ITEM_STATUS,
|
||||||
DGR_ITEM_LIGHT_FADE, DGR_ITEM_LIGHT_SPEED, DGR_ITEM_LIGHT_BRI, DGR_ITEM_LIGHT_SCHEME, DGR_ITEM_LIGHT_FIXED_COLOR,
|
DGR_ITEM_LIGHT_FADE, DGR_ITEM_LIGHT_SPEED, DGR_ITEM_LIGHT_BRI, DGR_ITEM_LIGHT_SCHEME, DGR_ITEM_LIGHT_FIXED_COLOR,
|
||||||
DGR_ITEM_BRI_PRESET_LOW, DGR_ITEM_BRI_PRESET_HIGH, DGR_ITEM_BRI_POWER_ON,
|
DGR_ITEM_BRI_PRESET_LOW, DGR_ITEM_BRI_PRESET_HIGH, DGR_ITEM_BRI_POWER_ON,
|
||||||
// Add new 8-bit items before this line
|
// Add new 8-bit items before this line
|
||||||
DGR_ITEM_LAST_8BIT, DGR_ITEM_MAX_8BIT = 63,
|
DGR_ITEM_LAST_8BIT, DGR_ITEM_MAX_8BIT = 63,
|
||||||
DGR_ITEM_ANALOG1, DGR_ITEM_ANALOG2, DGR_ITEM_ANALOG3, DGR_ITEM_ANALOG4, DGR_ITEM_ANALOG5,
|
DGR_ITEM_ANALOG1, DGR_ITEM_ANALOG2, DGR_ITEM_ANALOG3, DGR_ITEM_ANALOG4, DGR_ITEM_ANALOG5,
|
||||||
// Add new 16-bit items before this line
|
// Add new 16-bit items before this line
|
||||||
DGR_ITEM_LAST_16BIT, DGR_ITEM_MAX_16BIT = 127,
|
DGR_ITEM_LAST_16BIT, DGR_ITEM_MAX_16BIT = 127,
|
||||||
DGR_ITEM_POWER, DGR_ITEM_DIMMER_RANGE,
|
DGR_ITEM_POWER, DGR_ITEM_DIMMER_RANGE,
|
||||||
// Add new 32-bit items before this line
|
// Add new 32-bit items before this line
|
||||||
DGR_ITEM_LAST_32BIT, DGR_ITEM_MAX_32BIT = 191,
|
DGR_ITEM_LAST_32BIT, DGR_ITEM_MAX_32BIT = 191,
|
||||||
// Add new string items before this line
|
// Add new string items before this line
|
||||||
DGR_ITEM_LAST_STRING, DGR_ITEM_MAX_STRING = 223,
|
DGR_ITEM_LAST_STRING, DGR_ITEM_MAX_STRING = 223,
|
||||||
DGR_ITEM_LIGHT_CHANNELS };
|
DGR_ITEM_LIGHT_CHANNELS };
|
||||||
|
|
||||||
enum DeviceGroupShareItem { DGR_SHARE_POWER = 1, DGR_SHARE_LIGHT_BRI = 2, DGR_SHARE_LIGHT_FADE = 4, DGR_SHARE_LIGHT_SCHEME = 8,
|
enum DevGroupShareItem { DGR_SHARE_POWER = 1, DGR_SHARE_LIGHT_BRI = 2, DGR_SHARE_LIGHT_FADE = 4, DGR_SHARE_LIGHT_SCHEME = 8,
|
||||||
DGR_SHARE_LIGHT_COLOR = 16, DGR_SHARE_DIMMER_SETTINGS = 32 };
|
DGR_SHARE_LIGHT_COLOR = 16, DGR_SHARE_DIMMER_SETTINGS = 32 };
|
||||||
|
|
||||||
enum CommandSource { SRC_IGNORE, SRC_MQTT, SRC_RESTART, SRC_BUTTON, SRC_SWITCH, SRC_BACKLOG, SRC_SERIAL, SRC_WEBGUI, SRC_WEBCOMMAND, SRC_WEBCONSOLE, SRC_PULSETIMER,
|
enum CommandSource { SRC_IGNORE, SRC_MQTT, SRC_RESTART, SRC_BUTTON, SRC_SWITCH, SRC_BACKLOG, SRC_SERIAL, SRC_WEBGUI, SRC_WEBCOMMAND, SRC_WEBCONSOLE, SRC_PULSETIMER,
|
||||||
SRC_TIMER, SRC_RULE, SRC_MAXPOWER, SRC_MAXENERGY, SRC_OVERTEMP, SRC_LIGHT, SRC_KNX, SRC_DISPLAY, SRC_WEMO, SRC_HUE, SRC_RETRY, SRC_REMOTE, SRC_SHUTTER,
|
SRC_TIMER, SRC_RULE, SRC_MAXPOWER, SRC_MAXENERGY, SRC_OVERTEMP, SRC_LIGHT, SRC_KNX, SRC_DISPLAY, SRC_WEMO, SRC_HUE, SRC_RETRY, SRC_REMOTE, SRC_SHUTTER,
|
||||||
|
@ -1310,6 +1310,9 @@ void LightInit(void)
|
|||||||
Light.power = 0;
|
Light.power = 0;
|
||||||
Light.update = true;
|
Light.update = true;
|
||||||
Light.wakeup_active = 0;
|
Light.wakeup_active = 0;
|
||||||
|
if (Settings.flag4.fade_at_startup) {
|
||||||
|
Light.fade_initialized = true; // consider fade intialized starting from black
|
||||||
|
}
|
||||||
|
|
||||||
LightUpdateColorMapping();
|
LightUpdateColorMapping();
|
||||||
}
|
}
|
||||||
@ -2128,14 +2131,14 @@ void LightSendDeviceGroupStatus(bool force)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void LightHandleDeviceGroupItem(void)
|
void LightHandleDevGroupItem(void)
|
||||||
{
|
{
|
||||||
static bool send_state = false;
|
static bool send_state = false;
|
||||||
static bool restore_power = false;
|
static bool restore_power = false;
|
||||||
bool more_to_come;
|
bool more_to_come;
|
||||||
uint32_t value = XdrvMailbox.payload;
|
uint32_t value = XdrvMailbox.payload;
|
||||||
#ifdef USE_PWM_DIMMER_REMOTE
|
#ifdef USE_PWM_DIMMER_REMOTE
|
||||||
if (XdrvMailbox.index & 0xff0000) return; // Ignore updates from other device groups
|
if (*XdrvMailbox.topic) return; // Ignore updates from other device groups
|
||||||
#endif // USE_PWM_DIMMER_REMOTE
|
#endif // USE_PWM_DIMMER_REMOTE
|
||||||
switch (XdrvMailbox.command_code) {
|
switch (XdrvMailbox.command_code) {
|
||||||
case DGR_ITEM_EOL:
|
case DGR_ITEM_EOL:
|
||||||
@ -2771,7 +2774,7 @@ bool Xdrv04(uint8_t function)
|
|||||||
break;
|
break;
|
||||||
#ifdef USE_DEVICE_GROUPS
|
#ifdef USE_DEVICE_GROUPS
|
||||||
case FUNC_DEVICE_GROUP_ITEM:
|
case FUNC_DEVICE_GROUP_ITEM:
|
||||||
LightHandleDeviceGroupItem();
|
LightHandleDevGroupItem();
|
||||||
break;
|
break;
|
||||||
#endif // USE_DEVICE_GROUPS
|
#endif // USE_DEVICE_GROUPS
|
||||||
case FUNC_SET_POWER:
|
case FUNC_SET_POWER:
|
||||||
|
@ -101,6 +101,7 @@ void PWMModulePreInit(void)
|
|||||||
if (Settings.flag4.remote_device_mode) {
|
if (Settings.flag4.remote_device_mode) {
|
||||||
Settings.flag4.device_groups_enabled = true;
|
Settings.flag4.device_groups_enabled = true;
|
||||||
|
|
||||||
|
device_group_count = 0;
|
||||||
for (uint32_t button_index = 0; button_index < MAX_KEYS; button_index++) {
|
for (uint32_t button_index = 0; button_index < MAX_KEYS; button_index++) {
|
||||||
if (pin[GPIO_KEY1 + button_index] < 99) device_group_count++;
|
if (pin[GPIO_KEY1 + button_index] < 99) device_group_count++;
|
||||||
}
|
}
|
||||||
@ -169,11 +170,11 @@ void PWMDimmerSetPower(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef USE_DEVICE_GROUPS
|
#ifdef USE_DEVICE_GROUPS
|
||||||
void PWMDimmerHandleDeviceGroupItem(void)
|
void PWMDimmerHandleDevGroupItem(void)
|
||||||
{
|
{
|
||||||
uint32_t value = XdrvMailbox.payload;
|
uint32_t value = XdrvMailbox.payload;
|
||||||
#ifdef USE_PWM_DIMMER_REMOTE
|
#ifdef USE_PWM_DIMMER_REMOTE
|
||||||
uint8_t device_group_index = XdrvMailbox.index >> 16 & 0xff;
|
uint8_t device_group_index = *(uint8_t *)XdrvMailbox.topic;
|
||||||
bool device_is_local = device_groups[device_group_index].local;
|
bool device_is_local = device_groups[device_group_index].local;
|
||||||
struct remote_pwm_dimmer * remote_pwm_dimmer = &remote_pwm_dimmers[device_group_index];
|
struct remote_pwm_dimmer * remote_pwm_dimmer = &remote_pwm_dimmers[device_group_index];
|
||||||
#endif // USE_PWM_DIMMER_REMOTE
|
#endif // USE_PWM_DIMMER_REMOTE
|
||||||
@ -763,7 +764,7 @@ bool Xdrv35(uint8_t function)
|
|||||||
|
|
||||||
#ifdef USE_DEVICE_GROUPS
|
#ifdef USE_DEVICE_GROUPS
|
||||||
case FUNC_DEVICE_GROUP_ITEM:
|
case FUNC_DEVICE_GROUP_ITEM:
|
||||||
PWMDimmerHandleDeviceGroupItem();
|
PWMDimmerHandleDevGroupItem();
|
||||||
break;
|
break;
|
||||||
#endif // USE_DEVICE_GROUPS
|
#endif // USE_DEVICE_GROUPS
|
||||||
|
|
||||||
|
@ -129,6 +129,7 @@ const char kUBXTypes[] PROGMEM = "UBX";
|
|||||||
|
|
||||||
#define UBX_SERIAL_BUFFER_SIZE 256
|
#define UBX_SERIAL_BUFFER_SIZE 256
|
||||||
#define UBX_TCP_PORT 1234
|
#define UBX_TCP_PORT 1234
|
||||||
|
#define NTP_MILLIS_OFFSET 50 // estimated latency in milliseconds
|
||||||
|
|
||||||
/********************************************************************************************\
|
/********************************************************************************************\
|
||||||
| *globals
|
| *globals
|
||||||
@ -251,7 +252,8 @@ struct UBX_t {
|
|||||||
uint32_t last_vAcc;
|
uint32_t last_vAcc;
|
||||||
uint8_t gpsFix;
|
uint8_t gpsFix;
|
||||||
uint8_t non_empty_loops; // in case of an unintended reset of the GPS, the serial interface will get flooded with NMEA
|
uint8_t non_empty_loops; // in case of an unintended reset of the GPS, the serial interface will get flooded with NMEA
|
||||||
uint16_t log_interval; // in tenth of seconds
|
uint16_t log_interval; // in tenth of seconds
|
||||||
|
int32_t timeOffset; // roughly computed offset millis() - iTOW
|
||||||
} state;
|
} state;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
@ -260,6 +262,7 @@ struct UBX_t {
|
|||||||
uint32_t send_when_new:1; // no teleinterval
|
uint32_t send_when_new:1; // no teleinterval
|
||||||
uint32_t send_UI_only:1;
|
uint32_t send_UI_only:1;
|
||||||
uint32_t runningNTP:1;
|
uint32_t runningNTP:1;
|
||||||
|
// uint32_t blockedNTP:1;
|
||||||
uint32_t forceUTCupdate:1;
|
uint32_t forceUTCupdate:1;
|
||||||
uint32_t runningVPort:1;
|
uint32_t runningVPort:1;
|
||||||
// TODO: more to come
|
// TODO: more to come
|
||||||
@ -322,6 +325,15 @@ void UBXinitCFG(void)
|
|||||||
DEBUG_SENSOR_LOG(PSTR("UBX: turn off NMEA"));
|
DEBUG_SENSOR_LOG(PSTR("UBX: turn off NMEA"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UBXsendCFGLine(uint8_t _line)
|
||||||
|
{
|
||||||
|
if (_line>sizeof(UBLOX_INIT)/16) return;
|
||||||
|
for (uint32_t i = 0; i < 16; i++) {
|
||||||
|
UBXSerial->write( pgm_read_byte(UBLOX_INIT+i+(_line*16)) );
|
||||||
|
}
|
||||||
|
DEBUG_SENSOR_LOG(PSTR("UBX: send line %u of UBLOX_INIT"), _line);
|
||||||
|
}
|
||||||
|
|
||||||
void UBXTriggerTele(void)
|
void UBXTriggerTele(void)
|
||||||
{
|
{
|
||||||
mqtt_data[0] = '\0';
|
mqtt_data[0] = '\0';
|
||||||
@ -583,6 +595,8 @@ void UBXSelectMode(uint16_t mode)
|
|||||||
break;
|
break;
|
||||||
case 10:
|
case 10:
|
||||||
UBX.mode.runningNTP = false;
|
UBX.mode.runningNTP = false;
|
||||||
|
UBXsendCFGLine(10); //NAV-POSLLH on
|
||||||
|
UBXsendCFGLine(11); //NAV-STATUS on
|
||||||
break;
|
break;
|
||||||
case 11:
|
case 11:
|
||||||
UBX.mode.forceUTCupdate = true;
|
UBX.mode.forceUTCupdate = true;
|
||||||
@ -604,7 +618,6 @@ void UBXSelectMode(uint16_t mode)
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (mode>1000 && mode <1066) {
|
if (mode>1000 && mode <1066) {
|
||||||
// UBXSetRate(mode-1000); // min. 1001 = 0.001 Hz, but will be converted to 1/65535 anyway ~0.015 Hz, max. 2000 = 1.000 Hz
|
|
||||||
UBXSetRate(mode-1000); // set interval between measurements in seconds from 1 to 65
|
UBXSetRate(mode-1000); // set interval between measurements in seconds from 1 to 65
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -629,13 +642,16 @@ bool UBXHandlePOSLLH()
|
|||||||
UBX.rec_buffer.values.lon = UBX.Message.navPosllh.lon;
|
UBX.rec_buffer.values.lon = UBX.Message.navPosllh.lon;
|
||||||
DEBUG_SENSOR_LOG(PSTR("UBX: lat/lon: %i / %i"), UBX.rec_buffer.values.lat, UBX.rec_buffer.values.lon);
|
DEBUG_SENSOR_LOG(PSTR("UBX: lat/lon: %i / %i"), UBX.rec_buffer.values.lat, UBX.rec_buffer.values.lon);
|
||||||
DEBUG_SENSOR_LOG(PSTR("UBX: hAcc: %d"), UBX.Message.navPosllh.hAcc);
|
DEBUG_SENSOR_LOG(PSTR("UBX: hAcc: %d"), UBX.Message.navPosllh.hAcc);
|
||||||
UBX.state.last_iTOW = UBX.Message.navPosllh.iTOW;
|
|
||||||
UBX.state.last_alt = UBX.Message.navPosllh.alt;
|
UBX.state.last_alt = UBX.Message.navPosllh.alt;
|
||||||
UBX.state.last_vAcc = UBX.Message.navPosllh.vAcc;
|
UBX.state.last_vAcc = UBX.Message.navPosllh.vAcc;
|
||||||
UBX.state.last_hAcc = UBX.Message.navPosllh.hAcc;
|
UBX.state.last_hAcc = UBX.Message.navPosllh.hAcc;
|
||||||
if (UBX.mode.send_when_new) {
|
if (UBX.mode.send_when_new) {
|
||||||
UBXTriggerTele();
|
UBXTriggerTele();
|
||||||
}
|
}
|
||||||
|
if (UBX.mode.runningNTP){ // after receiving pos-data at least once -> go to pure NTP-mode
|
||||||
|
UBXsendCFGLine(7); //NAV-POSLLH off
|
||||||
|
UBXsendCFGLine(8); //NAV-STATUS off
|
||||||
|
}
|
||||||
return true; // new position
|
return true; // new position
|
||||||
} else {
|
} else {
|
||||||
DEBUG_SENSOR_LOG(PSTR("UBX: no valid position data"));
|
DEBUG_SENSOR_LOG(PSTR("UBX: no valid position data"));
|
||||||
@ -657,9 +673,9 @@ void UBXHandleTIME()
|
|||||||
{
|
{
|
||||||
DEBUG_SENSOR_LOG(PSTR("UBX: UTC-Time: %u-%u-%u %u:%u:%u"), UBX.Message.navTime.year, UBX.Message.navTime.month ,UBX.Message.navTime.day,UBX.Message.navTime.hour,UBX.Message.navTime.min,UBX.Message.navTime.sec);
|
DEBUG_SENSOR_LOG(PSTR("UBX: UTC-Time: %u-%u-%u %u:%u:%u"), UBX.Message.navTime.year, UBX.Message.navTime.month ,UBX.Message.navTime.day,UBX.Message.navTime.hour,UBX.Message.navTime.min,UBX.Message.navTime.sec);
|
||||||
if (UBX.Message.navTime.valid.UTC == 1) {
|
if (UBX.Message.navTime.valid.UTC == 1) {
|
||||||
|
UBX.state.timeOffset = millis(); // iTOW%1000 should be 0 here, when NTP-server is enabled and in "pure mode"
|
||||||
DEBUG_SENSOR_LOG(PSTR("UBX: UTC-Time is valid"));
|
DEBUG_SENSOR_LOG(PSTR("UBX: UTC-Time is valid"));
|
||||||
if (Rtc.user_time_entry == false || UBX.mode.forceUTCupdate) {
|
if (Rtc.user_time_entry == false || UBX.mode.forceUTCupdate || UBX.mode.runningNTP) {
|
||||||
AddLog_P(LOG_LEVEL_INFO, PSTR("UBX: UTC-Time is valid, set system time"));
|
|
||||||
TIME_T gpsTime;
|
TIME_T gpsTime;
|
||||||
gpsTime.year = UBX.Message.navTime.year - 1970;
|
gpsTime.year = UBX.Message.navTime.year - 1970;
|
||||||
gpsTime.month = UBX.Message.navTime.month;
|
gpsTime.month = UBX.Message.navTime.month;
|
||||||
@ -667,7 +683,11 @@ void UBXHandleTIME()
|
|||||||
gpsTime.hour = UBX.Message.navTime.hour;
|
gpsTime.hour = UBX.Message.navTime.hour;
|
||||||
gpsTime.minute = UBX.Message.navTime.min;
|
gpsTime.minute = UBX.Message.navTime.min;
|
||||||
gpsTime.second = UBX.Message.navTime.sec;
|
gpsTime.second = UBX.Message.navTime.sec;
|
||||||
Rtc.utc_time = MakeTime(gpsTime);
|
UBX.rec_buffer.values.time = MakeTime(gpsTime);
|
||||||
|
if (UBX.mode.forceUTCupdate || Rtc.user_time_entry == false){
|
||||||
|
AddLog_P(LOG_LEVEL_INFO, PSTR("UBX: UTC-Time is valid, set system time"));
|
||||||
|
Rtc.utc_time = UBX.rec_buffer.values.time;
|
||||||
|
}
|
||||||
Rtc.user_time_entry = true;
|
Rtc.user_time_entry = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -705,7 +725,7 @@ void UBXLoop50msec(void)
|
|||||||
}
|
}
|
||||||
// handle NTP-server
|
// handle NTP-server
|
||||||
if(UBX.mode.runningNTP){
|
if(UBX.mode.runningNTP){
|
||||||
timeServer.processOneRequest(Rtc.utc_time, UBX.state.last_iTOW%1000);
|
timeServer.processOneRequest(UBX.rec_buffer.values.time, UBX.state.timeOffset - NTP_MILLIS_OFFSET);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user