2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-01-31 18:59:33 +00:00

98_Arducounter.pm: more bugfixes in firmware and module

git-svn-id: https://svn.fhem.de/fhem/trunk@19991 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
StefanStrobel 2019-08-12 19:19:05 +00:00
parent b879886d90
commit ec1199f630
3 changed files with 365 additions and 340 deletions

View File

@ -83,6 +83,8 @@
# 2019-06-17 fix log messages and expose logRetries attribute
# 2019-07-20 add clearLevels, parese more verbose level output at 25v
# 2019-08-10 fix parsing of levels at devVerbose >= 25
# 2019-08-12 fix documentation of keepalive attributes, add parsing of RSSI,
# add missing attributes if they don't match the running device config
#
#
# ideas / todo:
@ -108,7 +110,7 @@ use strict;
use warnings;
use Time::HiRes qw(gettimeofday);
my $ArduCounter_Version = '6.17 - 10.8.2019';
my $ArduCounter_Version = '6.18 - 12.8.2019';
my %ArduCounter_sets = (
@ -530,10 +532,12 @@ sub ArduCounter_KeepAlive($)
RemoveInternalTimer ("alive:$name");
InternalTimer($now+$kto, "ArduCounter_AliveTimeout", "alive:$name", 0);
$hash->{WaitForAlive} = 1;
#Log3 $name, 5, "$name: keepAlive timeout timer set $kto";
if ($hash->{TCP}) {
RemoveInternalTimer ("keepAlive:$name");
InternalTimer($now+$kdl, "ArduCounter_KeepAlive", "keepAlive:$name", 0); # next keepalive
#Log3 $name, 5, "$name: keepAlive timer for next message set in $kdl";
}
}
@ -545,10 +549,11 @@ sub ArduCounter_AliveTimeout($)
my $param = shift;
my (undef,$name) = split(/:/,$param);
my $hash = $defs{$name};
#Log3 $name, 5, "$name: AliveTimeout called";
delete $hash->{WaitForAlive};
$hash->{KeepAliveRetries} = 0 if (!$hash->{KeepAliveRetries});
if (++$hash->{KeepAliveRetries} > AttrVal($name, "keepAliveRetries", 1)) {
if (++$hash->{KeepAliveRetries} > AttrVal($name, "keepAliveRetries", 2)) {
Log3 $name, 3, "$name: device didn't reply to k(eeepAlive), no retries left, setting device to disconnected";
ArduCounter_Disconnected($hash); # set to Disconnected but let _Ready try to Reopen
} else {
@ -593,6 +598,9 @@ sub ArduCounter_ConfigureDevice($)
Log3 $name, 5, "$name: ConfigureDevice: comparing intervals (>$iRCfg< vs >$iACfg< from attr)";
if (!$iRCfg || $iRCfg ne $iACfg) {
Log3 $name, 5, "$name: ConfigureDevice: intervals don't match (>$iRCfg< vs >$iACfg< from attr)";
if (AttrVal($name, "interval", "none") eq "none") { # set attr if no attr is set and running config doesn't match
CommandAttr(undef, "$name interval 30 600 2 2")
}
last CHECKS;
}
} else {
@ -602,12 +610,15 @@ sub ArduCounter_ConfigureDevice($)
my $vAttr = AttrVal($name, "devVerbose", "");
if (!$vAttr) {
$vAttr = 0;
Log3 $name, 5, "$name: ConfigureDevice: devVerbose attr not set - take default $iAttr";
Log3 $name, 5, "$name: ConfigureDevice: devVerbose attr not set - take default $vAttr";
}
my $vRCfg = ($hash->{runningCfg}{V} ? $hash->{runningCfg}{V} : 0);
Log3 $name, 5, "$name: ConfigureDevice: comparing devVerbose $vRCfg vs $vAttr from attr)";
if ($vRCfg != $vAttr) {
Log3 $name, 5, "$name: ConfigureDevice: devVerbose don't match ($vRCfg vs $vAttr from attr)";
if (!AttrVal($name, "devVerbose", "none" eq "none")) { # set attr if no attr is set and running config doesn't match
CommandAttr(undef, "$name devVerbose 0")
}
last CHECKS;
}
@ -626,7 +637,6 @@ sub ArduCounter_ConfigureDevice($)
} else {
Log3 $name, 3, "$name: ConfigureDevice: can not compare against analogThreshold attr - wrong format";
}
}
Log3 $name, 5, "$name: ConfigureDevice: matches so far - now compare pins";
@ -1586,10 +1596,16 @@ sub ArduCounter_Parse($)
$retStr .= ($retStr ? "\n" : "") . $line;
Log3 $name, 4, "$name: device sent config for pin $1: $2 $p min $4";
} elsif ($line =~ /^alive/) { # alive response
} elsif ($line =~ /^alive( ?RSSI ([\-\d]+))?/) { # alive response
Log3 $name, 5, "$name: device sent alive response: $line";
RemoveInternalTimer ("alive:$name");
$hash->{WaitForAlive} = 0;
delete $hash->{KeepAliveRetries};
if ($2) {
readingsBeginUpdate($hash);
readingsBulkUpdate($hash, "RSSI", $2);
readingsEndUpdate($hash, 1);
}
} elsif ($line =~ /^ArduCounter V([\d\.]+).*(Started|Hello)/) { # setup message
ArduCounter_ParseHello($hash, $line, $now);
@ -2074,7 +2090,7 @@ sub ArduCounter_ReadAnswer($$)
defines an interval in which the module sends keepalive messages to a counter device that is conected via tcp.<br>
This attribute is ignored if the device is connected via serial port.<br>
If the device doesn't reply within a defined timeout then the module closes and tries to reopen the connection.<br>
The module tells the device when to expect the next keepalive message and the device will also close the tcp connection if it doesn't see a keepalive message within the delay multiplied by 2.5<br>
The module tells the device when to expect the next keepalive message and the device will also close the tcp connection if it doesn't see a keepalive message within the delay multiplied by 3<br>
The delay defaults to 10 seconds.<br>
Example:
<code>

View File

@ -4,19 +4,19 @@
:100030000C9468020C9468020C9468020C94680298
:100040000C9472110C9468020C94F6030C94D00377
:100050000C9468020C9468020C9468020C94680278
:100060000C9468020C9468028013BF15BF1592139C
:10007000F113BF15BF15AB14AE14BF15C014BF15D7
:10008000BF15BF15BF15BF15BF15DC14DF1448150C
:10009000BF155A1587154D20726573746F72696E9E
:100060000C9468020C9468028013FC15FC15921322
:10007000F113FC15FC15AB14AE14FC15C014FC15E3
:10008000FC15FC15FC15FC15FC15DD14E014911590
:10009000FC15A315C4154D20726573746F72696EDB
:1000A0006720636F6E6669672066726F6D204545D5
:1000B00050524F4D004D20696C6C6567616C206338
:1000C0006F6E66696720696E20454550524F4D003E
:1000D0004D206E6F20636F6E66696720696E2045E4
:1000E0004550524F4D004572726F723A2000417573
:1000F0006720313220323031392031393A33343AC5
:1001000030370020636F6D70696C656420004E416C
:1000F0006720313220323031392032313A31363ACC
:1001000033360020636F6D70696C656420004E416A
:100110004E4F00206F6E200041726475436F756E04
:100120007465722056332E333300200020002000E7
:100120007465722056332E333400200020002000E6
:10013000490020005400206D696E20002070756C0D
:100140006C757000202D002066616C6C696E670014
:1001500020726973696E6700500040002F007300C1
@ -71,10 +71,10 @@
:10046000030303496C6C6567616C2070696E2073CF
:10047000706563696669636174696F6E2000BC11A1
:1004800011241FBECFEFD8E0DEBFCDBF11E0A0E04A
:10049000B1E0E8E3FAE302C005900D92AA3AB10791
:10049000B1E0EAE3FAE302C005900D92AA3AB1078F
:1004A000D9F726E0AAEAB1E001C01D92A23AB2074C
:1004B000E1F712E0C0E4D2E004C02197FE010E94FF
:1004C000021ACF33D107C9F70E94E9110C941A1D03
:1004C000031ACF33D107C9F70E94E9110C941B1D01
:1004D0000C940000CF92DF92EF92FF920F931F9344
:1004E000CF93DF936C017A018B01C0E0D0E0CE1591
:1004F000DF0581F0D8016D918D01D601ED91FC9160
@ -131,9 +131,9 @@
:1008200020918B05821751F0E0918A05F0E0EF5896
:10083000FA4F958F80938A0501C08081FF91EF91D7
:100840009F918F912F910F900FBE0F901F90189531
:100850000C94B619FF920F931F93CF93DF93EC0183
:100850000C94B719FF920F931F93CF93DF93EC0182
:10086000F62E08811981C8010E9428048F1521F0F5
:100870006F2DC8010E94BE198881998101969983C4
:100870006F2DC8010E94BF198881998101969983C3
:100880008883DF91CF911F910F91FF900895AF92D0
:10089000BF92CF92DF92EF92FF920F931F93CF936D
:1008A000DF93EC015A0169010E942A046A2DCE01EE
@ -208,7 +208,7 @@
:100CF000DC016C9180919706909198060E94430EBA
:100D000081149104A104B104C1F067E671E08091FF
:100D10009706909198060E9481036B897C898D8942
:100D20009E89A50194010E94E019BA01A901809150
:100D20009E89A50194010E94E119BA01A90180914F
:100D30009706909198060E94E00D809197069091F9
:100D400098066A960FB6F894DEBF0FBECDBFDF914E
:100D5000CF911F910F91FF90EF90DF90CF90BF90B8
@ -220,8 +220,8 @@
:100DB0006F927F928F929F92AF92BF92CF92DF926B
:100DC000EF92FF920F931F93CF93DF9300D000D049
:100DD000CDB7DEB71C012A013B018091110590E0DF
:100DE000029664E170E00E94CC19FC0120E030E042
:100DF00040E0CF01820F931F64E170E00E94CC19A4
:100DE000029664E170E00E94CD19FC0120E030E041
:100DF00040E0CF01820F931F64E170E00E94CD19A3
:100E0000DC01A65EBC4F8C9190E08215930509F43D
:100E10004F5F2F5F3F4F2431310559F7442309F4C9
:100E2000F7C0FA83E98365E671E0809197069091B7
@ -229,7 +229,7 @@
:100E40006081718180919706909198060E94FB0DB8
:100E500063E671E080919706909198060E94810365
:100E6000E12CF12C21E089819A818E0D9F1D64E196
:100E700070E00E94CC198C01FC01E65EFC4F808181
:100E700070E00E94CD198C01FC01E65EFC4F808180
:100E800090E02816390609F09FC0C801880F991F05
:100E9000880F991F9C838B83211121C0FC01E6538D
:100EA000FD4F80819181A281B381EB81FC81E65865
@ -276,14 +276,14 @@
:10113000CF92DF92EF92FF9260E371E08091970689
:10114000909198060E9481036091100170911101A5
:10115000809112019091130128EEC22E23E0D22E2D
:10116000E12CF12CA70196010E94E019BA01A90116
:10116000E12CF12CA70196010E94E119BA01A90115
:1011700080919706909198060E94E00D6EE271E0D2
:1011800080919706909198060E94810360910C01CE
:1011900070910D0180910E0190910F01A7019601B0
:1011A0000E94E019BA01A9018091970690919806D2
:1011A0000E94E119BA01A9018091970690919806D1
:1011B0000E94E00D6CE271E0809197069091980694
:1011C0000E948103609108017091090180910A01D8
:1011D00090910B01A70196010E94E019BA01A901A3
:1011D00090910B01A70196010E94E119BA01A901A2
:1011E00080919706909198060E94E00D6AE271E066
:1011F00080919706909198060E9481036091060164
:10120000709107018091970690919806FF90EF905A
@ -427,12 +427,12 @@
:101AA00050101F5FF1129DCF1092A00410929F045E
:101AB00010929E04E8E1F6E088E296E0119211921D
:101AC0008E179F07D9F7DF91CF911F910F91FF904C
:101AD000EF90DF90CF9008950E942B1A8F929F92E3
:101AD000EF90DF90CF9008950E942C1A8F929F92E2
:101AE000AF92BF92EF92FF920F931F93CF93DF932A
:101AF000CDB7DEB7A1970FB6F894DEBF0FBECDBF4E
:101B00007C01FA01CB0119A2223008F42AE08E01EF
:101B10000F5D1F4F822E912CA12CB12CBF01A5016E
:101B200094010E94E019F901CA01015011096A30BB
:101B200094010E94E119F901CA01015011096A30BA
:101B300014F4605D01C0695CD8016C93232B242BE5
:101B4000252B61F7B801C7010E94A503A1960FB626
:101B5000F894DEBF0FBECDBFDF91CF911F910F91E3
@ -462,14 +462,14 @@
:101CD0000E9481036C2F8091970690919806CF9176
:101CE0000C944A0E2091180630911906C9010197EB
:101CF00080319E4038F00E94060A6091180670916B
:101D0000190693C0A8EEB3E00E94081A6093100170
:101D0000190693C0A8EEB3E00E94091A609310016F
:101D100070931101809312019093130120911A0680
:101D200030911B06C901019780319E4038F00E9416
:101D3000060A60911A0670911B0677C0A8EEB3E000
:101D40000E94081A60930C0170930D0180930E019C
:101D40000E94091A60930C0170930D0180930E019B
:101D500090930F0120911C0630911D0621318EE0D9
:101D6000380738F00E94060A60911C0670911D0623
:101D70005CC0A8EEB3E00E94081A6093080170935B
:101D70005CC0A8EEB3E00E94091A6093080170935A
:101D8000090180930A0190930B0180911E069091A6
:101D90001F068536910518F00E94060A42C09093EE
:101DA0000701809306016DEB73E080919706909197
@ -602,14 +602,14 @@
:1025900050F420919C0430919D042F5F3F4F309365
:1025A0009D0420939C0460930E0670930F06809305
:1025B00010069093110681E795E00E94C902892BCD
:1025C00009F4EBC281E795E00E94A702D82E9CE2B5
:1025D000D91219C0E091A004E73008F0DEC281E012
:1025C00009F428C381E795E00E94A702D82E9CE277
:1025D000D91219C0E091A004E73008F01BC381E0D4
:1025E0008E0F8093A004F0E0EE0FFF1FE85EF94F1E
:1025F00080919E0490919F049183808310929F0408
:1026000010929E04CAC280ED8D0D8A30A0F42091F4
:1026000010929E0407C380ED8D0D8A30A0F42091B6
:102610009E0430919F04EAE0E29FC001E39F900D89
:102620001124C0978D0D911DD7FC9A9590939F040E
:1026300080939E04B2C28FE98D0D8A3108F0ADC23D
:1026300080939E04EFC28FE98D0D8A3108F0EAC2C3
:1026400080917005882309F44BC0E091A004F0E06C
:10265000EE0FFF1FE85EF94F80919E0490919F045A
:10266000918380836FEB72E081E795E00E948103A4
@ -621,32 +621,32 @@
:1026C00095E00E9481036091A00470E06F5F7F4FEE
:1026D00081E795E00E94FB0D81E795E00E94BA0337
:1026E0008D2DDD0C990BAA0BBB0BFC01E156F109FA
:1026F000E731F10508F043C2EC5CFF4F0C94021A7D
:1026F000E731F10508F080C2EC5CFF4F0C94031A3F
:102700008091A004E82FF0E0EE0FFF1FE85EF94F84
:1027100020919E0430919F04318320838F5F0E941B
:1027200050102DC28091A004E82FF0E0EE0FFF1FA3
:1027200050106AC28091A004E82FF0E0EE0FFF1F66
:10273000E85EF94F20919E0430919F0431832083FD
:1027400000911806109119068F3F61F0063150F480
:10275000F801FF27EE0FFF1FE859FE4F808191819E
:1027600097FF05C00E94060A6BE972E0D0C4992762
:10277000FC01EE5CFE4F20812111C2C4FC01EE0F72
:1027600097FF05C00E94060A6BE972E00DC5992724
:10277000FC01EE5CFE4F20812111FFC4FC01EE0F35
:10278000FF1FEC5BFE4F208131813327F901EC50B4
:10279000FC4F4491F901E15BFB4F2491222309F4A2
:1027A000A4C42250E22FF0E0EE0FFF1FE45DFE4FC5
:1027A000E1C42250E22FF0E0EE0FFF1FE45DFE4F88
:1027B000A081B1813C91409543234C933C913111D0
:1027C0009FC46091680041E050E04A0102C0880C5B
:1027C000DCC46091680041E050E04A0102C0880C1E
:1027D000991C2A95E2F794012095262320936800FE
:1027E0008FC41A82198263E4C3010E942A0466E638
:1027E000CCC41A82198263E4C3010E942A0466E6FB
:1027F000C3010E942A0467E6C3010E942A04B3E7CA
:10280000CB2EB6E0DB2EF60181E02191319137FF2E
:102810008F5FA7E9AA2EA6E0BA2EAE16BF06A9F7CB
:102820008F5F8D8B682FC3010E942A04E090060100
:10283000F0900701609108017091090180910A01EF
:1028400090910B0128EE33E040E050E00E94E01947
:1028400090910B0128EE33E040E050E00E94E11946
:1028500019012A0160910C0170910D0180910E0106
:1028600090910F0128EE33E040E050E00E94E01923
:1028600090910F0128EE33E040E050E00E94E11922
:1028700049015A016091100170911101809112017A
:102880009091130128EE33E040E050E00E94E019FF
:102880009091130128EE33E040E050E00E94E119FE
:10289000BA01A9018101940169E4C3010E944704BE
:1028A00020910201309103014091040150910501F2
:1028B000E12CF12C00E010E064E5C3010E94470424
@ -659,286 +659,286 @@
:1029200026E0D206C9F66AE772E081E795E00E94E8
:1029300081036D8981E795E00E94430E67E772E0AD
:1029400081E795E00E94810369817A8181E795E0C2
:102950000E94310E14C10E943F0911C18091A00450
:102950000E94310E51C10E943F094EC18091A004D6
:10296000E82FF0E0EE0FFF1FE85EF94F20919E0484
:1029700030919F04318320838F5F0E945C0EFFC0E3
:102980008091A004E82FF0E0EE0FFF1FE85EF94F02
:1029900020919E0430919F0431832083209118065A
:1029A000309119062130310509F0E9C08F3F09F453
:1029B000E6C061E772E09DC30E946C0CE0C00E941B
:1029C00044104B015C0166E672E08091970690919D
:1029D00098060E9481030E940C09809197069091AD
:1029E00098060E94BA030E9498080E94740864E640
:1029F00072E080919706909198060E948103609101
:102A0000700580919706909198060E944A0E43E7C0
:102A1000E42E46E0F42E00E010E0F7018191919160
:102A20007F0197FD16C0C8010E941F0861E672E091
:102A300080919706909198060E948103A5019401C8
:102A400061E0C8010E948004B501A401C8010E9490
:102A5000D4060F5F1F4F02311105F9F680E090E0B8
:102A60000E9428040091970610919806833409F07B
:102A700049C481E090E00E942804863609F042C4EF
:102A800082E090E00E942804873609F03BC44DC3E1
:102A90008091A004E82FF0E0EE0FFF1FE85EF94FF1
:102AA00020919E0430919F04318320838F5F0E9488
:102AB0001C0F65C08091A004E82FF0E0EE0FFF1F0F
:102AC000E85EF94F20919E0430919F04318320836A
:102AD0008F3F89F40E94060A6AEC71E080919706A4
:102AE000909198060E948103809197069091980694
:102AF0000E94BA0344C0809118069091190683334E
:102B0000910520F5809370056FEC71E028C08091ED
:102B1000A004E82FF0E0EE0FFF1FE85EF94F2091D0
:102B20009E0430919F04318320838F3F29F40E94BB
:102B3000060A69EA71E0D2CF8091180690911906D1
:102B40009C0121503109273E334018F00E94060AAB
:102B50000CC090930101809300016EEA71E08091B6
:102B60009706909198060E948103609118067091D3
:102B7000190680919706909198060E94E90D10928F
:102B8000A00410929F0410929E04E8E1F6E01192D6
:102B9000119216E0E832F107D1F7809195069091F5
:102BA000960697FD7BC10E9444106B017C01209129
:102BB0000001309101018091A1049091A204A091A3
:102BC000A304B091A404B701A601481B590B6A0BDA
:102BD0007B0BC901A0E0B0E084179507A607B707F3
:102BE00008F05CC190911706923001F128F4992306
:102BF00049F0913069F048C1943051F108F19530B5
:102C0000A9F142C160E082E00E94B40F81E00BC0F4
:102C1000C9010296A0E0B0E0481759076A077B0790
:102C200008F43CC182E08093170638C10E94780FF7
:102C3000909316068093150623E0209317062EC165
:102C400061E082E00E94B40F34E03093170626C1A1
:102C5000C9010496A0E0B0E0481759076A077B074E
:102C600008F41CC145E04093170618C10E94780F74
:102C7000909314068093130610921706C092A10435
:102C8000D092A204E092A304F092A404209115062D
:102C900030911606821B930B2091020130910301A3
:102CA0002817390754F0209104013091050182174B
:102CB00093070CF0A0C010E001C011E08091120653
:102CC000811709F498C010931206612F8CE00E94BE
:102CD000B40F0E9444109B01AC01612F81E10E945E
:102CE0000E0A809170058A3008F485C062E073E0B6
:102CF00080919706909198060E94810365E170E0AB
:102D000080919706909198060E94FB0D69EF72E002
:102D100080919706909198060E94810361E170E08E
:102D200080919706909198060E94FB0D6DEE72E0DF
:102D300080919706909198060E94810365E170E06A
:102D400080919706909198060E94FB0D69EE72E0C3
:102D500080919706909198060E94810364EE72E03C
:102D600080919706909198060E948103612F80912F
:102D70009706909198060E94430E69ED72E080914B
:102D80009706909198060E948103609111058091A9
:102D90009706909198060E94430E60ED72E0809134
:102DA0009706909198060E94810340910D055091DD
:102DB0000E0560910F057091100580919706909116
:102DC00098060E94E00D66EC72E080919706909163
:102DD00098060E9481036091C7047091C804809195
:102DE0009706909198060E94E30D80919706909126
:102DF00098060E94BA0380917005893150F1809144
:102E00001306909114062091150630911606AC0118
:102E1000421B530B5F934F933F932F939F938F933B
:102E200087E991E09F938F937F926F920E94301A6F
:102E30000091970610919806B301C8010E94A5035E
:102E4000C8010E94BA030FB6F894DEBF0FBECDBF13
:102E500025C0843118F16AE273E080919706909161
:102E600098060E9481036091130670911406809168
:102E7000150690911606681B790B80919706909124
:102E800098060E94310E0AC01092170669E073E09E
:102E900080919706909198060E94BE0380917005DC
:102EA0008A3060F50E94441000916C0510916D0508
:102EB00020916E0530916F054B015C01801A910ADB
:102EC000A20AB30AC0901001D0901101E090120143
:102ED000F0901301C814D904EA04FB0408F4D6C026
:102EE000C0900C01D0900D01E0900E01F0900F0108
:102EF000E3E7F6E0A4E2B5E040E0C1C053E7A52E69
:102F000056E0B52E62E1E62E65E0F62E74E4C72E9B
:102F100071E0D72E00E010E0F501819091905F0103
:102F2000181419040CF085C0F6014080842D0E940D
:102F30008B0F582EF7018081581609F47AC0508201
:102F400065E673E080919706909198060E94810350
:102F5000B40180919706909198060E94FB0D69E557
:102F600073E080919706909198060E948103642DEA
:102F700080919706909198060E94430E67E573E052
:102F800080919706909198060E9481036AE473E00D
:102F900080919706909198060E948103652D8091FB
:102FA0009706909198060E94430E6FE373E080911C
:102FB0009706909198060E94810360911105809177
:102FC0009706909198060E94430E66E373E0809105
:102FD0009706909198060E948103F801EE0FFF1F5B
:102FE000EE0FFF1FE753FB4F4081518162817381D8
:102FF00080919706909198060E94E00D6CE273E034
:1030000080919706909198060E948103F801EE0F37
:10301000FF1FEB55FB4F6081718180919706909166
:1030200098060E94E30D80919706909198060E9461
:10303000BA030F5F1F4FFFEFEF1AFF0A22E0C20E25
:10304000D11C0231110509F067CF2CCF0D911D91D4
:103050002D913C9113974B015C01801A910AA20AB1
:10306000B30AC814D904EA04FB0408F441E0149636
:1030700027E9A22E26E0B22EAE16BF0629F0219136
:10308000319137FDF4CFE2CF442361F10E94441027
:103090004B015C0183E7E82E86E0F82E00E010E0AB
:1030A000F701819191917F0197FD0FC0A5019401D6
:1030B00060E0C8010E94800480917005853028F08E
:1030C000B501A401C8010E94D4060F5F1F4F023151
:1030D000110531F780926C0590926D05A0926E05F6
:1030E000B0926F050E94700345CA0E94060A64E907
:1030F00072E080919706909198060E94BE033FCDA2
:1031000040E050E0BA010E94FD0B69E872E0809156
:103110009706909198060E948103602F80919706F0
:10312000909198060E944A0E2ACD83E090E00E947A
:103130002804482EF4E1F81718F460E172E0E4C0C6
:10314000C8010E94BA036EEF71E0809197069091DA
:1031500098060E94810380E090E00E942804682F76
:1031600080919706909198060E947A0381E090E002
:103170000E942804682F80919706909198060E94DB
:103180007A0382E090E00E942804682F80919706DD
:10319000909198060E947A0365EF71E080919706FE
:1031A000909198060E94810383E090E00E94280499
:1031B000682F70E080919706909198060E94FB0D11
:1031C00080919706909198060E94BA03512C04E0D2
:1031D00010E0451409F49BC0C8010E942804382E51
:1031E000C80101960E942804F82EC80102960E9488
:1031F0002804882E912C982C88248F0C911CC801AF
:1032000003960E942804F82EC80104960E94280400
:10321000A82EB12CBA2CAA24AF0CB11CC80105965B
:103220000E942804F82EC80106960E942804C82E81
:10323000D12CDC2CCC24CF0CD11CC80107960E94C9
:103240002804F82EC80108960E94280490E0982FC0
:1032500088279C012F0D311D7901075F1F4F6CEEF0
:1032600071E080919706909198060E948103632DEA
:1032700080919706909198060E947A036AEE71E019
:1032800080919706909198060E948103B4018091E5
:103290009706909198060E94E30D68EE71E0809188
:1032A0009706909198060E948103B5018091970638
:1032B000909198060E94E30D66EE71E0809197066A
:1032C000909198060E948103B60180919706909193
:1032D00098060E94E30D64EE71E08091970690914C
:1032E00098060E948103B7018091970690919806F5
:1032F0000E94E30D80919706909198060E94BA0370
:10330000539467CF6BE272E0C8010E94BE036FE482
:1033100072E080919706909198060E948103C09078
:103320006C05D0906D05E0906E05F0906F05809172
:10333000100190911101A0911201B0911301C80EDA
:10334000D91EEA1EFB1E0E94441046015701861A30
:10335000970AA80AB90AB501A4018091970690912D
:1033600098060E94E00D61E472E0B8CBF999FECFB7
:1033700092BD81BDF89A992780B50895262FF999B5
:10338000FECF1FBA92BD81BD20BD0FB6F894FA9A48
:10339000F99A0FBE0196089597FB072E16F4009434
:1033A00007D077FD09D00E94171A07FC05D03EF41C
:1033B000909581959F4F0895709561957F4F0895E1
:1033C000A1E21A2EAA1BBB1BFD010DC0AA1FBB1F29
:1033D000EE1FFF1FA217B307E407F50720F0A21B9B
:1033E000B30BE40BF50B661F771F881F991F1A9408
:1033F00069F760957095809590959B01AC01BD0132
:10340000CF010895EE0FFF1F0590F491E02D099470
:10341000A29FB001B39FC001A39F700D811D112415
:10342000911DB29F700D811D1124911D0895AA1B3D
:10343000BB1B51E107C0AA1FBB1FA617B70710F09F
:10344000A61BB70B881F991F5A95A9F780959095D1
:10345000BC01CD01089581E090E0F8940C941A1D10
:10346000AEE0B0E0E6E3FAE10C94F11C0D891E89B0
:1034700086E08C831A8309838FEF9FE79E838D8379
:10348000AE01475E5F4F6F89788DCE0101960E9435
:10349000521AEF81F885E00FF11F10822E96E4E0BA
:1034A0000C940D1DABE0B0E0E8E5FAE10C94E31CF0
:1034B0006C017B018A01FC0117821682838181FFE6
:1034C000CCC1CE0101963C01F6019381F70193FD39
:1034D000859193FF81917F01882309F4BAC18532D8
:1034E00039F493FD859193FF81917F01853229F411
:1034F000B60190E00E94491CE7CF912C212C312C81
:10350000FFE1F315D8F08B3279F038F4803279F09E
:103510008332A1F4232D20611DC08D3261F08033F0
:1035200069F4232D216016C0832D8260382EE32D8F
:10353000E4603E2E2AC0F32DF8601DC037FC2DC07C
:1035400020ED280F2A3040F08E32B9F436FC81C1CC
:10355000232D2064322E19C036FE06C08AE0989EC4
:10356000200D1124922E11C0EAE02E9E200D112470
:10357000222EF32DF0623F2E08C08C3621F4832DCD
:103580008068382E02C0883641F4F70193FD85919A
:1035900093FF81917F018111B3CF982F9F7D955427
:1035A000933028F40C5F1F4F9FE399830DC083363F
:1035B00031F0833771F0833509F059C021C0F8012B
:1035C000808189830E5F1F4F88248394912C53013F
:1035D00013C02801F2E04F0E511CF801A080B18009
:1035E00036FE03C0692D70E002C06FEF7FEFC501AA
:1035F0000E943E1C4C018201F32DFF773F2E16C026
:10360000280122E0420E511CF801A080B18036FE54
:1036100003C0692D70E002C06FEF7FEFC5010E940B
:10362000331C4C01F32DF0683F2E820133FC1BC08C
:10363000822D90E088169906B0F4B60180E290E001
:103640000E94491C2A94F4CFF50137FC859137FE7E
:1036500081915F01B60190E00E94491C21102A94DB
:1036600021E0821A91088114910471F7E8C0843630
:1036700011F0893641F5F80137FE07C0608171818C
:10368000828193810C5F1F4F08C060817181072E7A
:10369000000C880B990B0E5F1F4FF32DFF763F2E0A
:1036A00097FF09C090958095709561957F4F8F4FDA
:1036B0009F4FF0683F2E2AE030E0A3010E94851C56
:1036C000882E861845C0853731F4232D2F7EB22EE3
:1036D0002AE030E025C0932D997FB92E8F36C1F0B6
:1036E00018F4883579F0B5C0803719F0883721F0A3
:1036F000B0C0E92FE061BE2EB4FE0DC0FB2DF4601A
:10370000BF2E09C034FE0AC0292F2660B22E06C083
:1037100028E030E005C020E130E002C020E132E0E6
:10372000F801B7FE07C060817181828193810C5FCF
:103730001F4F06C06081718180E090E00E5F1F4FD7
:10374000A3010E94851C882E8618FB2DFF773F2E33
:1037500036FE0DC0232D2E7FA22E891458F434FE80
:103760000BC032FC09C0832D8E7EA82E05C0B82C5C
:10377000A32C03C0B82C01C0B92CA4FE0FC0FE01BD
:10378000E80DF11D8081803321F49A2D997EA92EB8
:1037900009C0A2FE06C0B394B39404C08A2D8678F3
:1037A00009F0B394A3FC11C0A0FE06C0B21488F4C3
:1037B000280C922C9B180EC0B21460F4B60180E263
:1037C00090E00E94491CB394F7CFB21418F42B1860
:1037D00002C0982C212CA4FE10C0B60180E390E01A
:1037E0000E94491CA2FE17C0A1FC03C088E790E01C
:1037F00002C088E590E0B6010CC08A2D867859F0A9
:10380000A1FE02C08BE201C080E2A7FC8DE2B601FE
:1038100090E00E94491C891438F4B60180E390E0DE
:103820000E94491C9A94F7CF8A94F301E80DF11D88
:103830008081B60190E00E94491C8110F5CF2220C2
:1038400009F442CEB60180E290E00E94491C2A941D
:10385000F6CFF6018681978102C08FEF9FEF2B96FE
:10386000E2E10C94FF1CFC010590615070400110D6
:10387000D8F7809590958E0F9F1F0895FC01615099
:10388000704001900110D8F7809590958E0F9F1F82
:1038900008950F931F93CF93DF93FB01238121FDA5
:1038A00003C08FEF9FEF2CC022FF16C046815781C7
:1038B000248135814217530744F4A081B1819D01D1
:1038C0002F5F3F4F318320838C93268137812F5F79
:1038D0003F4F3783268314C08B01EC01FB0100842A
:1038E000F185E02D0995892BE1F6D80116968D9189
:1038F0009C911797019617969C938E931697CE01DD
:10390000DF91CF911F910F910895FA01AA272830D6
:1039100051F1203181F1E8946F936E7F6E5F7F4F9C
:103920008F4F9F4FAF4FB1E03ED0B4E03CD0670F18
:10393000781F891F9A1FA11D680F791F8A1F911D6B
:10394000A11D6A0F711D811D911DA11D20D009F4BB
:1039500068943F912AE0269F11243019305D3193FD
:10396000DEF6CF010895462F4770405D4193B3E0E6
:103970000FD0C9F7F6CF462F4F70405D4A3318F08D
:10398000495D31FD4052419302D0A9F7EACFB4E03E
:10399000A6959795879577956795BA95C9F70097F6
:1039A0006105710508959B01AC010A2E0694579597
:1039B000479537952795BA95C9F7620F731F841FEE
:1039C000951FA01D08952F923F924F925F926F9284
:1039D0007F928F929F92AF92BF92CF92DF92EF929F
:1039E000FF920F931F93CF93DF93CDB7DEB7CA1B20
:1039F000DB0B0FB6F894DEBF0FBECDBF09942A884B
:103A0000398848885F846E847D848C849B84AA84F2
:103A1000B984C884DF80EE80FD800C811B81AA817F
:103A2000B981CE0FD11D0FB6F894DEBF0FBECDBF4A
:083A3000ED010895F894FFCFA9
:103A380014006E0064000200D007000060EA000075
:103A4800307500000D1307080E0000000000010388
:103A58006A0298024E03C902A702BB026B006C00FF
:103A68006D000000000000000000000000000000E1
:103A7800000000010300040005000600070008001C
:103A880009000A000B000C000E000F0010001100C6
:103A98001200130014001500FFFFFFFFFFFF0000D6
:103AA80001000200030004000500060007000800EA
:103AB800FFFF09000A000B000C000D000E000F00AC
:103AC800100011000D0A004C2534642C20253464A4
:0A3AD800202D3E202520346400005C
:1029700030919F04318320838F5F0E945C0E3CC1A5
:102980001091A004E12FF0E0EE0FFF1FE85EF94F79
:1029900080919E0490919F04918380830E944410B3
:1029A0008091180690911906019709F025C11F3FE3
:1029B00009F422C161E772E0A7C00E946C0C1CC13F
:1029C0000E9444104B015C0166E672E0809197061C
:1029D000909198060E9481030E940C0980919706AD
:1029E000909198060E94BA030E9498080E94740869
:1029F00064E672E080919706909198060E948103A8
:102A00006091700580919706909198060E944A0EF9
:102A100043E7E42E46E0F42E00E010E0F701819158
:102A200091917F0197FD16C0C8010E941F0861E6C1
:102A300072E080919706909198060E948103A5010B
:102A4000940161E0C8010E948004B501A401C8019D
:102A50000E94D4060F5F1F4F02311105F9F680E086
:102A600090E00E9428040091970610919806833404
:102A700009F07AC481E090E00E942804863609F0CB
:102A800073C482E090E00E942804873609F06CC489
:102A900083E090E00E942804482EF4E1F81708F043
:102AA00081C360E172E0C8010E94BE036FE472E07E
:102AB00080919706909198060E948103C0906C05C2
:102AC000D0906D05E0906E05F0906F05809110013B
:102AD00090911101A0911201B0911301C80ED91E5D
:102AE000EA1EFB1E0E94441046015701861A970AEF
:102AF000A80AB90AB501A401809197069091980699
:102B00000E94E00D61E472E0809197069091980632
:102B10000E94810380919706909198060E94BA03C3
:102B20006BC08091A004E82FF0E0EE0FFF1FE85E7D
:102B3000F94F20919E0430919F04318320838F5F51
:102B40000E941C0F59C08091A004E82FF0E0EE0F06
:102B5000FF1FE85EF94F20919E0430919F0431835E
:102B600020838F3F29F40E94060A6AEC71E0CCCFE3
:102B700080911806909119068333910520F5809372
:102B800070056FEC71E028C08091A004E82FF0E0A0
:102B9000EE0FFF1FE85EF94F20919E0430919F04D5
:102BA000318320838F3F29F40E94060A69EA71E08D
:102BB000ABCF80911806909119069C0121503109E4
:102BC000273E334018F00E94060A0CC09093010182
:102BD000809300016EEA71E08091970690919806CB
:102BE0000E948103609118067091190680919706E2
:102BF000909198060E94E90D1092A00410929F04F3
:102C000010929E04E8E1F6E01192119216E0E8328B
:102C1000F107D1F7809195069091960697FD7BC1BB
:102C20000E9444106B017C01209100013091010150
:102C30008091A1049091A204A091A304B091A40456
:102C4000B701A601481B590B6A0B7B0BC901A0E019
:102C5000B0E084179507A607B70708F05CC190910C
:102C60001706923001F128F4992349F0913069F068
:102C700048C1943051F108F19530A9F142C160E0AA
:102C800082E00E94B40F81E00BC0C9010296A0E06F
:102C9000B0E0481759076A077B0708F43CC182E097
:102CA0008093170638C10E94780F90931606809380
:102CB000150623E0209317062EC161E082E00E94F2
:102CC000B40F34E03093170626C1C9010496A0E082
:102CD000B0E0481759076A077B0708F41CC145E0B4
:102CE0004093170618C10E94780F909314068093A2
:102CF000130610921706C092A104D092A204E0928B
:102D0000A304F092A4042091150630911606821BAC
:102D1000930B20910201309103012817390754F0D9
:102D20002091040130910501821793070CF0A0C097
:102D300010E001C011E080911206811709F498C0DB
:102D400010931206612F8CE00E94B40F0E94441071
:102D50009B01AC01612F81E10E940E0A80917005F8
:102D60008A3008F485C062E073E080919706909104
:102D700098060E94810365E170E08091970690912A
:102D800098060E94FB0D69EF72E080919706909182
:102D900098060E94810361E170E08091970690910E
:102DA00098060E94FB0D6DEE72E08091970690915F
:102DB00098060E94810365E170E0809197069091EA
:102DC00098060E94FB0D69EE72E080919706909143
:102DD00098060E94810364EE72E0809197069091BC
:102DE00098060E948103612F809197069091980622
:102DF0000E94430E69ED72E08091970690919806CB
:102E00000E94810360911105809197069091980628
:102E10000E94430E60ED72E08091970690919806B3
:102E20000E94810340910D0550910E0560910F05A0
:102E30007091100580919706909198060E94E00D80
:102E400066EC72E080919706909198060E9481034B
:102E50006091C7047091C80480919706909198067C
:102E60000E94E30D80919706909198060E94BA0304
:102E700080917005893150F180911306909114066C
:102E80002091150630911606AC01421B530B5F933F
:102E90004F933F932F939F938F9387E991E09F9355
:102EA0008F937F926F920E94311A00919706109132
:102EB0009806B301C8010E94A503C8010E94BA0385
:102EC0000FB6F894DEBF0FBECDBF25C0843118F118
:102ED0006AE273E080919706909198060E948103C0
:102EE0006091130670911406809115069091160654
:102EF000681B790B80919706909198060E94310E7D
:102F00000AC01092170669E073E0809197069091CD
:102F100098060E94BE03809170058A3060F50E9479
:102F2000441000916C0510916D0520916E05309153
:102F30006F054B015C01801A910AA20AB30AC09086
:102F40001001D0901101E0901201F0901301C8140B
:102F5000D904EA04FB0408F4D6C0C0900C01D09058
:102F60000D01E0900E01F0900F01E3E7F6E0A4E21E
:102F7000B5E040E0C1C053E7A52E56E0B52E62E1B2
:102F8000E62E65E0F62E74E4C72E71E0D72E00E041
:102F900010E0F501819091905F01181419040CF074
:102FA00085C0F6014080842D0E948B0F582EF701BA
:102FB0008081581609F47AC0508265E673E08091EA
:102FC0009706909198060E948103B401809197061C
:102FD000909198060E94FB0D69E573E08091970639
:102FE000909198060E948103642D8091970690919C
:102FF00098060E94430E67E573E0809197069091D2
:1030000098060E9481036AE473E08091970690918C
:1030100098060E948103652D8091970690919806ED
:103020000E94430E6FE373E080919706909198069B
:103030000E948103609111058091970690919806F6
:103040000E94430E66E373E0809197069091980684
:103050000E948103F801EE0FFF1FEE0FFF1FE753E1
:10306000FB4F4081518162817381809197069091DD
:1030700098060E94E00D6CE273E0809197069091B3
:1030800098060E948103F801EE0FFF1FEB55FB4FDE
:103090006081718180919706909198060E94E30D5E
:1030A00080919706909198060E94BA030F5F1F4F78
:1030B000FFEFEF1AFF0A22E0C20ED11C0231110508
:1030C00009F067CF2CCF0D911D912D913C91139755
:1030D0004B015C01801A910AA20AB30AC814D904F0
:1030E000EA04FB0408F441E0149627E9A22E26E046
:1030F000B22EAE16BF0629F02191319137FDF4CFE3
:10310000E2CF442361F10E9444104B015C0183E74C
:10311000E82E86E0F82E00E010E0F7018191919111
:103120007F0197FD0FC0A501940160E0C8010E94D6
:10313000800480917005853028F0B501A401C80194
:103140000E94D4060F5F1F4F0231110531F78092A4
:103150006C0590926D05A0926E05B0926F050E946D
:10316000700308CA0E94060A64E972E0809197061B
:10317000909198060E94BE033FCD40E050E0BA0116
:103180000E94FD0B69E872E0809197069091980685
:103190000E948103602F80919706909198060E946B
:1031A0004A0E2ACDC8010E94BA036EEF71E08091E9
:1031B0009706909198060E94810380E090E00E941B
:1031C0002804682F80919706909198060E947A03B0
:1031D00081E090E00E942804682F809197069091EA
:1031E00098060E947A0382E090E00E942804682FEB
:1031F00080919706909198060E947A0365EF71E09E
:1032000080919706909198060E94810383E090E058
:103210000E942804682F70E080919706909198068C
:103220000E94FB0D80919706909198060E94BA0328
:10323000512C04E010E0451409F438CCC8010E9478
:103240002804382EC80101960E942804F82EC801CF
:1032500002960E942804882E912C982C88248F0C8A
:10326000911CC80103960E942804F82EC8010496F8
:103270000E942804A82EB12CBA2CAA24AF0CB11C91
:10328000C80105960E942804F82EC80106960E94DF
:103290002804C82ED12CDC2CCC24CF0CD11CC80186
:1032A00007960E942804F82EC80108960E94280458
:1032B00090E0982F88279C012F0D311D7901075F21
:1032C0001F4F6CEE71E080919706909198060E94D6
:1032D0008103632D80919706909198060E947A034E
:1032E0006AEE71E080919706909198060E948103A2
:1032F000B40180919706909198060E94E30D68EEC4
:1033000071E080919706909198060E948103B50123
:1033100080919706909198060E94E30D66EE71E009
:1033200080919706909198060E948103B601809142
:103330009706909198060E94E30D64EE71E08091EB
:103340009706909198060E948103B7018091970695
:10335000909198060E94E30D8091970690919806AF
:103360000E94BA03539467CF6BE272E09CCBF99949
:10337000FECF92BD81BDF89A992780B50895262F7A
:10338000F999FECF1FBA92BD81BD20BD0FB6F8944A
:10339000FA9AF99A0FBE0196089597FB072E16F434
:1033A000009407D077FD09D00E94181A07FC05D0B9
:1033B0003EF4909581959F4F0895709561957F4F4C
:1033C0000895A1E21A2EAA1BBB1BFD010DC0AA1F66
:1033D000BB1FEE1FFF1FA217B307E407F50720F07E
:1033E000A21BB30BE40BF50B661F771F881F991FF9
:1033F0001A9469F760957095809590959B01AC0142
:10340000BD01CF010895EE0FFF1F0590F491E02D4F
:103410000994A29FB001B39FC001A39F700D811DAD
:103420001124911DB29F700D811D1124911D0895CD
:10343000AA1BBB1B51E107C0AA1FBB1FA617B707DA
:1034400010F0A61BB70B881F991F5A95A9F78095F6
:103450009095BC01CD01089581E090E0F8940C9422
:103460001B1DAEE0B0E0E7E3FAE10C94F21C0D891D
:103470001E8986E08C831A8309838FEF9FE79E83E2
:103480008D83AE01475E5F4F6F89788DCE010196C7
:103490000E94531AEF81F885E00FF11F10822E96DB
:1034A000E4E00C940E1DABE0B0E0E9E5FAE10C9429
:1034B000E41C6C017B018A01FC0117821682838166
:1034C00081FFCCC1CE0101963C01F6019381F70149
:1034D00093FD859193FF81917F01882309F4BAC1FF
:1034E000853239F493FD859193FF81917F01853277
:1034F00029F4B60190E00E944A1CE7CF912C212CC0
:10350000312CFFE1F315D8F08B3279F038F48032AA
:1035100079F08332A1F4232D20611DC08D3261F03A
:10352000803369F4232D216016C0832D8260382EEC
:10353000E32DE4603E2E2AC0F32DF8601DC037FC59
:103540002DC020ED280F2A3040F08E32B9F436FC21
:1035500081C1232D2064322E19C036FE06C08AE0B8
:10356000989E200D1124922E11C0EAE02E9E200D6F
:103570001124222EF32DF0623F2E08C08C3621F448
:10358000832D8068382E02C0883641F4F70193FD00
:10359000859193FF81917F018111B3CF982F9F7DFA
:1035A0009554933028F40C5F1F4F9FE399830DC00F
:1035B000833631F0833771F0833509F059C021C06B
:1035C000F801808189830E5F1F4F88248394912C9A
:1035D000530113C02801F2E04F0E511CF801A080E6
:1035E000B18036FE03C0692D70E002C06FEF7FEF3F
:1035F000C5010E943F1C4C018201F32DFF773F2E35
:1036000016C0280122E0420E511CF801A080B180B2
:1036100036FE03C0692D70E002C06FEF7FEFC50179
:103620000E94341C4C01F32DF0683F2E820133FCC4
:103630001BC0822D90E088169906B0F4B60180E296
:1036400090E00E944A1C2A94F4CFF50137FC859142
:1036500037FE81915F01B60190E00E944A1C211063
:103660002A9421E0821A91088114910471F7E8C02C
:10367000843611F0893641F5F80137FE07C06081C4
:103680007181828193810C5F1F4F08C060817181BD
:10369000072E000C880B990B0E5F1F4FF32DFF7642
:1036A0003F2E97FF09C090958095709561957F4F4B
:1036B0008F4F9F4FF0683F2E2AE030E0A3010E9419
:1036C000861C882E861845C0853731F4232D2F7E21
:1036D000B22E2AE030E025C0932D997FB92E8F3687
:1036E000C1F018F4883579F0B5C0803719F0883703
:1036F00021F0B0C0E92FE061BE2EB4FE0DC0FB2D5D
:10370000F460BF2E09C034FE0AC0292F2660B22EF5
:1037100006C028E030E005C020E130E002C020E132
:1037200032E0F801B7FE07C0608171818281938128
:103730000C5F1F4F06C06081718180E090E00E5FDA
:103740001F4FA3010E94861C882E8618FB2DFF7731
:103750003F2E36FE0DC0232D2E7FA22E891458F445
:1037600034FE0BC032FC09C0832D8E7EA82E05C00E
:10377000B82CA32C03C0B82C01C0B92CA4FE0FC0D8
:10378000FE01E80DF11D8081803321F49A2D997E90
:10379000A92E09C0A2FE06C0B394B39404C08A2D1A
:1037A000867809F0B394A3FC11C0A0FE06C0B21441
:1037B00088F4280C922C9B180EC0B21460F4B60149
:1037C00080E290E00E944A1CB394F7CFB21418F440
:1037D0002B1802C0982C212CA4FE10C0B60180E347
:1037E00090E00E944A1CA2FE17C0A1FC03C088E71B
:1037F00090E002C088E590E0B6010CC08A2D867882
:1038000059F0A1FE02C08BE201C080E2A7FC8DE26C
:10381000B60190E00E944A1C891438F4B60180E396
:1038200090E00E944A1C9A94F7CF8A94F301E80D25
:10383000F11D8081B60190E00E944A1C8110F5CFF5
:10384000222009F442CEB60180E290E00E944A1C98
:103850002A94F6CFF6018681978102C08FEF9FEF01
:103860002B96E2E10C94001DFC0105906150704024
:103870000110D8F7809590958E0F9F1F0895FC0139
:103880006150704001900110D8F7809590958E0F8F
:103890009F1F08950F931F93CF93DF93FB01238105
:1038A00021FD03C08FEF9FEF2CC022FF16C0468181
:1038B0005781248135814217530744F4A081B18197
:1038C0009D012F5F3F4F318320838C932681378169
:1038D0002F5F3F4F3783268314C08B01EC01FB0120
:1038E0000084F185E02D0995892BE1F6D801169623
:1038F0008D919C911797019617969C938E9316978E
:10390000CE01DF91CF911F910F910895FA01AA275F
:10391000283051F1203181F1E8946F936E7F6E5F12
:103920007F4F8F4F9F4FAF4FB1E03ED0B4E03CD0C0
:10393000670F781F891F9A1FA11D680F791F8A1FA3
:10394000911DA11D6A0F711D811D911DA11D20D00A
:1039500009F468943F912AE0269F11243019305DC4
:103960003193DEF6CF010895462F4770405D4193B5
:10397000B3E00FD0C9F7F6CF462F4F70405D4A3302
:1039800018F0495D31FD4052419302D0A9F7EACFCA
:10399000B4E0A6959795879577956795BA95C9F7F9
:1039A00000976105710508959B01AC010A2E0694EC
:1039B0005795479537952795BA95C9F7620F731FA5
:1039C000841F951FA01D08952F923F924F925F92E2
:1039D0006F927F928F929F92AF92BF92CF92DF921F
:1039E000EF92FF920F931F93CF93DF93CDB7DEB784
:1039F000CA1BDB0B0FB6F894DEBF0FBECDBF099418
:103A00002A88398848885F846E847D848C849B846E
:103A1000AA84B984C884DF80EE80FD800C811B817C
:103A2000AA81B981CE0FD11D0FB6F894DEBF0FBEAB
:0A3A3000CDBFED010895F894FFCF1B
:103A3A0014006E0064000200D007000060EA000073
:103A4A00307500000D1307080E0000000000010386
:103A5A006A0298024E03C902A702BB026B006C00FD
:103A6A006D000000000000000000000000000000DF
:103A7A00000000010300040005000600070008001A
:103A8A0009000A000B000C000E000F0010001100C4
:103A9A001200130014001500FFFFFFFFFFFF0000D4
:103AAA0001000200030004000500060007000800E8
:103ABA00FFFF09000A000B000C000D000E000F00AA
:103ACA00100011000D0A004C2534642C20253464A2
:0A3ADA00202D3E202520346400005A
:00000001FF

View File

@ -93,6 +93,7 @@
21.7.19 - V3.30 replace delay during analog read with millis() logic, optimize waiting times for analog read
10.8.19 - V3.32 add ICACHE_RAM_ATTR for ISRs and remove remaining long casts (bug) when handling time
12.8.19 - V3.33 fix handling of keepalive timeouts when millis wraps
V3.34 add RSSI output when devVerbose >= 5 in kealive responses
ToDo / Ideas:
make analogInterval available in Fhem
@ -103,7 +104,7 @@
*/
/* Remove this before compiling */
/* #define TestConfig */
#define TestConfig // include my SSID / secret
/* allow printing of every pin change to Serial */
@ -121,7 +122,7 @@
#include "pins_arduino.h"
#include <EEPROM.h>
const char versionStr[] PROGMEM = "ArduCounter V3.33";
const char versionStr[] PROGMEM = "ArduCounter V3.34";
#define SERIAL_SPEED 38400
#define MAX_INPUT_NUM 8
@ -157,7 +158,6 @@ WiFiClient Client1; // active TCP connection
WiFiClient Client2; // secound TCP connection to send reject message
boolean Client1Connected; // remember state of TCP connection
boolean Client2Connected; // remember state of TCP connection
long rssi; // WiFi connection strength
boolean tcpMode = false;
uint8_t delayedTcpReports = 0; // how often did we already delay reporting because tcp disconnected
@ -340,7 +340,7 @@ uint16_t countMin = 2; // continue counting if count is less than t
uint32_t lastReportCall;
#ifdef ESP8266
uint16_t keepAliveTimeout;
uint16_t keepAliveTimeout = 200;
uint32_t lastKeepAlive;
#endif
@ -1199,19 +1199,28 @@ void devVerboseCmd(uint16_t *values, uint8_t size) {
void keepAliveCmd(uint16_t *values, uint8_t size) {
uint32_t now = millis();
if (values[0] == 1 && size > 0) {
Output->println(F("alive"));
}
Output->print(F("alive"));
#ifdef ESP8266
if (values[0] == 1 && size > 0 && size < 3 && Client1.connected()) {
tcpMode = true;
if (size == 2) {
keepAliveTimeout = values[1]; // timeout in seconds (on ESP side we use it times 3)
} else {
keepAliveTimeout = 200; // *3*1000 gives 10 minutes if nothing sent (should not happen)
if (devVerbose >=5) {
Output->print(F(" RSSI "));
Output->print(WiFi.RSSI());
}
}
if (values[0] == 1 && size > 0 && size < 3 && Client1.connected()) {
tcpMode = true;
if (size == 2) {
keepAliveTimeout = values[1]; // timeout in seconds (on ESP side we use it times 3)
} else {
keepAliveTimeout = 200; // *3*1000 gives 10 minutes if nothing sent (should not happen)
}
}
lastKeepAlive = now;
#endif
Output->println();
}
}
@ -1571,7 +1580,7 @@ void handleConnections() {
uint32_t now = millis();
if (Client1Connected) {
if((now - lastKeepAlive) > (keepAliveTimeout *3000)) {
if((now - lastKeepAlive) > (keepAliveTimeout * 3000)) {
Serial.println(F("M no keepalive from Client - disconnecting"));
Client1.stop();
}