From fded454c298ab558a709aff529d0cf629b371a36 Mon Sep 17 00:00:00 2001 From: StefanStrobel Date: Tue, 4 Sep 2018 16:40:46 +0000 Subject: [PATCH] =?UTF-8?q?98=5FArducounter.pm:=20neue=20Version=20f=C3=BC?= =?UTF-8?q?r=20Arduino=20oder=20ESP8266=20inkl.=20Sketch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://svn.fhem.de/fhem/trunk@17270 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/98_ArduCounter.pm | 1254 ++++++++++++------- fhem/FHEM/firmware/ArduCounter.bin | Bin 0 -> 273744 bytes fhem/FHEM/firmware/ArduCounter.hex | 1325 +++++++++++--------- fhem/contrib/arduino/ArduCounter2.36.ino | 1409 ++++++++++++++++++++++ 4 files changed, 2977 insertions(+), 1011 deletions(-) create mode 100755 fhem/FHEM/firmware/ArduCounter.bin create mode 100755 fhem/contrib/arduino/ArduCounter2.36.ino diff --git a/fhem/FHEM/98_ArduCounter.pm b/fhem/FHEM/98_ArduCounter.pm index 07e46ff31..b4230d98f 100755 --- a/fhem/FHEM/98_ArduCounter.pm +++ b/fhem/FHEM/98_ArduCounter.pm @@ -55,13 +55,27 @@ # 2018-01-01 little fixes # 2018-01-02 extend reporting line with history H.*, create new reading pinHistory if received from device and verboseReadings is set to 1 # create long count readings always, not only if attr verboseReadings is set to 1 -# 2018-01-03 little docu fix -# 2018-01-13 little docu addon +# 2018-01-03 little docu fix +# 2018-01-13 little docu addon +# 2018-02-04 modifications for ArduCounter on ESP8266 connected via TCP +# remove "change" as option (only rising and falling allowed now) +# TCP connection handling, keepalive, +# many changes more ... +# 2018-03-07 fix pinHistory when verboseReadings is not set +# 2018-03-08 parse board name in setup / hello message +# 2018-04-10 many smaller fixes, new interpolation based on real boot time, counter etc. +# 2018-05-13 send keepalive delay with k command, don't reset k timer when parsing a message +# 2018-07-17 modify define / notify so connection is opened after Event Defined # # ideas / todo: -# - parse error messages from sketch and show it in a message box? async output? +# - OTA Flashing for ESP +# +# - parse sequence num of history entries -> reconstruct long history list in perl mem +# and display with get history instead of readings incl. individual time +# # - timeMissed # +# package main; @@ -71,16 +85,21 @@ use warnings; use Time::HiRes qw(gettimeofday); my %ArduCounter_sets = ( - "raw" => "", - "reset" => "", - "flash" => "" + "disable" => "", + "enable" => "", + "raw" => "", + "reset" => "", + "flash" => "", + "devVerbose" => "", + "saveConfig" => "", + "reconnect" => "" ); my %ArduCounter_gets = ( - "info" => "" + "info" => "" ); -my $ArduCounter_Version = '5.7 - 2.1.2018'; +my $ArduCounter_Version = '5.94 - 13.5.2018'; # # FHEM module intitialisation @@ -113,7 +132,13 @@ sub ArduCounter_Initialize($) "verboseReadings[0-9]+ " . "flashCommand " . "helloSendDelay " . - "helloWaitTime " . + "helloWaitTime " . + "keepAliveDelay " . + "keepAliveTimeout " . + "nextOpenDelay " . + "silentReconnect " . + "openTimeout " . + "disable:0,1 " . "do_not_notify:1,0 " . $readingFnAttributes; @@ -134,51 +159,39 @@ sub ArduCounter_Define($$) my $name = $a[0]; my $dev = $a[2]; - if ($dev !~ /.+@([0-9]+)/) { - $dev .= '@38400'; + if ($dev =~ m/^(.+):([0-9]+)$/) { + # tcp conection + $hash->{TCP} = 1; } else { - Log3 $name, 3, "$name: Warning: connection speed $1 is not the default for the ArduCounter firmware" - if ($1 != 38400); + if ($dev !~ /.+@([0-9]+)/) { + $dev .= '@38400'; + } else { + Log3 $name, 3, "$name: Warning: connection speed $1 is not the default for the ArduCounter firmware" + if ($1 != 38400); + } } - $hash->{buffer} = ""; $hash->{DeviceName} = $dev; $hash->{VersionModule} = $ArduCounter_Version; $hash->{NOTIFYDEV} = "global"; # NotifyFn nur aufrufen wenn global events (INITIALIZED) $hash->{STATE} = "disconnected"; - delete $hash->{Initialized}; + delete $hash->{Initialized}; # device might not be initialized - wait for hello / setup before cmds if(!defined($attr{$name}{'flashCommand'})) { - #$attr{$name}{'flashCommand'} = 'avrdude -p atmega328P -b 57600 -c arduino -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE]'; # for nano - $attr{$name}{'flashCommand'} = 'avrdude -p atmega328P -c arduino -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE]'; # for uno + #$attr{$name}{'flashCommand'} = 'avrdude -p atmega328P -b 57600 -c arduino -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE]'; # for nano + $attr{$name}{'flashCommand'} = 'avrdude -p atmega328P -c arduino -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE]'; # for uno } - if ($init_done) { - ArduCounter_Open($hash); - } + Log3 $name, 5, "$name: defined with $dev, Module version $ArduCounter_Version"; + #if ($init_done) { + # ArduCounter_Open($hash); + #} + # do open in notify + return; } -# -# Send config commands after Board reported it is ready or still counting -########################################################################## -sub ArduCounter_ConfigureDevice($) -{ - my ($hash) = @_; - my $name = $hash->{NAME}; - - # send attributes to arduino device. Just call ArduCounter_Attr again - #Log3 $name, 3, "$name: sending configuration from attributes to device"; - while (my ($attr, $val) = each(%{$attr{$name}})) { - if ($attr =~ "pin|interval") { - Log3 $name, 3, "$name: ConfigureDevice calls Attr with $attr $val"; - ArduCounter_Attr("set", $name, $attr, $val); - } - } -} - - # # undefine command when device is deleted ######################################################################### @@ -189,21 +202,139 @@ sub ArduCounter_Undef($$) } +# remove timers, call DevIo_Disconnected +# to set state and add to readyFnList +##################################################### +sub ArduCounter_Disconnected($) +{ + my $hash = shift; + my $name = $hash->{NAME}; + + RemoveInternalTimer ("alive:$name"); # no timeout if waiting for keepalive response + RemoveInternalTimer ("keepAlive:$name"); # don't send keepalive messages anymore + RemoveInternalTimer ("sendHello:$name"); + DevIo_Disconnected($hash); # close, add to readyFnList so _Ready is called to reopen + delete $hash->{WaitForAlive}; +} + + +##################################### +sub ArduCounter_OpenCB($$) +{ + my ($hash, $msg) = @_; + my $name = $hash->{NAME}; + my $now = gettimeofday(); + if ($msg) { + Log3 $name, 5, "$name: Open callback: $msg" if ($msg); + } + delete $hash->{BUSY_OPENDEV}; + if ($hash->{FD}) { + Log3 $name, 5, "$name: ArduCounter_Open succeeded in callback"; + my $hdl = AttrVal($name, "helloSendDelay", 15); + # send hello if device doesn't say "Started" withing $hdl seconds + RemoveInternalTimer ("sendHello:$name"); + InternalTimer($now+$hdl, "ArduCounter_AskForHello", "sendHello:$name", 0); + + if ($hash->{TCP}) { + # send first keepalive immediately to turn on tcp mode in device + ArduCounter_KeepAlive("keepAlive:$name"); + } + } else { + #Log3 $name, 5, "$name: ArduCounter_Open failed - open callback called from DevIO without FD"; + } + + return; +} + + ######################################################## # Open Device -sub ArduCounter_Open($) +sub ArduCounter_Open($;$) +{ + my ($hash, $reopen) = @_; + my $name = $hash->{NAME}; + my $now = gettimeofday(); + $reopen = 0 if (!$reopen); + + if ($hash->{BUSY_OPENDEV}) { # still waiting for callback to last open + if ($hash->{LASTOPEN} && $now > $hash->{LASTOPEN} + (AttrVal($name, "openTimeout", 3) * 2) + && $now > $hash->{LASTOPEN} + 15) { + Log3 $name, 5, "$name: _Open - still waiting for open callback, timeout is over twice - this should never happen"; + Log3 $name, 5, "$name: _Open - stop waiting and reset the flag."; + $hash->{BUSY_OPENDEV} = 0; + } else { + Log3 $name, 5, "$name: _Open - still waiting for open callback"; + return; + } + } + + if (!$reopen) { # not called from _Ready + DevIo_CloseDev($hash); + delete $hash->{NEXT_OPEN}; + delete $hash->{DevIoJustClosed}; + } + + Log3 $name, 4, "$name: trying to open connection to $hash->{DeviceName}" if (!$reopen); + + $hash->{BUSY_OPENDEV} = 1; + $hash->{LASTOPEN} = $now; + $hash->{nextOpenDelay} = AttrVal($name, "nextOpenDelay", 60); + $hash->{devioLoglevel} = (AttrVal($name, "silentReconnect", 0) ? 4 : 3); + $hash->{TIMEOUT} = AttrVal($name, "openTimeout", 3); + $hash->{buffer} = ""; # clear Buffer for reception + + DevIo_OpenDev($hash, $reopen, 0, \&ArduCounter_OpenCB); + delete $hash->{TIMEOUT}; + if ($hash->{FD}) { + Log3 $name, 5, "$name: ArduCounter_Open succeeded immediatelay" if (!$reopen); + } else { + Log3 $name, 5, "$name: ArduCounter_Open waiting for callback" if (!$reopen); + } + +} + + +######################################################################### +sub ArduCounter_Ready($) { my ($hash) = @_; my $name = $hash->{NAME}; - - DevIo_OpenDev($hash, 0, 0); - if ($hash->{FD}) { - my $now = gettimeofday(); - my $hdl = AttrVal($name, "helloSendDelay", 3); - # send hello if device doesn't say "Started" withing $hdl seconds - RemoveInternalTimer ("sendHello:$name"); - InternalTimer($now+$hdl, "ArduCounter_SendHello", "sendHello:$name", 0); + + if($hash->{STATE} eq "disconnected") { + RemoveInternalTimer ("alive:$name"); # no timeout if waiting for keepalive response + RemoveInternalTimer ("keepAlive:$name"); # don't send keepalive messages anymore + delete $hash->{WaitForAlive}; + delete $hash->{Initialized}; # when reconnecting wait for setup / hello before further action + if (IsDisabled($name)) { + Log3 $name, 3, "$name: _Ready: $name is disabled - don't try to reconnect"; + DevIo_CloseDev($hash); # close, remove from readyfnlist so _ready is not called again + return; + } + ArduCounter_Open($hash, 1); # reopen, don't call DevIoClose before reopening + return; # a return value triggers direct read for win } + # This is relevant for windows/USB only + my $po = $hash->{USBDev}; + if ($po) { + my ($BlockingFlags, $InBytes, $OutBytes, $ErrorFlags) = $po->status; + return ($InBytes>0); # tell fhem.pl to read when we return + } + return; +} + + +####################################### +# Aufruf aus InternalTimer +sub ArduCounter_DelayedOpen($) +{ + my $param = shift; + my (undef,$name) = split(':',$param); + my $hash = $defs{$name}; + + Log3 $name, 4, "$name: try to reopen connection after delay"; + RemoveInternalTimer ("delayedopen:$name"); + delete $hash->{DevIoJustClosed}; # otherwise open returns without doing anything this time and we are not on the readyFnList ... + ArduCounter_Open($hash, 1); # reopen } @@ -221,14 +352,14 @@ sub ArduCounter_Notify($$) my $name = $hash->{NAME}; # Log3 $name, 5, "$name: Notify called for source $source->{NAME} with events: @{$events}"; - return if (!grep(m/^INITIALIZED|REREADCFG|(MODIFIED $name)$/, @{$source->{CHANGED}})); + return if (!grep(m/^INITIALIZED|REREADCFG|(MODIFIED $name)|(DEFINED $name)$/, @{$source->{CHANGED}})); - if (AttrVal($name, "disable", undef)) { - Log3 $name, 4, "$name: device is disabled - don't set timer to send hello"; + if (IsDisabled($name)) { + Log3 $name, 3, "$name: Notify / Init: device is disabled"; return; } - Log3 $name, 5, "$name: Notify called with events: @{$events}, open device and set timer to send hello to device"; + Log3 $name, 3, "$name: Notify called with events: @{$events}, open device and set timer to send hello to device"; ArduCounter_Open($hash); } @@ -240,23 +371,25 @@ sub ArduCounter_Write ($$) my ($hash, $line) = @_; my $name = $hash->{NAME}; if ($hash->{STATE} eq "disconnected" || !$hash->{FD}) { - Log3 $name, 4, "$name: Write: device is disconnected, dropping line to write"; + Log3 $name, 5, "$name: Write: device is disconnected, dropping line to write"; return 0; } - if (AttrVal($name, "disable", undef)) { - Log3 $name, 4, "$name: Write called but device is disabled, dropping line to send"; + if (IsDisabled($name)) { + Log3 $name, 5, "$name: Write called but device is disabled, dropping line to send"; return 0; } - Log3 $name, 4, "$name: Write: $line"; - DevIo_SimpleWrite( $hash, "$line\n", 2); + #Log3 $name, 5, "$name: Write: $line"; # devio will already log the write + #DevIo_SimpleWrite($hash, "\n", 2); + DevIo_SimpleWrite($hash, "$line.", 2); return 1; } ####################################### # Aufruf aus InternalTimer -# send "h" to ask for "Hello" since device didn't say "Started" so fae - maybe it's still counting ... -sub ArduCounter_SendHello($) +# send "h" to ask for "Hello" since device didn't say "Started" so far - maybe it's still counting ... +# called with timer from _open, _Ready and if count is read in _Parse +sub ArduCounter_AskForHello($) { my $param = shift; my (undef,$name) = split(':',$param); @@ -266,7 +399,7 @@ sub ArduCounter_SendHello($) return if (!ArduCounter_Write( $hash, "h")); my $now = gettimeofday(); - my $hwt = AttrVal($name, "helloWaitTime ", 3); + my $hwt = AttrVal($name, "helloWaitTime", 3); RemoveInternalTimer ("hwait:$name"); InternalTimer($now+$hwt, "ArduCounter_HelloTimeout", "hwait:$name", 0); $hash->{WaitForHello} = 1; @@ -282,6 +415,127 @@ sub ArduCounter_HelloTimeout($) my $hash = $defs{$name}; Log3 $name, 3, "$name: device didn't reply to h(ello). Is the right sketch flashed? Is speed set to 38400?"; delete $hash->{WaitForHello}; + RemoveInternalTimer ("hwait:$name"); +} + + +############################################ +# Aufruf aus Open / Ready und InternalTimer +# send "1k" to ask for "alive" +sub ArduCounter_KeepAlive($) +{ + my $param = shift; + my (undef,$name) = split(':',$param); + my $hash = $defs{$name}; + my $now = gettimeofday(); + + if (IsDisabled($name)) { + return; + } + + my $kdl = AttrVal($name, "keepAliveDelay", 10); # next keepalive as timer + my $kto = AttrVal($name, "keepAliveTimeout", 2); # timeout waiting for response + + Log3 $name, 5, "$name: sending k(eepAlive) to device"; + ArduCounter_Write( $hash, "1,${kdl}k"); + + RemoveInternalTimer ("alive:$name"); + InternalTimer($now+$kto, "ArduCounter_AliveTimeout", "alive:$name", 0); + $hash->{WaitForAlive} = 1; + + if ($hash->{TCP}) { + RemoveInternalTimer ("keepAlive:$name"); + InternalTimer($now+$kdl, "ArduCounter_KeepAlive", "keepAlive:$name", 0); # next keepalive + } +} + + +####################################### +# Aufruf aus InternalTimer +sub ArduCounter_AliveTimeout($) +{ + my $param = shift; + my (undef,$name) = split(':',$param); + my $hash = $defs{$name}; + Log3 $name, 3, "$name: device didn't reply to k(eeepAlive), setting to disconnected and try to reopen"; + delete $hash->{WaitForAlive}; + + $hash->{KeepAliveRetries} = 0 if (!$hash->{KeepAliveRetries}); + + if (++$hash->{KeepAliveRetries} > AttrVal($name, "keepAliveRetries", 1)) { + Log3 $name, 3, "$name: no retries left, setting device to disconnected"; + ArduCounter_Disconnected($hash); # set to Disconnected but let _Ready try to Reopen + } +} + + +# +# Send config commands after Board reported it is ready or still counting +# called from internal timer to give device the time to report its config first +########################################################################## +sub ArduCounter_ConfigureDevice($) +{ + my $param = shift; + my (undef,$name) = split(':',$param); + my $hash = $defs{$name}; + + # todo: check if device got disconnected in the meantime! + + # first check if device did send its config, then compare and send config if necessary + if ($hash->{runningCfg}) { + Log3 $name, 5, "$name: ConfigureDevice: got running config - comparing"; + my $iAttr = AttrVal($name, "interval", ""); + if (!$iAttr) { + $iAttr = "30 60 2 2"; + Log3 $name, 5, "$name: ConfigureDevice: interval attr not set - take default $iAttr"; + } + if ($iAttr =~ /^(\d+) (\d+) ?(\d+)? ?(\d+)?$/) { + #Log3 $name, 5, "$name: ConfigureDevice: comparing interval"; + my $iACfg = "$1 $2 " . ($3 ? $3 : "0") . " " . ($4 ? $4 : "0"); + if ($hash->{runningCfg}{I} eq $iACfg) { + #Log3 $name, 5, "$name: ConfigureDevice: interval matches - now compare pins"; + # interval config matches - now check pins as well + my @runningPins = sort grep (/[\d]/, keys %{$hash->{runningCfg}}); + #Log3 $name, 5, "$name: ConfigureDevice: pins in running config: @runningPins"; + my @attrPins = sort grep (/pin([dD])?[\d]/, keys %{$attr{$name}}); + #Log3 $name, 5, "$name: ConfigureDevice: pins from attrs: @attrPins"; + if (@runningPins == @attrPins) { + my $match = 1; + for (my $i = 0; $i < @attrPins; $i++) { + #Log3 $name, 5, "$name: ConfigureDevice: compare pin $attrPins[$i] to $runningPins[$i]"; + $attrPins[$i] =~ /pin[dD]?([\d+]+)/; + my $pinNum = $1; + $runningPins[$i] =~ /pin[dD]?([\d]+)/; + $match = 0 if (!$1 || $1 ne $pinNum); + #Log3 $name, 5, "$name: ConfigureDevice: now compare pin $attrPins[$i] $attr{$name}{$attrPins[$i]} to $hash->{runningCfg}{$pinNum}"; + $match = 0 if (($attr{$name}{$attrPins[$i]}) ne $hash->{runningCfg}{$pinNum}); + } + if ($match) { # Config matches -> leave + Log3 $name, 5, "$name: ConfigureDevice: running config matches attributes"; + return; + } + Log3 $name, 5, "$name: ConfigureDevice: no match -> send config"; + } else { + Log3 $name, 5, "$name: ConfigureDevice: pin numbers don't match (@runningPins vs. @attrPins)"; + } + } else { + Log3 $name, 5, "$name: ConfigureDevice: interval does not match (>$hash->{runningCfg}{I}< vs >$iACfg< from attr)"; + } + } else { + Log3 $name, 5, "$name: ConfigureDevice: can not compare against interval attr"; + } + } else { + Log3 $name, 5, "$name: ConfigureDevice: no running config received"; + } + + # send attributes to arduino device. Just call ArduCounter_Attr again + Log3 $name, 3, "$name: sending configuration from attributes to device"; + while (my ($aName, $val) = each(%{$attr{$name}})) { + if ($aName =~ "pin|interval") { + Log3 $name, 3, "$name: ConfigureDevice calls Attr with $aName $val"; + ArduCounter_Attr("set", $name, $aName, $val); + } + } } @@ -300,22 +554,25 @@ sub ArduCounter_Attr(@) #Log3 $name, 5, "$name: Attr called with @_"; if ($cmd eq "set") { - if ($aName =~ 'pin.*') { - if ($aName !~ 'pin[dD]?(\d+)') { - Log3 $name, 3, "$name: Invalid pin name in attr $name $aName $aVal"; - return "Invalid pin name $aName"; - } + if ($aName =~ /^pin[dD]?(\d+)/) { my $pin = $1; - if ($aVal =~ /^(rising|falling|change) ?(pullup)? ?([0-9]+)?/) { + my %pins; + if ($hash->{allowedPins}) { + %pins = map { $_ => 1 } split (",", $hash->{allowedPins}); + } + if ($init_done && $hash->{allowedPins} && %pins && !$pins{$pin}) { + Log3 $name, 3, "$name: Invalid pin in attr $name $aName $aVal"; + return "Invalid / disallowed pin specification $aName"; + } + if ($aVal =~ /^(rising|falling) ?(pullup)? ?([0-9]+)?/) { my $opt = ""; if ($1 eq 'rising') {$opt = "3"} elsif ($1 eq 'falling') {$opt = "2"} - elsif ($1 eq 'change') {$opt = "1"} $opt .= ($2 ? ",1" : ",0"); # pullup $opt .= ($3 ? ",$3" : ""); # min length - if ($hash->{Initialized}) { - ArduCounter_Write( $hash, "${pin},${opt}a"); + if ($hash->{Initialized}) { + ArduCounter_Write($hash, "${pin},${opt}a"); } else { Log3 $name, 5, "$name: communication postponed until device is initialized"; } @@ -325,7 +582,7 @@ sub ArduCounter_Attr(@) return "Invalid Value $aVal"; } } elsif ($aName eq "interval") { - if ($aVal =~ '^(\d+) (\d+) ?(\d+)? ?(\d+)?$') { + if ($aVal =~ /^(\d+) (\d+) ?(\d+)? ?(\d+)?$/) { my $min = $1; my $max = $2; my $sml = $3; @@ -351,10 +608,21 @@ sub ArduCounter_Attr(@) Log3 $name, 3, "$name: Invalid value in attr $name $aName $aVal"; return "Invalid Value $aVal"; } + } elsif ($aName eq "keepAliveDelay") { + if ($aVal =~ '^(\d+)$') { + if ($aVal > 300) { + Log3 $name, 3, "$name: value too big in attr $name $aName $aVal"; + return "Value too big: $aVal"; + } + } else { + Log3 $name, 3, "$name: Invalid value in attr $name $aName $aVal"; + return "Invalid Value $aVal"; + } } elsif ($aName eq 'disable') { if ($aVal) { - Log3 $name, 5, "$name: disable attribute set"; - DevIo_CloseDev($hash); + Log3 $name, 5, "$name: disable attribute set"; + ArduCounter_Disconnected($hash); # set to disconnected and remove timers + DevIo_CloseDev($hash); # really close and remove from readyFnList again return; } else { Log3 $name, 3, "$name: disable attribute cleared"; @@ -414,18 +682,82 @@ sub ArduCounter_Attr(@) } elsif ($aName eq 'disable') { Log3 $name, 3, "$name: disable attribute removed"; - ArduCounter_Open($hash) if ($hash->{$init_done}); # if fhem is initialized + ArduCounter_Open($hash) if ($init_done); # if fhem is initialized } } return undef; } +# SET command +######################################################################### +sub ArduCounter_Flash($$) +{ + my ($hash, @args) = @_; + my $name = $hash->{NAME}; + my $log = ""; + my @deviceName = split('@', $hash->{DeviceName}); + my $port = $deviceName[0]; + my $firmwareFolder = "./FHEM/firmware/"; + my $logFile = AttrVal("global", "logdir", "./log") . "/ArduCounterFlash.log"; + + return "Flashing ESP8266 not supported yet" if ($hash->{Board} =~ /ESP8266/); + + my $hexFile = $firmwareFolder . "ArduCounter.hex"; + return "The file '$hexFile' does not exist" if(!-e $hexFile); + + Log3 $name, 3, "$name: Flashing Aduino at $port with $hexFile. See $logFile for details"; + + $log .= "flashing device as ArduCounter for $name\n"; + $log .= "hex file: $hexFile\n"; + + $log .= "port: $port\n"; + $log .= "log file: $logFile\n"; + + my $flashCommand = AttrVal($name, "flashCommand", ""); + + if($flashCommand ne "") { + if (-e $logFile) { + unlink $logFile; + } + + ArduCounter_Disconnected($hash); + DevIo_CloseDev($hash); + $log .= "$name closed\n"; + + my $avrdude = $flashCommand; + $avrdude =~ s/\Q[PORT]\E/$port/g; + $avrdude =~ s/\Q[HEXFILE]\E/$hexFile/g; + $avrdude =~ s/\Q[LOGFILE]\E/$logFile/g; + + $log .= "command: $avrdude\n\n"; + `$avrdude`; + + local $/=undef; + if (-e $logFile) { + open FILE, $logFile; + my $logText = ; + close FILE; + $log .= "--- AVRDUDE ---------------------------------------------------------------------------------\n"; + $log .= $logText; + $log .= "--- AVRDUDE ---------------------------------------------------------------------------------\n\n"; + } + else { + $log .= "WARNING: avrdude created no log file\n\n"; + } + ArduCounter_Open($hash, 0); # new open + $log .= "$name open called.\n"; + delete $hash->{Initialized}; + } + return $log; +} + + # SET command ######################################################################### sub ArduCounter_Set($@) { - my ( $hash, @a ) = @_; + my ($hash, @a) = @_; return "\"set ArduCounter\" needs at least one argument" if ( @a < 2 ); # @a is an array with DeviceName, SetName, Rest of Set Line @@ -438,84 +770,59 @@ sub ArduCounter_Set($@) return "Unknown argument $attr, choose one of " . join(" ", @cList); } - if(!$hash->{FD}) { - Log3 $name, 4, "$name: Set called but device is disconnected"; - return ("Set called but device is disconnected", undef); + if ($attr eq "disable") { + Log3 $name, 4, "$name: set disable called"; + CommandAttr(undef, "$name disable 1"); + return; + + } elsif ($attr eq "enable") { + Log3 $name, 4, "$name: set enable called"; + CommandAttr(undef, "$name disable 0"); + return; + + } elsif ($attr eq "reconnect") { + Log3 $name, 4, "$name: set reconnect called"; + DevIo_CloseDev($hash); + ArduCounter_Open($hash); + return; + + } elsif ($attr eq "flash") { + return ArduCounter_Flash($hash, @a); } - if (AttrVal($name, "disable", undef)) { - Log3 $name, 4, "$name: set called but device is disabled"; + if(!$hash->{FD}) { + Log3 $name, 4, "$name: Set $attr $arg called but device is disconnected"; + return ("Set called but device is disconnected", undef); + } + if (IsDisabled($name)) { + Log3 $name, 4, "$name: set $attr $arg called but device is disabled"; return; } - if ($attr eq "raw") { + Log3 $name, 4, "$name: set raw $arg called"; ArduCounter_Write($hash, "$arg"); + + } elsif ($attr eq "saveConfig") { + Log3 $name, 4, "$name: set saveConfig called"; + ArduCounter_Write($hash, "e"); } elsif ($attr eq "reset") { - DevIo_CloseDev($hash); - $hash->{buffer} = ""; - DevIo_OpenDev( $hash, 0, 0); + Log3 $name, 4, "$name: set reset called"; + DevIo_CloseDev($hash); + ArduCounter_Open($hash); if (ArduCounter_Write($hash, "r")) { delete $hash->{Initialized}; return "sent (r)eset command to device - waiting for its setup message"; } - } elsif ($attr eq "flash") { - my @args = split(' ', $arg); - my $log = ""; - my @deviceName = split('@', $hash->{DeviceName}); - my $port = $deviceName[0]; - my $firmwareFolder = "./FHEM/firmware/"; - my $logFile = AttrVal("global", "logdir", "./log") . "/ArduCounterFlash.log"; - my $hexFile = $firmwareFolder . "ArduCounter.hex"; - - return "The file '$hexFile' does not exist" if(!-e $hexFile); - - Log3 $name, 4, "$name: Flashing Aduino at $port with $hexFile. See $logFile for details"; - - $log .= "flashing device as ArduCounter for $name\n"; - $log .= "hex file: $hexFile\n"; - - $log .= "port: $port\n"; - $log .= "log file: $logFile\n"; - - my $flashCommand = AttrVal($name, "flashCommand", ""); - - if($flashCommand ne "") { - if (-e $logFile) { - unlink $logFile; - } - - DevIo_CloseDev($hash); - readingsSingleUpdate($hash, "state", "disconnected", 1); - $log .= "$name closed\n"; - - my $avrdude = $flashCommand; - $avrdude =~ s/\Q[PORT]\E/$port/g; - $avrdude =~ s/\Q[HEXFILE]\E/$hexFile/g; - $avrdude =~ s/\Q[LOGFILE]\E/$logFile/g; - - $log .= "command: $avrdude\n\n"; - `$avrdude`; - - local $/=undef; - if (-e $logFile) { - open FILE, $logFile; - my $logText = ; - close FILE; - $log .= "--- AVRDUDE ---------------------------------------------------------------------------------\n"; - $log .= $logText; - $log .= "--- AVRDUDE ---------------------------------------------------------------------------------\n\n"; - } - else { - $log .= "WARNING: avrdude created no log file\n\n"; - } - DevIo_OpenDev($hash, 0, 0); - $log .= "$name opened\n"; - delete $hash->{Initialized}; - } - return $log; + } elsif ($attr eq "devVerbose") { + if ($arg =~ /^\d$/) { + Log3 $name, 4, "$name: set devVerbose $arg called"; + ArduCounter_Write($hash, "$arg"."v"); + } else { + Log3 $name, 4, "$name: set devVerbose called with illegal value $arg"; + } } return undef; } @@ -540,7 +847,7 @@ sub ArduCounter_Get($@) return ("Get called but device is disconnected", undef); } - if (AttrVal($name, "disable", undef)) { + if (IsDisabled($name)) { Log3 $name, 4, "$name: get called but device is disabled"; return; } @@ -548,8 +855,7 @@ sub ArduCounter_Get($@) if ($attr eq "info") { Log3 $name, 3, "$name: Sending info command to device"; ArduCounter_Write( $hash, "s"); - my ($err, $msg) = ArduCounter_ReadAnswer($hash, 'Next report in [0-9]+ Milliseconds'); - # todo: test adding \n to regex to make sure we got the whole respose string + my ($err, $msg) = ArduCounter_ReadAnswer($hash, 'Next report in.*seconds'); return ($err ? $err : $msg); } @@ -559,21 +865,256 @@ sub ArduCounter_Get($@) ###################################### -sub ArduCounter_HandleVersion($$) +sub ArduCounter_HandleDeviceTime($$$$) { - my ($hash, $line) = @_; + my ($hash, $deTi, $deTiW, $now) = @_; my $name = $hash->{NAME}; - if ($line =~ / V([\d\.]+)/) { - my $version = $1; - if ($version < "1.9") { - $version .= " - not compatible with this Module version - please flash new sketch"; - Log3 $name, 3, "$name: device reported outdated Arducounter Firmware - please update!"; + + my $deviceNowSecs = ($deTi/1000) + ((0xFFFFFFFF / 1000) * $deTiW); + Log3 $name, 5, "$name: Device Time $deviceNowSecs"; + + if (defined ($hash->{'.DeTOff'}) && $hash->{'.LastDeT'}) { + if ($deviceNowSecs >= $hash->{'.LastDeT'}) { + $hash->{'.Drift2'} = ($now - $hash->{'.DeTOff'}) - $deviceNowSecs; + } else { + $hash->{'.DeTOff'} = $now - $deviceNowSecs; + Log3 $name, 4, "$name: device did reset (now $deviceNowSecs, before $hash->{'.LastDeT'}). New offset is $hash->{'.DeTOff'}"; + } + } else { + $hash->{'.DeTOff'} = $now - $deviceNowSecs; + $hash->{'.Drift2'} = 0; + $hash->{'.DriftStart'} = $now; + Log3 $name, 5, "$name: Initialize device clock offset to $hash->{'.DeTOff'}"; + } + $hash->{'.LastDeT'} = $deviceNowSecs; + + my $drTime = ($now - $hash->{'.DriftStart'}); + #Log3 $name, 5, "$name: Device Time $deviceNowSecs" . + #", Offset " . sprintf("%.3f", $hash->{'.DeTOff'}/1000) . + ", Drift " . sprintf("%.3f", $hash->{'.Drift2'}) . + "s in " . sprintf("%.3f", $drTime) . "s" . + ($drTime > 0 ? ", " . sprintf("%.2f", $hash->{'.Drift2'} / $drTime * 100) . "%" : ""); +} + + +###################################### +sub ArduCounter_ParseHello($$$) +{ + my ($hash, $line, $now) = @_; + my $name = $hash->{NAME}; + + if ($line =~ /^ArduCounter V([\d\.]+) on ([^\ ]+ ?[^\ ]*) compiled (.*) Hello(, pins ([0-9\,]+) available)? ?(T([\d]+),([\d]+) B([\d]+),([\d]+))?/) { # setup / hello message + $hash->{VersionFirmware} = ($1 ? $1 : "unknown"); + $hash->{Board} = ($2 ? $2 : "unknown"); + $hash->{SketchCompile} = ($3 ? $3 : "unknown"); + $hash->{allowedPins} = $5 if ($5); + my $mNow = ($7 ? $7 : 0); + my $mNowW = ($8 ? $8 : 0); + my $mBoot = ($9 ? $9 : 0); + my $mBootW = ($10 ? $10 : 0); + if ($hash->{VersionFirmware} < "2.36") { + $hash->{VersionFirmware} .= " - not compatible with this Module version - please flash new sketch"; + Log3 $name, 3, "$name: device reported outdated Arducounter Firmware ($hash->{VersionFirmware}) - please update!"; delete $hash->{Initialized}; } else { - $hash->{Initialized} = 1; # now device is initialized + Log3 $name, 3, "$name: device sent hello: $line"; + $hash->{Initialized} = 1; # now device has finished its boot and reported its version + delete $hash->{runningCfg}; + + my $cft = AttrVal($name, "ConfigDelay", 1); # wait for device to send cfg before reconf. + RemoveInternalTimer ("cmpCfg:$name"); + InternalTimer($now+$cft, "ArduCounter_ConfigureDevice", "cmpCfg:$name", 0); + + my $deviceNowSecs = ($mNow/1000) + ((0xFFFFFFFF / 1000) * $mNowW); + my $deviceBootSecs = ($mBoot/1000) + ((0xFFFFFFFF / 1000) * $mBootW); + my $bootTime = $now - ($deviceNowSecs - $deviceBootSecs); + $hash->{deviceBooted} = $bootTime; # for estimation of missed pulses up to now + } + delete $hash->{WaitForHello}; + RemoveInternalTimer ("hwait:$name"); # dont wait for hello reply if already sent + RemoveInternalTimer ("sendHello:$name"); # Hello not needed anymore if not sent yet + } else { + Log3 $name, 4, "$name: probably wrong firmware version - cannot parse line $line"; + } +} + + +######################################################################### +sub ArduCounter_HandleCounters($$$$$$$$) +{ + my ($hash, $pin, $sequence, $count, $time, $diff, $rDiff, $now) = @_; + my $name = $hash->{NAME}; + + my $rcname = AttrVal($name, "readingNameCount$pin", "pin$pin"); # internal count reading + my $rlname = AttrVal($name, "readingNameLongCount$pin", "long$pin"); # long count + my $riname = AttrVal($name, "readingNameInterpolatedCount$pin", "interpolatedLong$pin"); + my $lName = AttrVal($name, "readingNamePower$pin", AttrVal($name, "readingNameCount$pin", "pin$pin")); # for logging + + my $longCount = ReadingsVal($name, $rlname, 0); # alter long count Wert + my $intpCount = ReadingsVal($name, $riname, 0); # alter interpolated count Wert + my $lastCount = ReadingsVal($name, $rcname, 0); + my $lastSeq = ReadingsVal($name, "seq".$pin, 0); + + my $lastCountTS = ReadingsTimestamp ($name, $rlname, 0); # last time long count reading was set + my $lastCountTNum = time_str2num($lastCountTS); + my $fBootTim = ($hash->{deviceBooted} ? FmtTime($hash->{deviceBooted}) : "never"); # time device booted + my $fLastCTim = FmtTime($lastCountTNum); + my $pulseGap = $count - $lastCount - $rDiff; + my $seqGap = $sequence - ($lastSeq + 1); + + if (!$lastCountTS && !$longCount && !$intpCount) { + # new defined or deletereading done ... + Log3 $name, 3, "$name: pin $pin ($lName) first report, initializing counters to " . ($count - $rDiff); + $longCount = $count - $rDiff; + $intpCount = $count - $rDiff; + } + if ($lastCountTS && $hash->{deviceBooted} && $hash->{deviceBooted} > $lastCountTNum) { + # first report for this pin after a restart + # -> do interpolation for period between last report before boot and boot time. count after boot has to be added later + Log3 $name, 5, "$name: pin $pin ($lName) device restarted at $fBootTim, last reported at $fLastCTim, sequence for pin $pin changed from $lastSeq to $sequence and count from $lastCount to $count"; + $lastSeq = 0; + $seqGap = $sequence - 1; # $sequence should be 1 after restart + $pulseGap = $count - $rDiff; # + + my $lastInterval = ReadingsVal ($name, "timeDiff$pin", 0); + my $lastCDiff = ReadingsVal ($name, "countDiff$pin", 0); + my $offlTime = sprintf ("%.2f", $hash->{deviceBooted} - $lastCountTNum); + + if ($lastCountTS && $lastInterval && ($offlTime > 0) && ($offlTime < 12*60*60)) { # > 0 and < 12h + my $lastRatio = $lastCDiff / $lastInterval; + my $curRatio = $diff / $time; + my $intRatio = 1000 * ($lastRatio + $curRatio) / 2; + my $intrCount = int(($offlTime * $intRatio)+0.5); + + Log3 $name, 3, "$name: pin $pin ($lName) interpolating for $offlTime secs until boot, $intrCount estimated pulses (before $lastCDiff in $lastInterval ms, now $diff in $time ms, avg ratio $intRatio p/s)"; + Log3 $name, 5, "$name: pin $pin ($lName) adding interpolated $intrCount to interpolated count $intpCount"; + $intpCount += $intrCount; + + } else { + Log3 $name, 4, "$name: interpolation of missed pulses for pin $pin ($lName) not possible - no valid historic data."; + } + } elsif ($lastCountTS && $seqGap < 0) { + # new sequence number is smaller than last and we have old readings + # and this is not after a reboot of the device + $seqGap += 256; # correct seq gap + Log3 $name, 5, "$name: pin $pin ($lName) sequence wrapped from $lastSeq to $sequence, set seqGap to $seqGap"; + } + + if ($lastCountTS && $seqGap > 0) { + # probably missed a report. Maybe even the first ones after a reboot (until reconnect) + # take last count, delta to new reported count as missed pulses to correct long counter + my $timeGap = ($now - $time/1000 - $lastCountTNum); + if ($pulseGap > 0) { + $longCount += $pulseGap; + $intpCount += $pulseGap; + Log3 $name, 3, "$name: pin $pin ($lName) missed $seqGap reports in $timeGap seconds. Last reported sequence was $lastSeq, now $sequence. Device count before was $lastCount, now $count with rDiff $rDiff. Adding $pulseGap to long count and intpolated count readings"; + } elsif ($pulseGap == 0) { + # outdated sketch? + Log3 $name, 5, "$name: pin $pin ($lName) missed $seqGap sequence numbers in $timeGap seconds. Last reported sequence was $lastSeq, now $sequence. Device count before was $lastCount, now $count with rDiff $rDiff. Nothing is missing - ignore"; + } else { + # strange ... + Log3 $name, 3, "$name: Pin $pin ($lName) missed $seqGap reports in $timeGap seconds. " . + "Last reported sequence was $lastSeq, now $sequence. " . + "Device count before was $lastCount, now $count with rDiff $rDiff " . + "but pulseGap is $pulseGap. this is wrong and should not happen"; + } + } + + Log3 $name, 5, "$name: pin $pin ($lName) adding rDiff $rDiff to long count $longCount and interpolated count $intpCount"; + + $intpCount += $rDiff; + $longCount += $rDiff; + + readingsBulkUpdate($hash, $rcname, $count); + readingsBulkUpdate($hash, $rlname, $longCount); + readingsBulkUpdate($hash, $riname, $intpCount); + readingsBulkUpdate($hash, "seq".$pin, $sequence); +} + + +######################################################################### +sub ArduCounter_ParseReport($$) +{ + my ($hash, $line) = @_; + my $name = $hash->{NAME}; + my $now = gettimeofday(); + if ($line =~ '^R([\d]+) C([\d]+) D([\d]+) ?[\/R]([\d]+) T([\d]+) N([\d]+),([\d]+) X([\d]+)( S[\d]+)?( A[\d]+)?') + { + # new count is beeing reported + my $pin = $1; + my $count = $2; # internal counter at device + my $diff = $3; # delta during interval + my $rDiff = $4; # real delta including the first pulse after a restart + my $time = $5; # interval + my $deTime = $6; + my $deTiW = $7; + my $reject = $8; + my $seq = ($9 ? substr($9, 2) : ""); + my $avgLen = ($10 ? substr($10, 2) : ""); + + my $factor = AttrVal($name, "readingFactor$pin", AttrVal($name, "factor", 1000)); + my $rpname = AttrVal($name, "readingNamePower$pin", "power$pin"); # power reading name + my $lName = AttrVal($name, "readingNamePower$pin", AttrVal($name, "readingNameCount$pin", "pin$pin")); # for logging + + my $sTime = $now - $time/1000; # start of observation interval (~first pulse) + my $fSTime = FmtDateTime($sTime); # formatted + my $fSdTim = FmtTime($sTime); # only time formatted for logging + my $fEdTim = FmtTime($now); # end of Interval - only time formatted for logging + + ArduCounter_HandleDeviceTime($hash, $deTime, $deTiW, $now); + + if (!$time || !$factor) { + Log3 $name, 3, "$name: Pin $pin ($lName) skip line because time or factor is 0: $line"; + return; + } + my $power = sprintf ("%.3f", ($time ? $diff/$time/1000*3600*$factor : 0)); + Log3 $name, 4, "$name: Pin $pin ($lName) Cnt $count " . + "(diff $diff/$rDiff) in " . sprintf("%.3f", $time/1000) . "s" . + " from $fSdTim until $fEdTim" . + ", seq $seq" . + ((defined($reject) && $reject ne "") ? ", Rej $reject" : "") . + (defined($avgLen) ? ", Avg ${avgLen}ms" : "") . + ", result $power"; + + if (AttrVal($name, "readingStartTime$pin", 0)) { + readingsBeginUpdate($hash); # special block with potentially manipulates times + # special way to set readings: use time of interval start as reading time + Log3 $name, 5, "$name: readingStartTime$pin specified: setting timestamp to $fSdTim"; + my $chIdx = 0; + $hash->{".updateTime"} = $sTime; + $hash->{".updateTimestamp"} = $fSTime; + readingsBulkUpdate($hash, $rpname, $power) if ($time); + $hash->{CHANGETIME}[$chIdx++] = $fSTime; # Intervall start + readingsEndUpdate($hash, 1); # end of special block + readingsBeginUpdate($hash); # start regular update block + } else { + # normal way to set readings + readingsBeginUpdate($hash); # start regular update block + readingsBulkUpdate($hash, $rpname, $power) if ($time); + } + + + if (defined($reject) && $reject ne "") { + my $rejCount = ReadingsVal($name, "reject$pin", 0); # alter reject count Wert + readingsBulkUpdate($hash, "reject$pin", $reject + $rejCount); + } + readingsBulkUpdate($hash, "timeDiff$pin", $time); + readingsBulkUpdate($hash, "countDiff$pin", $diff); + + if (AttrVal($name, "verboseReadings$pin", 0)) { + readingsBulkUpdate($hash, "lastMsg$pin", $line); + } + + ArduCounter_HandleCounters($hash, $pin, $seq, $count, $time, $diff, $rDiff, $now); + readingsEndUpdate($hash, 1); + + if (!$hash->{Initialized}) { # device has sent count but not Started / hello after reconnect + Log3 $name, 3, "$name: device is still counting"; + if (!$hash->{WaitForHello}) { # if hello not already sent, send it now + ArduCounter_AskForHello("direct:$name"); + } + RemoveInternalTimer ("sendHello:$name"); # don't send hello again } - $hash->{VersionFirmware} = $version; - Log3 $name, 4, "$name: device reported firmware $version"; } } @@ -590,231 +1131,62 @@ sub ArduCounter_Parse($) foreach my $line (@lines) { #Log3 $name, 5, "$name: Parse line: $line"; - if ($line =~ 'R([\d]+) C([\d]+) D([\d]+) R([\d]+) T([\d]+)( N[\d]+)?( X[\d]+)?( F[\d]+)?( L[\d]+)?( A[\d]+)?( H.*)?') + if ($line =~ /^R([\d]+)/) { - # new count is beeing reported - my $pin = $1; - my $count = $2; - my $diff = $3; - my $rDiff = $4; - my $time = $5; - my $deTime = ($6 ? substr($6, 2) / 1000 : ""); - my $reject = ($7 ? substr($7, 2) : ""); - my $first = ($8 ? substr($8, 2) : ""); - my $last = ($9 ? substr($9, 2) : ""); - my $avgLen = ($10 ? substr($10, 2) : ""); - my $hist = ($11 ? substr($11, 2) : ""); + ArduCounter_ParseReport($hash, $line); - my $factor = AttrVal($name, "readingFactor$pin", AttrVal($name, "factor", 1000)); - my $rcname = AttrVal($name, "readingNameCount$pin", "pin$pin"); # internal count reading name - my $rlname = AttrVal($name, "readingNameLongCount$pin", "long$pin"); # long count - continues after reset - my $riname = AttrVal($name, "readingNameInterpolatedCount$pin", "interpolatedLong$pin"); # interpol. count - continues after reset, interpolates - my $rpname = AttrVal($name, "readingNamePower$pin", "power$pin"); # power reading name - my $lName = AttrVal($name, "readingNamePower$pin", AttrVal($name, "readingNameCount$pin", "pin$pin")); # for logging - - my $chIdx = 0; - my $sTime = $now - $time/1000; # start of observation interval (~first pulse) - my $fSTime = FmtDateTime($sTime); # formatted - my $fSdTim = FmtTime($sTime); # only time formatted - - my $eTime = $now; # now / end of observation interval - my $fETime = FmtDateTime($eTime); # formatted - my $fEdTim = FmtTime($eTime); # only time formatted - - if (!$time || !$factor) { - Log3 $name, 3, "$name: Pin $pin ($lName) skip line because time or factor is 0: $line"; - next; - } - my $power = sprintf ("%.3f", ($time ? $diff/$time/1000*3600*$factor : 0)); - - my $intrCount = 0; - my $offlTime = 0; - my $longCount = ReadingsVal($name, $rlname, 0); # alter long count Wert im Reading - my $intpCount = ReadingsVal($name, $riname, 0); # alter interpolated count Wert im Reading - if (!$hash->{CounterInterpolated}{$pin} && $hash->{CounterResetTime}) { - # arduino reboot -> try to interpolate - my $lastCountTime = ReadingsTimestamp ($name, $rlname, 0); # last time long count reading was set as string - my $lastCountTNum = time_str2num($lastCountTime); # ... as number - - my $lastInterval = ReadingsVal ($name, "timeDiff$pin", 0); - my $lastCDiff = ReadingsVal ($name, "countDiff$pin", 0); - - Log3 $name, 4, "$name: arduino was restarted so some impulses might have got lost for $pin ($lName)"; - $offlTime = sprintf ("%.2f", $hash->{CounterResetTime} - $lastCountTNum); - if ($lastCountTime && $lastInterval && ($offlTime > 0) && ($offlTime < 1000*60*60*12)) { - # > 0 and < 12h - my $lastRatio = $lastCDiff / $lastInterval; - my $curRatio = $diff / $time; - my $intRatio = 1000 * ($lastRatio + $curRatio) / 2; - $intrCount = int(($offlTime * $intRatio)+0.5); - - Log3 $name, 3, "$name: pin $pin ($lName): interpolation after counter reset, offline $offlTime secs, $intrCount estimated pulses (before $lastCDiff in $lastInterval ms, now $diff in $time ms, avg ratio $intRatio p/s)"; - Log3 $name, 5, "$name: pin $pin ($lName): adding interpolated $intrCount to interpolated count $intpCount"; - $intpCount += $intrCount; - - } else { - Log3 $name, 4, "$name: interpolation of missed pulses for pin $pin ($lName) not possible - no valid historic data."; - } - $hash->{CounterInterpolated}{$pin} = 1; - } - Log3 $name, 5, "$name: Pin $pin debug: adding $rDiff to long count $longCount and interpolated count $intpCount"; - $intpCount += $rDiff; - $longCount += $rDiff; - - Log3 $name, 4, "$name: Pin $pin ($lName) count $count " . - ($longCount ? "longCount $longCount " : "") . - ($intpCount ? "interpCount $intpCount " : "") . - "(diff $diff) in " . sprintf("%.3f", $time/1000) . "s" . - ((defined($reject) && $reject ne "") ? ", reject $reject" : "") . - (defined($avgLen) ? ", Avg Len ${avgLen}ms" : "") . - ", result $power"; - Log3 $name, 4, "$name: interval $fSdTim until $fEdTim" . - (defined($first) ? ", First at $first" : "") . - (defined($last) ? ", Last at $last" : ""); - - - readingsBeginUpdate($hash); - if (AttrVal($name, "readingStartTime$pin", 0)) { - # special way to set readings: use time of interval start as reading time - Log3 $name, 5, "$name: readingStartTime$pin specified: setting reading timestamp to $fSdTim"; - Log3 $name, 5, "$name: set readings $rpname to $power, timeDiff$pin to $time and countDiff$pin to $diff"; - - $hash->{".updateTime"} = $sTime; - $hash->{".updateTimestamp"} = $fSTime; - readingsBulkUpdate($hash, $rpname, $power) if ($time); - $hash->{CHANGETIME}[$chIdx++] = $fSTime; # Intervall start - - $hash->{".updateTime"} = $eTime; - $hash->{".updateTimestamp"} = $fETime; - readingsBulkUpdate($hash, $rcname, $count); - $hash->{CHANGETIME}[$chIdx++] = $fETime; - - readingsBulkUpdate($hash, $rlname, $longCount); - $hash->{CHANGETIME}[$chIdx++] = $fETime; - - readingsBulkUpdate($hash, $riname, $intpCount); - $hash->{CHANGETIME}[$chIdx++] = $fETime; - - if (defined($reject)) { - my $rejCount = ReadingsVal($name, "reject$pin", 0); # alter reject count Wert im Reading - readingsBulkUpdate($hash, "reject$pin", $reject + $rejCount); - $hash->{CHANGETIME}[$chIdx++] = $fETime; - } - if (AttrVal($name, "verboseReadings$pin", 0)) { - - readingsBulkUpdate($hash, "timeDiff$pin", $time); - $hash->{CHANGETIME}[$chIdx++] = $fETime; - - readingsBulkUpdate($hash, "countDiff$pin", $diff); - $hash->{CHANGETIME}[$chIdx++] = $fETime; - - readingsBulkUpdate($hash, "lastMsg$pin", $line); - $hash->{CHANGETIME}[$chIdx++] = $fETime; - - if ($hist) { - readingsBulkUpdate($hash, "pinHistory$pin", $hist); - $hash->{CHANGETIME}[$chIdx++] = $fETime; - } - } - } else { - # normal way to set readings - Log3 $name, 5, "$name: set readings $rpname to $power, timeDiff$pin to $time and countDiff$pin to $diff"; - readingsBulkUpdate($hash, $rpname, $power) if ($time); - #$eTime = time_str2num(ReadingsTimestamp ($name, $rpname, 0)); - readingsBulkUpdate($hash, $rcname, $count); - readingsBulkUpdate($hash, $rlname, $longCount); - readingsBulkUpdate($hash, $riname, $intpCount); - if (defined($reject)) { - my $rejCount = ReadingsVal($name, "reject$pin", 0); # alter reject count Wert im Reading - readingsBulkUpdate($hash, "reject$pin", $reject + $rejCount); - } - if (AttrVal($name, "verboseReadings$pin", 0)) { - readingsBulkUpdate($hash, "timeDiff$pin", $time); - readingsBulkUpdate($hash, "countDiff$pin", $diff); - readingsBulkUpdate($hash, "lastMsg$pin", $line); - readingsBulkUpdate($hash, "pinHistory$pin", $hist) if ($hist); - } - } - readingsEndUpdate($hash, 1); - - if ($deTime) { - if (defined ($hash->{'.DeTOff'}) && $hash->{'.LastDeT'}) { - if ($deTime >= $hash->{'.LastDeT'}) { - $hash->{'.Drift2'} = ($now - $hash->{'.DeTOff'}) - $deTime; - } else { - $hash->{'.DeTOff'} = $now - $deTime; - Log3 $name, 4, "$name: device clock wrapped or reset (now $deTime, before $hash->{'.LastDeT'}). New offset is $hash->{'.DeTOff'}"; - } - } else { - $hash->{'.DeTOff'} = $now - $deTime; - $hash->{'.Drift2'} = 0; - $hash->{'.DriftStart'} = $now; - Log3 $name, 5, "$name: Initialize clock offset to $hash->{'.DeTOff'}"; - } - $hash->{'.LastDeT'} = $deTime; + } elsif ($line =~ /^H([\d+]) (.+)/) { # pin pulse history as separate line + my $pin = $1; + my $hist = $2; + if (AttrVal($name, "verboseReadings$pin", 0)) { + readingsBeginUpdate($hash); + readingsBulkUpdate($hash, "pinHistory$pin", $hist); + readingsEndUpdate($hash, 1); } - my $drTime = ($now - $hash->{'.DriftStart'}); - Log3 $name, 5, "$name: Device Time $deTime" . - #", Offset " . sprintf("%.3f", $hash->{'.DeTOff'}/1000) . - ", Drift " . sprintf("%.3f", $hash->{'.Drift2'}) . - "s in " . sprintf("%.3f", $drTime) . "s" . - ($drTime > 0 ? ", " . sprintf("%.2f", $hash->{'.Drift2'} / $drTime * 100) . "%" : ""); - - if (!$hash->{Initialized}) { # device has not sent Started / hello yet - Log3 $name, 3, "$name: device is still counting"; - if (!$hash->{WaitForHello}) { # if hello has not already been sent, send it now - ArduCounter_SendHello("direct:$name"); - } - RemoveInternalTimer ("sendHello:$name"); # don't send hello again - } - - } elsif ($line =~ /ArduCounter V([\d\.]+).?Hello/) { # response to h(ello) - Log3 $name, 3, "$name: device replied to hello, V$1"; - ArduCounter_HandleVersion($hash, $line); - if ($hash->{Initialized}) { - ArduCounter_ConfigureDevice($hash) # send pin configuration - } - delete $hash->{WaitForHello}; - RemoveInternalTimer ("hwait:$name"); - RemoveInternalTimer ("sendHello:$name"); - - } elsif ($line =~ /Status: ArduCounter V([\d\.]+)/) { # response to s(how) - $retStr .= "\n" if ($retStr); - $retStr .= $line; - ArduCounter_HandleVersion($hash, $line); - - delete $hash->{WaitForHello}; - RemoveInternalTimer ("hwait:$name"); # dont wait for hello reply if already sent - RemoveInternalTimer ("sendHello:$name"); # Hello not needed anymore if not sent yet - - - } elsif ($line =~ /ArduCounter V([\d\.]+).?Started/) { # setup message - Log3 $name, 3, "$name: device sent setup message, V$1"; - ArduCounter_HandleVersion($hash, $line); - if ($hash->{Initialized}) { - ArduCounter_ConfigureDevice($hash) # send pin configuration - } - delete $hash->{WaitForHello}; - RemoveInternalTimer ("hwait:$name"); # dont wait for hello reply if already sent - RemoveInternalTimer ("sendHello:$name"); # Hello not needed anymore if not sent yet + } elsif ($line =~ /^M Next report in ([\d]+)/) { # end of report tells when next + $retStr .= ($retStr ? "\n" : "") . $line; + Log3 $name, 4, "$name: device: $line"; - $hash->{CounterResetTime} = $now; - delete $hash->{CounterInterpolated}; - - } elsif ($line =~ /V([\d\.]+).?Setup done/) { # old setup message - Log3 $name, 3, "$name: device is flashed with an old and incompatible firmware : $1"; - Log3 $name, 3, "$name: please use set $name flash to update"; - ArduCounter_HandleVersion($hash, $line); + } elsif ($line =~ /^I(.*)/) { # interval config report after show/hello + $hash->{runningCfg}{I} = $1; # save for later compare + $hash->{runningCfg}{I} =~ s/\s+$//; # remove spaces at end + $retStr .= ($retStr ? "\n" : "") . $line; + + } elsif ($line =~ /^P([\d]+) (falling|rising|-) ?(pullup)? ?min ([\d]+)/) { # pin configuration at device + $hash->{runningCfg}{$1} = "$2 $3 $4"; # save for later compare + + $retStr .= ($retStr ? "\n" : "") . $line; + Log3 $name, 4, "$name: device sent config for pin $1: $1 $2 min $3"; + + } elsif ($line =~ /^alive/) { # alive response + RemoveInternalTimer ("alive:$name"); + $hash->{WaitForAlive} = 0; + delete $hash->{KeepAliveRetries}; + + } elsif ($line =~ /^ArduCounter V([\d\.]+).*(Started|Hello)/) { # setup message + ArduCounter_ParseHello($hash, $line, $now); + + } elsif ($line =~ /^Status: ArduCounter V([\d\.]+)/) { # response to s(how) + $retStr .= ($retStr ? "\n" : "") . $line; + + } elsif ($line =~ /connection already busy/) { + my $now = gettimeofday(); + my $delay = AttrVal($name, "nextOpenDelay", 60); + Log3 $name, 4, "$name: _Parse: primary tcp connection seems busy - delay next open"; + ArduCounter_Disconnected($hash); # set to disconnected (state), remove timers + DevIo_CloseDev($hash); # close, remove from readyfnlist so _ready is not called again + RemoveInternalTimer ("delayedopen:$name"); + InternalTimer($now+$delay, "ArduCounter_DelayedOpen", "delayedopen:$name", 0); } elsif ($line =~ /^D (.*)/) { # debug / info Message from device - $retStr .= "\n" if ($retStr); - $retStr .= $1; + $retStr .= ($retStr ? "\n" : "") . $line; Log3 $name, 4, "$name: device: $1"; + } elsif ($line =~ /^M (.*)/) { # other Message from device - $retStr .= "\n" if ($retStr); - $retStr .= $1; + $retStr .= ($retStr ? "\n" : "") . $line; Log3 $name, 3, "$name: device: $1"; + } elsif ($line =~ /^[\s\n]*$/) { # blank line - ignore } else { @@ -853,8 +1225,7 @@ sub ArduCounter_Read($) ##################################### # Called from get / set to get a direct answer # called with logical device hash -sub -ArduCounter_ReadAnswer($$) +sub ArduCounter_ReadAnswer($$) { my ($hash, $expect) = @_; my $name = $hash->{NAME}; @@ -885,7 +1256,7 @@ ArduCounter_ReadAnswer($$) if($nfound < 0) { next if ($! == EAGAIN() || $! == EINTR() || $! == 0); my $err = $!; - DevIo_Disconnected($hash); + ArduCounter_Disconnected($hash); # set to disconnected, remove timers, let _ready try to reopen Log3 $name, 3, "$name: ReadAnswer error: $err"; return("ReadAnswer error: $err", undef); } @@ -925,67 +1296,31 @@ ArduCounter_ReadAnswer($$) -# -# copied from other FHEM modules -######################################################################### -sub ArduCounter_Ready($) -{ - my ($hash) = @_; - my $name = $hash->{NAME}; - - if (AttrVal($name, "disable", undef)) { - return; - } - - # try to reopen if state is disconnected - if ( $hash->{STATE} eq "disconnected" ) { - #Log3 $name, 3, "$name: ReadyFN tries to open"; # debug - delete $hash->{Initialized}; - DevIo_OpenDev( $hash, 1, undef ); - if ($hash->{FD}) { - Log3 $name, 3, "$name: device maybe not initialized yet, set timer to send h(ello"; - my $now = gettimeofday(); - my $hdl = AttrVal($name, "helloSendDelay", 3); - RemoveInternalTimer ("sendHello:$name"); - InternalTimer($now+$hdl, "ArduCounter_SendHello", "sendHello:$name", 0); - } - return; - } - - # This is relevant for windows/USB only - my $po = $hash->{USBDev}; - if ($po) { - my ( $BlockingFlags, $InBytes, $OutBytes, $ErrorFlags ) = $po->status; - return ( $InBytes > 0 ); - } -} - - 1; =pod =item device -=item summary Module for consumption counter based on an arduino with the ArduCounter sketch -=item summary_DE Modul für Strom / Wasserzähler auf Arduino-Basis mit ArduCounter Sketch +=item summary Module for counters based on arduino / ESP8266 board +=item summary_DE Modul für Strom / Wasserzähler mit Arduino- oder ESP8266 =begin html

ArduCounter

    - This module implements an Interface to an Arduino based counter for pulses on any input pin of an Arduino Uno, Nano or similar device like a Jeenode.
    - The typical use case is an S0-Interface on an energy meter or water meter
    + This module implements an Interface to an Arduino or ESP8266 based counter for pulses on any input pin of an Arduino Uno, Nano, Jeenode, NodeMCU, Wemos D1 or similar device. The device connects to Fhem either through USB / serial or via tcp if an ESP board is used.
    + The typical use case is an S0-Interface on an energy meter or water meter
    Counters are configured with attributes that define which Arduino pins should count pulses and in which intervals the Arduino board should report the current counts.
    The Arduino sketch that works with this module uses pin change interrupts so it can efficiently count pulses on all available input pins.
    - The module creates readings for pulse counts, consumption and optionally also a pulse history with pulse lengths and gaps of the last 20 pulses. + The module creates readings for pulse counts, consumption and optionally also a pulse history with pulse lengths and gaps of the last pulses.

    Prerequisites

    • - This module requires an Arduino uno, nano, Jeenode or similar device running the ArduCounter sketch provided with this module
      - In order to flash an arduino board with the corresponding ArduCounter firmware, avrdude needs to be installed. + This module requires an Arduino Uno, Nano, Jeenode, NodeMCU, Wemos D1 or similar device based on an Atmel 328p or ESP8266 running the ArduCounter sketch provided with this module
      + In order to flash an arduino board with the corresponding ArduCounter firmware from within Fhem, avrdude needs to be installed.

    @@ -994,18 +1329,22 @@ sub ArduCounter_Ready($) Define

      - define <name> ArduCounter <device> + define <name> ArduCounter <device>
      + or
      + define <name> ArduCounter <ip:port>

      <device> specifies the serial port to communicate with the Arduino.
      + <ip:port> specifies the ip address and tcp port to communicate with an esp8266 where port is typically 80.
      The name of the serial-device depends on your distribution. - You can also specify a baudrate if the device name contains the @ + You can also specify a baudrate for serial connections if the device name contains the @ character, e.g.: /dev/ttyUSB0@38400
      The default baudrate of the ArduCounter firmware is 38400 since Version 1.4
      Example:

        define AC ArduCounter /dev/ttyUSB2@38400
      +
        define AC ArduCounter 192.168.1.134:80

    @@ -1013,14 +1352,15 @@ sub ArduCounter_Ready($) Configuration of ArduCounter counters

      Specify the pins where impulses should be counted e.g. as attr AC pinX falling pullup 30
      - The X in pinX can be an Arduino pin number with or without the letter D e.g. pin4, pinD5, pin6, pinD7 ...
      + The X in pinX can be an Arduino / ESP pin number with or without the letter D e.g. pin4, pinD5, pin6, pinD7 ...
      After the pin you can use the keywords falling or rising to define if a logical one / 5V (rising) or a logical zero / 0V (falling) should be treated as pulse.
      - The optional keyword pullup activates the pullup resistor for the given Arduino Pin.
      + The optional keyword pullup activates the pullup resistor for the given Pin.
      The last argument is also optional but recommended and specifies a minimal pulse length in milliseconds.
      - An energy meter with S0 interface is typically connected to GND and an input pin like D4. The S0 pulse then pulls the input to 0V.
      - Since the minimal pulse lenght of the s0 interface is specified to be 30ms, the typical configuration for an s0 interface is
      - attr AC pinX falling pullup 30
      - Specifying a minimal pulse length is recommended since it filters bouncing of reed contacts or other noise. + An energy meter with S0 interface is typically connected to GND and an input pin like D4.
      + The S0 pulse then pulls the input to 0V.
      + Since the minimal pulse lenght of the s0 interface is specified to be 30ms, the typical configuration for an s0 interface is
      + attr AC pinX falling pullup 30
      + Specifying a minimal pulse length is recommended since it filters bouncing of reed contacts or other noise.

      Example:
      @@ -1029,19 +1369,19 @@ sub ArduCounter_Ready($)
               attr AC interval 60 300
               attr AC pinD4 falling pullup 5
               attr AC pinD5 falling pullup 30
      -		attr AC verboseReadings5
      +        attr AC verboseReadings5
               attr AC pinD6 rising
               
      - + This defines three counters connected to the pins D4, D5 and D5.
      D4 and D5 have their pullup resistors activated and the impulse draws the pins to zero.
      For D4 and D5 the arduino measures the time in milliseconds between the falling edge and the rising edge. If this time is longer than the specified 5 or 30 milliseconds - then the impulse is counted. If the time is shorter then this impulse is regarded as noise and added to a separate reject counter.
      - verboseReadings5 causes the module to create additional readings like the pulse history which shows length and gaps between the last pulses.
      + then the impulse is counted. If the time is shorter then this impulse is regarded as noise and added to a separate reject counter.
      + verboseReadings5 causes the module to create additional readings like the pulse history which shows length and gaps between the last pulses.
      For pin D6 the arduino does not check pulse lengths and counts every time when the signal changes from 0 to 1.
      The ArduCounter sketch which must be loaded on the Arduino implements this using pin change interrupts, so all avilable input pins can be used, not only the ones that support normal interrupts.
      - The module has been tested with 14 inputs of an Arduino Uno counting in parallel and pulses as short as 3 milliseconds. + The module has been tested with 14 inputs of an Arduino Uno counting in parallel and pulses as short as 3 milliseconds.

    @@ -1049,7 +1389,7 @@ sub ArduCounter_Ready($) Set-Commands
    • raw
    • - send the value to the Arduino board so you can directly talk to the sketch using its commands.
      + send the value to the board so you can directly talk to the sketch using its commands.
      This is not needed for normal operation but might be useful sometimes for debugging
    • flash
    • flashes the ArduCounter firmware ArduCounter.hex from the fhem subdirectory FHEM/firmware @@ -1058,8 +1398,11 @@ sub ArduCounter_Ready($) the command is used. So normally there is no need to modify this attribute.
      Depending on your specific Arduino board however, you might need to insert -b 57600 in the flash Command. (e.g. for an Arduino Nano)

      + ESP boards so far have to be fashed from the Arduino IDE. In a future version flashing over the air sould be supported.
    • reset
    • reopens the arduino device and sends a command to it which causes a reinitialize and reset of the counters. Then the module resends the attribute configuration / definition of the pins to the device. +
    • saveConfig
    • + stores the current interval and pin configuration to be stored in the EEPROM of the counter device so it can be retrieved after a reset.

    @@ -1077,7 +1420,7 @@ sub ArduCounter_Ready($)
  • readingFnAttributes

  • pin.*
  • - Define a pin of the Arduino board as input. This attribute expects either + Define a pin of the Arduino or ESP board as input. This attribute expects either rising, falling or change, followed by an optional pullup and an optional number as value.
    If a number is specified, the arduino will track rising and falling edges of each impulse and measure the length of a pulse in milliseconds. The number specified here is the minimal length of a pulse and a pause before a pulse. If one is too small, the pulse is not counted but added to a separate reject counter.
  • interval normal max min mincout
  • @@ -1120,10 +1463,31 @@ sub ArduCounter_Ready($) Allow the reading time stamp to be set to the beginning of measuring intervals.
  • verboseReadings[0-9]+
  • create readings timeDiff, countDiff and lastMsg for each pin
    -
  • flashCommand
  • - sets the command to call avrdude and flash the onnected arduino with an updated hex file (by default it looks for ArduCounter.hex in the FHEM/firmware subdirectory.
    - This attribute contains avrdude -p atmega328P -c arduino -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE] by default.
    - For an Arduino Nano based counter you should add -b 57600 e.g. between the -P and -D options. +
  • flashCommand
  • + sets the command to call avrdude and flash the onnected arduino with an updated hex file (by default it looks for ArduCounter.hex in the FHEM/firmware subdirectory.
    + This attribute contains avrdude -p atmega328P -c arduino -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE] by default.
    + For an Arduino Nano based counter you should add -b 57600 e.g. between the -P and -D options. + +
  • keepAliveDelay
  • + defines an interval in which the module sends keepalive messages to a counter device that is conected via tcp.
    + This attribute is ignored if the device is connected via serial port.
    + If the device doesn't reply within a defined timeout then the module closes and tries to reopen the connection.
    + 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
    + The delay defaults to 10 seconds. +
  • keepAliveTimeout
  • + defines the timeout when wainting for a keealive reply (see keepAliveDelay) + The timeout defaults to 2 seconds. +
  • nextOpenDelay
  • + defines the time that the module waits before retrying to open a disconnected tcp connection.
    + This defaults to 60 seconds. +
  • openTimeout
  • + defines the timeout after which tcp open gives up trying to establish a connection to the counter device. + This timeout defaults to 3 seconds. +
  • silentReconnect
  • + if set to 1, then it will set the loglevel for "disconnected" and "reappeared" messages to 4 instead of 3 +
  • disable
  • + if set to 1 then the module closes the connection to a counter device.
    +

Readings / Events
@@ -1131,19 +1495,25 @@ sub ArduCounter_Ready($) The module creates at least the following readings and events for each defined pin:
  • pin.*
  • the current count at this pin -
  • long.*
  • - long count which keeps on counting up after fhem restarts whereas the pin.* count is only a temporary internal count that starts at 0 when the arduino board starts. -
  • interpolatedLong.*
  • - like long.* but when the Arduino restarts the potentially missed pulses are interpolated based on the pulse rate before the restart and after the restart. -
  • reject.*
  • - counts rejected pulses that are shorter than the specified minimal pulse length. +
  • long.*
  • + long count which keeps on counting up after fhem restarts whereas the pin.* count is only a temporary internal count that starts at 0 when the arduino board starts. +
  • interpolatedLong.*
  • + like long.* but when the Arduino restarts the potentially missed pulses are interpolated based on the pulse rate before the restart and after the restart. +
  • reject.*
  • + counts rejected pulses that are shorter than the specified minimal pulse length.
  • power.*
  • the current calculated power at this pin -
  • pinHistory.*
  • - shows detailed information of the last pulses. This is only available when a minimal pulse length is specified for this pin. Also the total number of impulses recorded here is limited to 20 for all pins together. The output looks like -36/7:0C, -29/7:1G, -22/8:0C, -14/7:1G, -7/7:0C, 0/7:1G
    - The first number is the relative time in milliseconds when the input level changed, followed by the length in milliseconds, the level and the internal action.
    - -36/7:0C for example means that 36 milliseconds before the reporting started, the input changed to 0V, stayed there for 7 milliseconds and this was counted.
    - +
  • pinHistory.*
  • + shows detailed information of the last pulses. This is only available when a minimal pulse length is specified for this pin. Also the total number of impulses recorded here is limited to 20 for all pins together. The output looks like -36/7:0C, -29/7:1G, -22/8:0C, -14/7:1G, -7/7:0C, 0/7:1G
    + The first number is the relative time in milliseconds when the input level changed, followed by the length in milliseconds, the level and the internal action.
    + -36/7:0C for example means that 36 milliseconds before the reporting started, the input changed to 0V, stayed there for 7 milliseconds and this was counted.
    +
  • countDiff.*
  • + delta of the current count to the last reported one. This is used together with timeDiff.* to calculate the power consumption. +
  • timeDiff.*
  • + time difference between the first pulse in the current observation interval and the last one. Used togehter with countDiff to calculate the power consumption. +
  • seq.*
  • + internal sequence number of the last report from the board to fhem. +
    diff --git a/fhem/FHEM/firmware/ArduCounter.bin b/fhem/FHEM/firmware/ArduCounter.bin new file mode 100755 index 0000000000000000000000000000000000000000..ac33fd1777f2d9d0f3feabff9bf9accb64328ce5 GIT binary patch literal 273744 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�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 literal 0 HcmV?d00001 diff --git a/fhem/FHEM/firmware/ArduCounter.hex b/fhem/FHEM/firmware/ArduCounter.hex index 8a2f858da..9fc321541 100755 --- a/fhem/FHEM/firmware/ArduCounter.hex +++ b/fhem/FHEM/firmware/ArduCounter.hex @@ -1,570 +1,757 @@ -:100000000C9479010C94A1010C94A1010C94C607E5 -:100010000C94A1070C947C070C94A1010C94A101F1 -:100020000C94A1010C94A1010C94A1010C94A101C8 -:100030000C94A1010C94A1010C94A1010C94A101B8 -:100040000C9432070C94A1010C9400070C94DA066E -:100050000C94A1010C94A1010C94A1010C94A10198 -:100060000C94A1010C94A1014572726F723A2000A8 -:1000700041726475436F756E7465722056322E300E -:1000800035002C20617667206C656E20002C206C7A -:1000900061737420617420004D20202066697273A2 -:1000A0007420617420002052656A2000206D730066 -:1000B0002920696E200020282B002C20636F756E8C -:1000C0007420002C206E6F206D696E206C656E00B0 -:1000D0002066616C6C696E670020726973696E6777 -:1000E00000206D73002C206D696E206C656E200001 -:1000F0006368616E67650066616C6C696E6700724B -:100100006973696E67002C20694D6F64652000502B -:1001100043496E742070696E2000205374617274BC -:1001200065640000000008000201000003040700ED -:100130000000000000000000000000250028002B47 -:100140000000000000240027002A0020004D206449 -:100150006566696E65642070696E200000000000AD -:10016000230026002900416464496E7400496C6CC8 -:100170006567616C206D6F646520666F72207069C1 -:100180006E2073706563696669636174696F6E2060 -:1001900000496C6C6567616C2070696E20737065D6 -:1001A00063696669636174696F6E20000404040406 -:1001B0000404040402020202020203030303030311 -:1001C00001020408102040800102040810200102EE -:1001D000040810204D2072656D6F76656420005212 -:1001E000656D496E7400496C6C6567616C2070695F -:1001F0006E2073706563696669636174696F6E20F0 -:10020000002000200020004D20696E746572766128 -:100210006C732073657420746F200073697A6500B5 -:1002200020002061742000206C656E200020737413 -:100230006172742000442070696E20004420707543 -:100240006C736520686973746F72793A2000204D71 -:10025000696C6C697365636F6E6473004D204E65E5 -:100260007874207265706F727420696E20002000AF -:100270004D2070696E20004D206D696E20636F7592 -:100280006E7420004D206D696E20696E7465727603 -:10029000616C20004D206D617820696E7465727606 -:1002A000616C20004D206E6F726D616C20696E7400 -:1002B000657276616C20004D205374617475733AD9 -:1002C000200048656C6C6F003A002F002C20002045 -:1002D0004800204100204C00204600205800204EBD -:1002E000002054002052002044002043005200000F -:1002F000111111241FBECFEFD8E0DEBFCDBF11E03A -:10030000A0E0B1E0E8E4F3E202C005900D92A03471 -:10031000B107D9F726E0A0E4B1E001C01D92AD3FDE -:10032000B207E1F711E0C9E7D1E004C02197FE016F -:100330000E949711C837D107C9F70E94D6080C94BC -:10034000A2110C940000CF92DF92EF92FF920F93D4 -:100350001F93CF93DF936C017A018B01C0E0D0E053 -:10036000CE15DF0589F0D8016D918D01D601ED9193 -:10037000FC910190F081E02DC6010995892B11F4C3 -:100380007E0102C02196ECCFC701DF91CF911F9172 -:100390000F91FF90EF90DF90CF900895FC01918D29 -:1003A000828D981761F0828DDF01A80FB11D5D96D7 -:1003B0008C91928D9F5F9F73928F90E008958FEF45 -:1003C0009FEF0895FC01918D828D981731F0828DF9 -:1003D000E80FF11D858D90E008958FEF9FEF089550 -:1003E000FC01918D228D892F90E0805C9F4F821BB4 -:1003F00091098F739927089580E696E00E94F00195 -:1004000021E0892B09F420E0822F0895FC01848DDE -:10041000DF01A80FB11DA35ABF4F2C91848D90E02E -:1004200001968F739927848FA689B7892C93A08909 -:10043000B1898C9180648C93938D848D981306C0C0 -:100440000288F389E02D80818F7D80830895EF926B -:10045000FF920F931F93CF93DF93EC0181E0888F7E -:100460009B8D8C8D981305C0E889F989808185FD65 -:1004700024C0F62E0B8D10E00F5F1F4F0F73112756 -:10048000E02E8C8DE8120CC00FB607FCFACFE8897D -:10049000F989808185FFF5CFCE010E940602F1CF58 -:1004A0008B8DFE01E80FF11DE35AFF4FF0820B8F99 -:1004B000EA89FB898081806207C0EE89FF896083B9 -:1004C000E889F98980818064808381E090E0DF9110 -:1004D000CF911F910F91FF90EF900895CF93DF93ED -:1004E000EC01888D8823C9F0EA89FB89808185FD2C -:1004F00005C0A889B9898C9186FD0FC00FB607FC8D -:10050000F5CF808185FFF2CFA889B9898C9185FFCD -:10051000EDCFCE010E940602E7CFDF91CF91089583 -:1005200080E090E0892B29F00E94FC0181110C945D -:10053000000008953FB7F89480915D0190915E01AD -:10054000A0915F01B091600126B5A89B05C02F3F27 -:1005500019F00196A11DB11D3FBFBA2FA92F982FE9 -:100560008827820F911DA11DB11DBC01CD0142E064 -:10057000660F771F881F991F4A95D1F708952FB7E7 -:10058000F8946091590170915A0180915B019091AA -:100590005C012FBF08952F923F924F925F926F920E -:1005A0007F928F929F92AF92BF92CF92DF92EF9203 -:1005B000FF920F931F93CF93DF9300D000D0CDB75E -:1005C000DEB7882E0E94BF02AB01BC01282D30E0AF -:1005D000F901EE0FFF1FE05AFE4FA591B4914C9028 -:1005E0004C82F901EF53FE4F908094244082220FF9 -:1005F000331FF901E25EFE4F0190F081E02D808112 -:10060000982209F460C1880C880C880C212C312CAC -:10061000AA24A39487E4B82E81E090E0022C01C0C4 -:10062000880F0A94EAF7292D282309F444C1182DCC -:10063000120D5C808521E1E009F4E0E0212F30E03B -:10064000D901A452BE4FF1E08C91833009F0F0E063 -:10065000C901880F991F880F991FDC01AF59BE4F40 -:10066000CD90DD90ED90FC902A013B014C185D0887 -:100670006E087F0873016201A091FB02AF5FA09337 -:10068000FB02A091FB02A43110F01092FB02A0919A -:10069000FB02B0E0A951BD4F1C931091FB02DC019D -:1006A000AF59BE4F4D905D906D907C9004E0109FCF -:1006B000D0011124A956BD4F4D925D926D927C924E -:1006C0001397A091FB0214E0A19FD0011124A95B14 -:1006D000BD4FCD92DD92ED92FC921397A091FB025B -:1006E0006A2E712CAE2FAA25A98383010D5C1D4FA4 -:1006F0004A2ED8014C92A091FB02B0E0A15EBD4F02 -:1007000010E2512E5C92D901AC53BE4FAC91A13096 -:1007100011F0EF13C9C03901660C771C7B826A8225 -:100720008301045E1B4FD8014D905C90411451042D -:1007300009F4BAC0612C712CC414D504E604F70482 -:1007400040F59C012F593E4FD9014D935D936D9318 -:100750007C931397EF17A1F0AA81BB81A451BC4FE2 -:100760002D913C9111972F5F3F4F11963C932E9303 -:10077000E091FB02F0E0E15EFD4FB2E5B08394C092 -:10078000E091FB02F0E0E15EFD4FA8E54A2E4082D9 -:100790008BC0D901A05CBE4FEF1308C02C91E09133 -:1007A000FB02F0E0E15EFD4FB0827CC0EC91EF1700 -:1007B00009F461C0FC01EC5DFA4F40835183628310 -:1007C0007383FC01E45AFC4F408051806280738047 -:1007D00045284628472821F4408351836283738348 -:1007E00089010C501E4F1B830A83F8011081FC0104 -:1007F000EC53FB4F4080518062807380112351F095 -:100800000FEF401A500A600A700A408251826282D9 -:10081000738219C01FEF411A510A610A710A40829E -:10082000518262827382F901E455FB4F20812F5F70 -:100830002083FC01EC57FA4F40835183628373831A -:10084000EA81FB81A082FC01E450FD4F4080518091 -:1008500062807380C40CD51CE61CF71CC082D18258 -:10086000E282F382E091FB02F0E0E15EFD4F33E4CF -:10087000432E408217C0FC01E450FD4F4080518060 -:1008800062807380C40CD51CE61CF71CC082D18228 -:10089000E282F382E091FB02F0E0E15EFD4F20E5B1 -:1008A000522E508269806C92FC01EF59FE4F4083BA -:1008B0005183628373830FEF201A300A18E02116E8 -:1008C000310409F0A9CE0F900F900F900F90DF9197 -:1008D000CF911F910F91FF90EF90DF90CF90BF903D -:1008E000AF909F908F907F906F905F904F903F90D0 -:1008F0002F900895E82FF0E0E455FE4FE491E25088 -:10090000E13011F4865005C0877098E0E99F800DB2 -:10091000112490E00895CF93DF93C0E7D0E0F0E09A -:10092000C138DF0731F0FE0184910E94EB07219668 -:10093000F6CFDF91CF910895CF93DF93C8E6D0E053 -:10094000F0E0CF36DF0731F0FE0184910E94EB0723 -:100950002196F6CFDF91CF9108952F923F924F923B -:100960005F926F927F928F929F92AF92BF92CF923F -:10097000DF92EF92FF920F931F93CF93DF93CDB748 -:10098000DEB727970FB6F894DEBF0FBECDBF8983C1 -:10099000282E312CC101880F991F880F991F9F8322 -:1009A0008E83FC01EC5DFA4FC080D180E280F38041 -:1009B0008C010C571A4FF80180819181A281B3817B -:1009C000C81AD90AEA0AFB0AEE81FF81EC53FB4FF1 -:1009D0004080518062807380F101E455FB4F80813B -:1009E00053014201881A9108A108B108EE81FF81E4 -:1009F000E45BFB4F80819181A281B381881A990ABF -:100A0000AA0ABB0AC114D104E104F10469F40E94EA -:100A1000BF02F80100811181228133816B017C01C9 -:100A2000C01AD10AE20AF30A8FE091E00E9462083C -:100A30002981622F70E080E090E04AE00E94FE078A -:100A400086E091E00E946208F101EC53FE4F808144 -:100A5000823051F0833029F0813051F480EF90E002 -:100A600005C08FEF90E002C087EF90E00E9462081F -:100A70008101000F111F9801245E3B4FF901808115 -:100A80009181892B11F185EE90E02C833D830E94AA -:100A900062082C813D81F9016081718180E090E0E4 -:100AA0004AE00E94FE0781EE90E00E946208F10198 -:100AB000E452FE4F8081823029F0833051F489ED79 -:100AC00090E005C080ED90E002C083EC90E00E94D1 -:100AD00062088AEB90E00E946208C301B2010E94A2 -:100AE0004F0886EB90E00E946208C501B4010E94A5 -:100AF0004F0880EB90E00E946208C701B6010E9497 -:100B00004F088CEA90E00E946208F801E45EFB4F17 -:100B100080819181892BA9F086EA90E00E94620889 -:100B2000F801E451FC4F60817181F801E454FC4FFD -:100B300080819181681B790B80E090E04AE00E94FF -:100B4000FE0781149104A104B10409F46EC00E944F -:100B5000F60788E990E00E946208EE81FF81E45A7E -:100B6000FC4F80819181A281B3810E811F810C5144 -:100B70001A4FF801C080D180E280F380BC01CD0122 -:100B80006C197D098E099F090E944F088DE890E03D -:100B90000E946208EE81FF81EC5DFA4F80819181B5 -:100BA000A281B381F8010081118122813381BC01CE -:100BB000CD01601B710B820B930B0E944F08F894C0 -:100BC000EE81FF81E450FD4F6081718182819381CC -:100BD000A50194010E945211789482E890E02C8340 -:100BE0003D834A835B830E9462082C813D814A8158 -:100BF0005B81CA01B90127960FB6F894DEBF0FBE1C -:100C0000CDBFDF91CF911F910F91FF90EF90DF90BB -:100C1000CF90BF90AF909F908F907F906F905F909C -:100C20004F903F902F900C944F0827960FB6F89452 -:100C3000DEBF0FBECDBFDF91CF911F910F91FF900F -:100C4000EF90DF90CF90BF90AF909F908F907F906C -:100C50006F905F904F903F902F900895AF92BF920A -:100C6000CF92DF92EF92FF920F931F93CF93DF9378 -:100C70000E94BF026B017C010E94F6070E948B0458 -:100C80008AE191E00E94AD0844E456E0CCE4D4E06F -:100C9000ACE1B4E0ECEBAE2EE3E0BE2E04EE15E0EA -:100CA00080E090E0FA011192AF019C012C503E4F80 -:100CB000F90110829C01220F331F220F331FB9014B -:100CC0006C537B4FFB011082118212821382BC0194 -:100CD00064557B4FFB011082199219921992199257 -:100CE000B9016C577A4FFB01C082D182E282F38254 -:100CF000B9016C5D7A4FFB01C082D182E282F3823E -:100D00002F593E4FF901C082D182E282F3821D92B7 -:100D10001D929C01220F331F24513C4FF901118277 -:100D20001082F501119211925F01F801C192D192E6 -:100D3000E192F1928F0101968831910509F0B2CFCD -:100D4000E0E6F1E0A591B4918C918093C101E2E6D7 -:100D5000F1E0A591B4918C918093C201E4E6F1E0B9 -:100D6000A591B4918C918093C3010E94BF02009120 -:100D70000601109107012091080130910901DC0161 -:100D8000CB01800F911FA21FB31F80935C0690932D -:100D90005D06A0935E06B0935F06DF91CF911F9131 -:100DA0000F91FF90EF90DF90CF90BF90AF9008959C -:100DB0000E949D111F920F920FB60F9211242F9334 -:100DC0003F934F935F936F937F938F939F93AF93D3 -:100DD000BF93EF93FF9380E696E00E940602FF9197 -:100DE000EF91BF91AF919F918F917F916F915F91A3 -:100DF0004F913F912F910F900FBE0F901F9018951C -:100E00001F920F920FB60F9211242F938F939F93DF -:100E1000EF93FF93E0917006F09171068081E0916D -:100E20007606F091770682FD12C090818091790656 -:100E30008F5F8F7320917A06821751F0E0917906C7 -:100E4000F0E0E05AF94F958F8093790601C08081D8 -:100E5000FF91EF919F918F912F910F900FBE0F9067 -:100E60001F9018951F920F920FB60F9211242F9377 -:100E70003F938F939F93AF93BF938091590190912C -:100E80005A01A0915B01B0915C013091580123E0BF -:100E9000230F2D3720F40196A11DB11D05C026E8B2 -:100EA000230F0296A11DB11D209358018093590173 -:100EB00090935A01A0935B01B0935C0180915D0116 -:100EC00090915E01A0915F01B09160010196A11D1A -:100ED000B11D80935D0190935E01A0935F01B0937B -:100EE0006001BF91AF919F918F913F912F910F9092 -:100EF0000FBE0F901F9018951F920F920FB60F9272 -:100F000011242F933F934F935F936F937F938F930E -:100F10009F93AF93BF93EF93FF9382E00E94CB0226 -:100F2000FF91EF91BF91AF919F918F917F916F91C1 -:100F30005F914F913F912F910F900FBE0F901F9097 -:100F400018951F920F920FB60F9211242F933F9373 -:100F50004F935F936F937F938F939F93AF93BF93C1 -:100F6000EF93FF9381E00E94CB02FF91EF91BF913D -:100F7000AF919F918F917F916F915F914F913F9131 -:100F80002F910F900FBE0F901F9018951F920F92E8 -:100F90000FB60F9211242F933F934F935F936F934C -:100FA0007F938F939F93AF93BF93EF93FF9380E0D3 -:100FB0000E94CB02FF91EF91BF91AF919F918F91D2 -:100FC0007F916F915F914F913F912F910F900FBE45 -:100FD0000F901F901895E0916006F09161060190C6 -:100FE000F081E02D682F80E696E0099442E050E021 -:100FF0006CE371E080E696E00C94A3018F929F92DF -:10100000AF92BF920F931F93CF93DF93CDB7DEB70D -:10101000A1970FB6F894DEBF0FBECDBF19A2423024 -:1010200008F44AE08E010F5D1F4F842E912CA12CF5 -:10103000B12CA50194010E945211E62FB901CA01F9 -:1010400001501109EA3014F4E05D01C0E95CD801F7 -:10105000EC93232B242B252B61F70115110571F03F -:10106000F80101900020E9F73197AF01401B510BC7 -:10107000B80180E696E00E94A30102C080E090E003 -:10108000A1960FB6F894DEBF0FBECDBFDF91CF9112 -:101090001F910F91BF90AF909F908F9008954AE05D -:1010A0000C94FE07CF93DF93BC0180E090E04AE010 -:1010B0000E94FE07EC010E94F6078C0F9D1FDF9136 -:1010C000CF9108950F931F93CF93DF938C01C0E0CE -:1010D000D0E0F801EC0FFD1F6491662371F0E09100 -:1010E0006006F09161060190F081E02D80E696E0C7 -:1010F0000995892B11F02196ECCFCE01DF91CF918C -:101100001F910F910895CF92DF92EF92FF92CF93AC -:10111000DF9397FF19C06B017C018DE20E94EB0702 -:10112000EC0166277727CB016C197D098E099F0991 -:101130004AE00E94FE078C0F9D1FDF91CF91FF9028 -:10114000EF90DF90CF9008954AE0DF91CF91FF902C -:10115000EF90DF90CF900C94FE07CF93DF930E9427 -:101160006208EC010E94F6078C0F9D1FDF91CF9162 -:101170000895CF93DF934AE00E94FE07EC010E949E -:10118000F6078C0F9D1FDF91CF910895CF93DF93CA -:10119000BC01990F880B990B0E948308EC010E94F7 -:1011A000F6078C0F9D1FDF91CF910895CF93DF93AA -:1011B000CDB7DEB7E2970FB6F894DEBF0FBECDBF56 -:1011C000789484B5826084BD84B5816084BD85B522 -:1011D000826085BD85B5816085BD80916E0081602E -:1011E00080936E00109281008091810082608093D4 -:1011F00081008091810081608093810080918000D6 -:101200008160809380008091B10084608093B10000 -:101210008091B00081608093B00080917A008460FA -:1012200080937A0080917A00826080937A00809126 -:101230007A00816080937A0080917A008068809340 -:101240007A001092C100E0917006F091710682E080 -:101250008083E0916C06F0916D061082E0916E063D -:10126000F0916F0683E3808310927806E091740614 -:10127000F091750686E08083E0917206F091730626 -:10128000808180618083E0917206F0917306808195 -:1012900088608083E0917206F09173068081806897 -:1012A0008083E0917206F091730680818F7D808348 -:1012B0000E949A024B015C01F4EFCF2EDD24D394FF -:1012C000E12CF12C0E949A02DC01CB0188199909CA -:1012D000AA09BB09883E9340A105B10558F001E079 -:1012E000C01AD108E108F10818EE810E13E0911E32 -:1012F000A11CB11CC114D104E104F10419F77894C4 -:101300000E942E0684E496E0E8E1CE2EC80EC8A620 -:101310000E94BF026D877E878F87988B80E696E05C -:101320000E94F001892B09F4D4C380E696E00E9464 -:10133000CE018C32C9F480911E02873008F0C9C3F7 -:10134000E82FF0E0EE0FFF1FE45FFD4F20911C023D -:1013500030911D02318320838F5F80931E02109293 -:101360001D0210921C02B5C390ED980F9A30B0F494 -:1013700040911C0250911D029AE0949F9001959F0C -:10138000300D1124205331097901E80EF11C87FD3D -:10139000FA94F0921D02E0921C029BC39FE9980F01 -:1013A0009A3108F096C3883609F47DC334F4813647 -:1013B00071F0843609F483C17EC3823709F4A9C26F -:1013C000833709F4A9C2893609F075C3CFC1C0902B -:1013D0001E02EC2DF0E0EE0FFF1FE45FFD4F809149 -:1013E0001C0290911D0291838083C394C0921E02BF -:1013F0000E94BF024B015C0100910C0210910D0292 -:10140000802F0E947A047C01C8010197479748F415 -:10141000F801EC5DFE4F8081882319F028E12E153C -:1014200040F40E949C0481E991E00E946208C80196 -:10143000A8C6A80144555E4F3A01FA0124915EEF17 -:10144000D52ED20E80910E0290910F02823091051E -:1014500079F08330910599F00197D9F00E949C04AE -:101460008DE691E00E946208C8010E94C6080FC084 -:10147000F701FF27E452FE4F82E0808308C0F701A6 -:10148000FF27E452FE4F83E0808363E003C062E005 -:1014900001C061E0C80180549E4FFC017491F301CA -:1014A00024912223C1F030E0220F331FF901EF5BBA -:1014B000FE4FA591B491F901E95CFE4F459154911D -:1014C0003FB7F8942C91709527232C93DA012C9137 -:1014D00072237C933FBFB2E0BC1508F054C020914A -:1014E000100230911102232B09F441C0F801ED5D87 -:1014F000FE4F3491FC012491F30144914423B9F14E -:10150000332339F1333091F038F43130A9F03230EF -:1015100001F534B53F7D12C0373091F03830A1F07D -:101520003430B9F4309180003F7D03C030918000A9 -:101530003F77309380000DC034B53F7734BD09C08C -:101540003091B0003F7703C03091B0003F7D3093C1 -:10155000B000E42FF0E0EE0FFF1FE95CFE4FA59115 -:10156000B4913FB7F8944C91242B2C933FBFF3E0F8 -:10157000CF1649F020911202309113022115310546 -:1015800021F061E002C020E030E0FC018491F30131 -:101590006490662009F4B4C56A946A94E62DF0E07C -:1015A000EE0FFF1FE25EFE4F0190F081E02D908173 -:1015B000892B80834091680081E090E001C0880F12 -:1015C0006A94EAF7842B80936800A7015527FA01F3 -:1015D000EC53FE4F6083CA01880F991FFC01E45E43 -:1015E000FB4F31832083DA01AC5BB94F2C9130E0A3 -:1015F0002017310709F451C02D2D30E0F901EE0F0D -:10160000FF1FE05AFE4F65917491FB016081F90163 -:10161000EF53FE4F60830C93FA01EC50FE4F1082A3 -:101620009A01220F331F220F331FF901EC53FB4F96 -:101630001082118212821382FA01E455FB4F10824C -:10164000F901E45BFB4F1082118212821382F901CF -:10165000EC57FA4F80829182A282B382F901EC5D4D -:10166000FA4F80829182A282B382F901EC51FA4F43 -:1016700080829182A282B382F901EF59FE4F80826B -:101680009182A282B382FC01E451FC4F118210824C -:10169000FC01E454FC4F118210828DE491E00E9421 -:1016A0006208B801110F880B990B0E9483088BE424 -:1016B00091E00E9462088E2D0E94AD0427C1109116 -:1016C0001E02E12FF0E0EE0FFF1FE45FFD4F80915F -:1016D0001C0290911D02918380831F5F10931E0254 -:1016E000E0900C02F0900D028E2D0E947A041123DE -:1016F00071F09701215031092731310540F4F7018C -:10170000EC5DFE4F2081222311F0893128F00E94E8 -:101710009C0486EE91E032C5F701E054FE4F24911F -:10172000F701E455FE4FE491EE2309F4EEC4E250D4 -:10173000AE2FB0E0AA0FBB1FA25EBE4F0D90BC91B2 -:10174000A02D3C91209523232C932C912111E2C4B0 -:101750003091680041E050E001C0440FEA95EAF79B -:10176000242F2095232320936800D4C480911E0247 -:10177000E82FF0E0EE0FFF1FE45FFD4F20911C0209 -:1017800030911D02318320838F5F80931E0284304D -:1017900038F40E949C048BE192E00E946208B6C07B -:1017A00020910C0230910D02C901019780319E40B9 -:1017B00038F00E949C0480910C0290910D025BC055 -:1017C000A8EEB3E00E9474116B017C0160930601E6 -:1017D0007093070180930801909309010E94BF0252 -:1017E000DC01CB018C0D9D1DAE1DBF1D00915C0663 -:1017F00010915D0620915E0630915F06801791077B -:10180000A207B30770F40E94BF02C60ED71EE81EDF -:10181000F91EC0925C06D0925D06E0925E06F092E0 -:101820005F0620910E0230910F02C90101978031AD -:101830009E4038F00E949C0480910E0290910F020D -:101840001AC0A8EEB3E00E94741160930A0170936D -:101850000B0180930C0190930D01209110023091A7 -:10186000110221311EE0310748F00E949C04809152 -:101870001002909111020E9452081DC1A8EEB3E01F -:101880000E94741160930001709301018093020122 -:10189000909303018091120290911302909305019D -:1018A0008093040187E092E00E94620860910C023C -:1018B00070910D0280E090E04AE00E94FE0785E012 -:1018C00092E00E94620860910E0270910F0280E027 -:1018D00090E04AE00E94FE0783E092E00E946208E6 -:1018E000609110027091110280E090E04AE00E9445 -:1018F000FE0781E092E00E946208609112027091FE -:10190000130280E090E04AE00E94FE070E94F60782 -:10191000D2C00E942E06CFC087EB92E00E946208E0 -:101920000E948B040E94F60784EA92E00E946208FB -:101930006091060170910701809108019091090161 -:101940000E94B90884E992E00E94620860910A014D -:1019500070910B0180910C0190910D010E94B908CA -:1019600084E892E00E946208609100017091010198 -:1019700080910201909103010E94B90887E792E0EB -:101980000E94620880910401909105010E94520812 -:1019900004E416E0F12CD801ED908D01EE2099F0D1 -:1019A00080E792E00E9462086E2D70E080E090E097 -:1019B0000E9483088EE692E00E9462088F2D0E94AA -:1019C000AD040E94F607F394B8E1FB12E4CF8CE576 -:1019D00092E00E946208C0905C06D0905D06E090A4 -:1019E0005E06F0905F060E94BF0297018601061B0B -:1019F000170B280B390BC901B8010E944F088EE460 -:101A000092E00E9462080E94F6078CE392E00E9436 -:101A1000AD080E94BF022B013C018091FB0290E0C7 -:101A2000029664E170E00E943E116C01812C912CC1 -:101A30005401E12CF12CC7018C0D9D1D64E170E077 -:101A40000E943E118C011C01220C331C220C331C01 -:101A5000E114F10409F498C3F101E956FD4F8081C6 -:101A60009181A281B381F101E95BFD4F40815181F8 -:101A700062817381840F951FA61FB71F8815990572 -:101A8000AA05BB0508F080C3F101E956FD4F80802F -:101A90009180A280B3801FEFE11AF10A24E1E216DF -:101AA000F10449F608C00E94F6070E948B0482ECFC -:101AB00092E00E94AD0810921E0210921D02109238 -:101AC0001C02ECE0F2E01192119232E0EC31F307EB -:101AD000D1F780915C0690915D06A0915E06B09171 -:101AE0005F06CD84DE84EF84F888C81AD90AEA0A32 -:101AF000FB0AF7FE2CC080910A0190910B01A09186 -:101B00000C01B0910D014D855E856F857889481B6C -:101B1000590B6A0B7B0BA4EEB5E0E4E4F6E080E041 -:101B20009191992369F00D911D912D913C911397FD -:101B30006A017B01C01AD10AE20AF30AF7FE81E0CA -:101B40001496D8A4DE12ECCF882309F4D6C20E94E2 -:101B5000BF022B013C0104E416E01A8F098F04EE4A -:101B600015E01C870B870CE114E01A8709870CEB42 -:101B700013E018870F830CE414E01A8309831D8A8D -:101B80001E8A1F8A188E212C312CA98DBA8DCD90DA -:101B9000BA8FA98FCB8ECC2009F477C2F89471014B -:101BA000EE0CFF1CEE0CFF1CFEA6EDA687010C57E9 -:101BB0001A4F18AB0FA7D8012D913D914D915C9113 -:101BC000298B3A8B4B8B5C8BF701EC5DFA4F408194 -:101BD000518162817381F701EC53FB4F80809180CA -:101BE000A280B380F101E455FB4FFAABE9AB208151 -:101BF00078946A017B0189899A89AB89BC89C81A62 -:101C0000D90AEA0AFB0ACB82DC82ED82FE82A98134 -:101C1000BA81CD90DD90ED90FC90CC8EDD8EEE8E75 -:101C2000FF8E75016401C21AD108E108F1080C8D1C -:101C30001D8D2E8D3F8DC01AD10AE20AF30AD501FF -:101C4000C401801B910BA20BB30B8C8F9D8FAE8FA9 -:101C5000BF8FAB85BC850D911D912D913C9108A343 -:101C600019A32AA33BA300910A0110910B01209113 -:101C70000C0130910D010CA31DA32EA33FA3D30192 -:101C8000C201801B910BA20BB30B08A119A12AA1C1 -:101C90003BA1801B910BA20BB30BB7FD55C08091EC -:101CA000040190910501A0E0B0E0C816D906EA064B -:101CB000FB0618F18091000190910101A0910201B1 -:101CC000B09103010B811C812D813E81801791070A -:101CD000A207B30790F48091060190910701A091AB -:101CE0000801B09109010CA11DA12EA13FA18017EF -:101CF0009107A207B30709F05FC0F894EDA5FEA510 -:101D0000EC5DFA4F4082518262827382EDA5FEA59E -:101D1000EC57FA4F4082518262827382F101E4559E -:101D2000FB4F10827894E981FA8180829182A282AD -:101D3000B382A301920189899A89AB89BC89281B46 -:101D4000390B4A0B5B0B4EC0809106019091070145 -:101D5000A0910801B091090193018201081B190BA0 -:101D60002A0B3B0BD901C80108A119A12AA13BA14B -:101D7000801B910BA20BB30BB7FD87C180910401AF -:101D800090910501A0E0B0E0C816D906EA06FB066E -:101D900008F47BC18091000190910101A0910201A2 -:101DA000B09103010B811C812D813E818017910729 -:101DB000A207B30708F069C1A981BA818D929D92EB -:101DC000AD92BC921397F894EFA5F8A94083518384 -:101DD00062837383A9A9BAA91C9278942B813C8150 -:101DE0004D815E818DEE92E029A73AA74BA75CA7B3 -:101DF0000E9462080B8D602F70E080E090E00E94EE -:101E000083088AEE92E00E946208C501B4010E9434 -:101E10004F0887EE92E00E946208C701B6010E9457 -:101E20004F0884EE92E00E9462086C8D7D8D8E8D4D -:101E30009F8D0E944F0881EE92E00E94620829A5C2 -:101E40003AA54BA55CA5CA01B9010E944F088EEDC9 -:101E500092E00E946208C301B2010E948308A98532 -:101E6000BA858D919C91892B09F18BED92E00E94AE -:101E70006208C101880F991F8C0104511C4FF801A1 -:101E800060817181AF81B8858D919C91681B790BC0 -:101E900080E090E04AE00E94FE07F894F80180811B -:101EA0009181AF81B8858D939C9378942C8D3D8DD5 -:101EB0004E8D5F8D232B242B252B09F453C088EDE9 -:101EC00092E00E9462080DA51EA5045A1C4FF8015D -:101ED00080819181A281B381BC01CD0129893A8998 -:101EE0004B895C89621B730B840B950B0E944F0816 -:101EF00085ED92E00E9462086B817C818D819E81DC -:101F00000E944F08D8011D921D921D921C9213979A -:101F1000E985FA8580819181892B21F1F8940DA5BD -:101F20001EA504501D4FD8016D917D918D919C91FE -:101F3000A70196010E945211F801108211821282AB -:101F40001382789482ED92E029A73AA74BA75CA769 -:101F50000E94620829A53AA54BA55CA5CA01B90152 -:101F60000E944F088091FB0290E0029664E170E0CD -:101F70000E943E116C018FEC92E00E946208E12CFD -:101F8000F12C21E0C7018C0D9D1D64E170E00E94E1 -:101F90003E115C01FC01E951FD4F808190E082150A -:101FA000930509F062C08501000F111F000F111F7A -:101FB00021111FC0F801E956FD4F80819181A28156 -:101FC000B381F801E95BFD4F4081518162817381EA -:101FD000840F951FA61FB71F2D893E894F89588DE5 -:101FE00082179307A407B507A0F18CEC92E00E943A -:101FF0006208F801E956FD4F80819181A281B38189 -:10200000BC01CD0164197509860997090E948308EE -:102010008AEC92E00E946208F801E95BFD4F608162 -:102020007181828193810E944F0888EC92E00E9426 -:102030006208F501ED5CFD4F608170E080E090E0AA -:102040004AE00E94FE07F501E15EFD4F80810E949B -:10205000EB07F801E956FD4F80819181A281B381A0 -:102060008D8B9E8BAF8BB88F20E09FEFE91AF90A1A -:10207000A4E1EA16F10409F085CF0E94F607EB858A -:10208000FC854082518262827382FFEF2F1A3F0AE1 -:102090000B851C850C5F1F4F1C870B8709851A85D4 -:1020A0000E5F1F4F1A8709870F8118850E5F1F4F1C -:1020B00018870F8309811A810C5F1F4F1A830983C8 -:1020C00018E12116310409F060CD8091060190914C -:1020D0000701A0910801B0910901CD84DE84EF844D -:1020E000F8888C0D9D1DAE1DBF1D80935C069093DE -:1020F0005D06A0935E06B0935F060E94900208C939 -:102100000E949C0486E691E0D4CC0E949C048FED52 -:1021100091E0CFCC9C013327F901EC5BF94F1082A1 -:10212000F901EC50FE4F1082C901880F991F880FEA -:10213000991FFC01EC53FB4F108211821282138213 -:10214000F901E455FB4F1082FC01E45BFB4F108268 -:10215000118212821382220F331FF901E45EFB4FBA -:1021600011821082F901E454FC4F11821082F901AE -:10217000E451FC4F1182108284ED91E00E946208CC -:10218000C7010E94C60897CC85E392E00E946208CE -:10219000F801E951FD4FE081F0E0EC5BF94F60811F -:1021A00070E080E090E04AE00E94FE078DE292E05D -:1021B0000E946208F101E956FD4F80819181A28160 -:1021C000B381BC01CD0164197509860997090E9484 -:1021D000830887E292E00E946208F101E95BFD4F0B -:1021E00060817181828193810E944F0882E292E036 -:1021F0000E946208F801ED5CFD4F608170E080E0B4 -:1022000090E04AE00E94FE0780E292E00E946208AD -:10221000F801E15EFD4F80810E94EB070E94F60706 -:1022200033CCE0E6F6E01382128288EE93E0A0E081 -:10223000B0E084839583A683B78382E191E09183A4 -:10224000808385EC90E09587848784EC90E0978785 -:10225000868780EC90E0918B808B81EC90E0938B73 -:10226000828B82EC90E0958B848B86EC90E0978B50 -:10227000868B118E128E138E148E089597FB072E67 -:1022800016F4009407D077FD09D00E94831107FC53 -:1022900005D03EF4909581959F4F08957095619576 -:1022A0007F4F0895A1E21A2EAA1BBB1BFD010DC092 -:1022B000AA1FBB1FEE1FFF1FA217B307E407F507F6 -:1022C00020F0A21BB30BE40BF50B661F771F881FD2 -:1022D000991F1A9469F760957095809590959B0168 -:1022E000AC01BD01CF010895A29FB001B39FC00111 -:1022F000A39F700D811D1124911DB29F700D811D32 -:102300001124911D0895AA1BBB1B51E107C0AA1FF0 -:10231000BB1FA617B70710F0A61BB70B881F991F86 -:102320005A95A9F780959095BC01CD010895EE0FBF -:10233000FF1F0590F491E02D099481E090E0F8945E -:082340000C94A211F894FFCFE8 -:10234800D007000001003075000060EA00000000BE -:1023580000002702A301F001CE01E2016E026B002A -:102368006C006D00000000030405060708090A0B4D -:102378000C0D0E0F10110000000000000D0A0000E7 +:100000000C94E5010C940D020C940D020C94960DC9 +:100010000C94710D0C944C0D0C940D020C940D026B +:100020000C940D020C940D020C940D020C940D0214 +:100030000C940D020C940D020C940D020C940D0204 +:100040000C9496050C940D020C9478030C945203B6 +:100050000C940D020C940D020C940D020C940D02E4 +:100060000C940D020C940D028F129A149A14A11282 +:10007000D1139A149A14CE13FB129A1485149A145D +:100080009A149A149A149A149A140D1310139A1419 +:100090009A14AF134572726F723A20004D61792045 +:1000A000313420323031382031393A31313A303937 +:1000B0000020636F6D70696C65642000554E4F00C1 +:1000C000206F6E200041726475436F756E746572A7 +:1000D0002056322E33360020002000200049002018 +:1000E0006D696E20002070756C6C757000202D009D +:1000F0002066616C6C696E670020726973696E6757 +:1001000000500040002F0073002C20002000480009 +:100110002041002053002058002C00204E00205485 +:10012000002F0020440020430052002C00204200F9 +:100130002C0020540020617661696C61626C65005E +:100140002C002048656C6C6F2C2070696E73200049 +:100150004D20726573746F72696E6720636F6E668F +:1001600069672066726F6D20454550524F4D004DB6 +:1001700020696C6C6567616C20636F6E66696720CF +:10018000696E20454550524F4D004D206E6F2063E3 +:100190006F6E66696720696E20454550524F4D006D +:1001A0000000000800020100000304070000000036 +:1001B00000000000616C697665002C2000636F6EA2 +:1001C0006669672073617665642C20002C002C0022 +:1001D0002C0020004D20536C6F743A20004D206994 +:1001E0006C6C6567616C20636F6E66696720696E11 +:1001F00020454550524F4D004D206E6F20636F6E6D +:1002000066696720696E20454550524F4D00205366 +:100210006C6F74733A20004D20454550524F4D206D +:10022000436F6E6669673A2000206D696C6C697374 +:1002300065636F6E6473004D204E6578742072653F +:10024000706F727420696E20002C20004D20537452 +:10025000617475733A20004D2072656D6F76656428 +:10026000200052656D496E7400496C6C6567616C65 +:100270002070696E20737065636966696361746973 +:100280006F6E20004D20696C6C6567616C20766133 +:100290006C75652070617373656420666F7220648D +:1002A0006576566572626F7365004D20646576569B +:1002B0006572626F73652073657420746F2000200F +:1002C00073697A6520002C004420676F7420002039 +:1002D0002072656A65637420002020636F756E74F8 +:1002E0002000202068697374496478200020746FAE +:1002F000200020292000202820696E7465726E611C +:100300006C20004D2070696E200000000000250068 +:1003100028002B0000000000240027002A00010212 +:100320000408102040800102040810200102040883 +:1003300010204D20646566696E6564200041646428 +:10034000496E7400496C6C6567616C2070756C73E4 +:1003500065206C6576656C2073706563696669639A +:100360006174696F6E20666F722070696E20000084 +:1003700000000023002600290004040404040404EF +:1003800004020202020202030303030303496C6C2A +:100390006567616C2070696E20737065636966695A +:1003A000636174696F6E20002000200020004D20E2 +:1003B000696E74657276616C732073657420746FF6 +:1003C000200073697A650000D91011241FBECFEF99 +:1003D000D8E0DEBFCDBF11E0A0E0B1E0E4EAFEE28C +:1003E00002C005900D92A438B107D9F726E0A4E821 +:1003F000B1E001C01D92AA3CB207E1F711E0C5EEE1 +:10040000D1E004C02197FE010E942217C43ED1070B +:10041000C9F70E9406110C9450170C940000CF925B +:10042000DF92EF92FF920F931F93CF93DF936C01B4 +:100430007A018B01C0E0D0E0CE15DF0589F0D8014C +:100440006D918D01D601ED91FC910190F081E02D2F +:10045000C6010995892B11F47E0102C02196ECCFCB +:10046000C701DF91CF911F910F91FF90EF90DF9027 +:10047000CF900895089580E090E00895FC01538D99 +:10048000448D252F30E0842F90E0821B930B54176E +:1004900010F0CF96089501970895FC01918D828DFB +:1004A000981761F0828DDF01A80FB11D5D968C91C8 +:1004B000928D9F5F9F73928F90E008958FEF9FEFD3 +:1004C0000895FC01918D828D981731F0828DE80F8F +:1004D000F11D858D90E008958FEF9FEF0895FC0149 +:1004E000918D228D892F90E0805C9F4F821B910916 +:1004F0008F739927089588E995E00E946F0221E0A3 +:10050000892B09F420E0822F0895FC01848DDF01FE +:10051000A80FB11DA35ABF4F2C91848D90E0019676 +:100520008F739927848FA689B7892C93A089B18965 +:100530008C9180648C93938D848D981306C002886F +:10054000F389E02D80818F7D80830895EF92FF9263 +:100550000F931F93CF93DF93EC0181E0888F9B8DE6 +:100560008C8D981305C0E889F989808185FD24C0A8 +:10057000F62E0B8D10E00F5F1F4F0F731127E02E2B +:100580008C8DE8120CC00FB607FCFACFE889F98908 +:10059000808185FFF5CFCE010E948502F1CF8B8D42 +:1005A000FE01E80FF11DE35AFF4FF0820B8FEA893D +:1005B000FB898081806207C0EE89FF896083E889BA +:1005C000F98980818064808381E090E0DF91CF9120 +:1005D0001F910F91FF90EF900895CF93DF93EC015F +:1005E000888D8823C9F0EA89FB89808185FD05C053 +:1005F000A889B9898C9186FD0FC00FB607FCF5CF8D +:10060000808185FFF2CFA889B9898C9185FFEDCFD4 +:10061000CE010E948502E7CFDF91CF91089580E05F +:1006200090E0892B29F00E947B0281110C9400003C +:100630000895EF92FF920F931F93CF93DF938C0156 +:100640007B01C0E0D0E0F701EC0FFD1F6491662351 +:1006500061F0D801ED91FC910190F081E02DC8018D +:100660000995892B11F02196EECFCE01DF91CF9124 +:100670001F910F91FF90EF9008956115710579F02A +:10068000FB0101900020E9F73197AF01461B570BA2 +:10069000DC01ED91FC910280F381E02D099480E072 +:1006A00090E008951F920F920FB60F9211242F938E +:1006B0003F934F935F936F937F938F939F93AF93EA +:1006C000BF93EF93FF9388E995E00E948502FF9125 +:1006D000EF91BF91AF919F918F917F916F915F91BA +:1006E0004F913F912F910F900FBE0F901F90189533 +:1006F0001F920F920FB60F9211242F938F939F93F7 +:10070000EF93FF93E091A805F091A9058081E09116 +:10071000AE05F091AF0582FD12C090818091B105C8 +:100720008F5F8F732091B205821751F0E091B10570 +:10073000F0E0E856FA4F958F8093B10501C08081B3 +:10074000FF91EF919F918F912F910F900FBE0F907E +:100750001F90189590E0FC01E056FE4F2491FC019B +:10076000E25EFC4F3491FC01E758FC4FE491EE232C +:10077000B9F1222339F1233091F038F42130A9F076 +:10078000223001F584B58F7D12C0273091F02830DA +:10079000A1F02430B9F4809180008F7D03C0809156 +:1007A00080008F77809380000DC084B58F7784BDE3 +:1007B00009C08091B0008F7703C08091B0008F7D19 +:1007C0008093B000F0E0EE0FFF1FE159FC4FA591C0 +:1007D000B491EC913E2381E090E021F480E0089513 +:1007E00080E090E008953FB7F8948091B104909133 +:1007F000B204A091B304B091B40426B5A89B05C07F +:100800002F3F19F00196A11DB11D3FBFBA2FA92F8F +:10081000982F8827820F911DA11DB11DBC01CD010C +:1008200042E0660F771F881F991F4A95D1F70895F8 +:100830002FB7F8946091AD047091AE048091AF042D +:100840009091B0042FBF08952F923F924F925F92E4 +:100850006F927F928F929F92AF92BF92CF92DF92D0 +:10086000EF92FF920F931F93CF93DF93C82F0E94B5 +:100870001804AB01BC018C2F90E0FC01EE0FFF1FB0 +:10088000ED58FC4FA591B4919C90DC01A757B94F4E +:100890003C90FC01EE0FFF1FEA5DFE4F0190F081DE +:1008A000E02D2081392432229C92332009F42BC17F +:1008B000FC01EF5EFE4FA080FC01E25FFE4F208056 +:1008C000BB24B3942A1408F41EC18B2D832109F490 +:1008D00017C1EA2DF0E0EE0FFF1FEC5AFE4FA0818A +:1008E000B1811A161B060CF00BC1882483948B2D42 +:1008F000892109F4812C9D013327C901880F991F93 +:10090000880F991FFC01EA5EFC4FC080D180E28015 +:10091000F3802A013B014C185D086E087F087301C3 +:100920006201E0913205EF5FE0933205E09132051C +:10093000E43110F010923205E0913205F0E0C09100 +:100940009801D09199018E010F5F1F4F109399016B +:1009500000939801EE0FFF1FEE53FE4FD183C0832B +:10096000E0913205F0E0E657FD4FA083E0913205BB +:10097000DC01AA5EBC4F4D905D906D907C9013970A +:10098000C4E0EC9FF0011124E65CFD4F40825182EF +:1009900062827382E0913205D4E0ED9FF001112470 +:1009A000E651FE4FC082D182E282F382E0913205AD +:1009B000F0E0890102511D4FE8017880E255FE4FB9 +:1009C0007082E901CC0FDD1FFE01E75CF94F019059 +:1009D000F081E02D2F01612C712CF901EB58F94FBA +:1009E000C414D504E604F704A0F44D935D936D930D +:1009F0007C931397D8013C912081321371C0C65467 +:100A0000DB4F288139812F5F3F4F3983288322E5CF +:100A100068C0E801A881B081F901EC57FE4FAB1323 +:100A20005AC0B081BA1709F443C0DC01AE51BB4FC4 +:100A30004D905D906D907C901397DFEF4D1A5D0A9D +:100A40006D0A7D0A4D925D926D927C921397DC0146 +:100A5000AA59BC4F4D935D936D937C931397D90125 +:100A6000AE56BB4FCC91C11110C0EC01CA54DC4F43 +:100A7000488359836A837B83442443944C92D901ED +:100A8000A258BB4F2C912F5F2C93DC01A256BD4F77 +:100A90004D905D906D907C901397C40CD51CE61C16 +:100AA000F71CCD92DD92ED92FC92139723E414C0D3 +:100AB000DC01A256BD4F4D905D906D907C901397D8 +:100AC000C40CD51CE61CF71CCD92DD92ED92FC9275 +:100AD000139720E501C027E4D8013C91308301C081 +:100AE00028E5E0913205F0E0E656FE4F2083FC0158 +:100AF000EA5EFC4F4083518362837383E8018882FE +:100B0000BB0CA394DFCEDF91CF911F910F91FF908B +:100B1000EF90DF90CF90BF90AF909F908F907F909D +:100B20006F905F904F903F902F9008951F920F927B +:100B30000FB60F9211242F933F938F939F93AF93F0 +:100B4000BF938091AD049091AE04A091AF04B09199 +:100B5000B0043091AC0423E0230F2D3720F401962C +:100B6000A11DB11D05C026E8230F0296A11DB11DD0 +:100B70002093AC048093AD049093AE04A093AF0493 +:100B8000B093B0048091B1049091B204A091B304E9 +:100B9000B091B4040196A11DB11D8093B10490934E +:100BA000B204A093B304B093B404BF91AF919F91EA +:100BB0008F913F912F910F900FBE0F901F9018951E +:100BC0000C94D616CF93DF93EC019C01220F331FB8 +:100BD000F901E457F94F8FEF9FEF91838083FE0176 +:100BE000EE56FB4F1082F901E75CF94F118210823B +:100BF000CE01880F991F880F991FFC01EE51FB4F02 +:100C00001082118212821382FE01E258FB4F108281 +:100C1000FC01E25DFB4F1082118212821382F90106 +:100C2000E654FB4F11821082F901EA5FFB4F1182FB +:100C30001082FC01EA54FC4F40835183628373832A +:100C4000FC01EA59FC4F4083518362837383FC01AA +:100C5000EA5EFC4F4083518362837383FC01E95B4E +:100C6000FA4F4083518362837383FE01EE5FFC4F32 +:100C70001082F901E45DFE4F80810E94AA03FE010B +:100C8000E251FD4F8083CD5CDA4F8883DF91CF91B5 +:100C90000895CF92DF92EF92FF920F931F93CF931D +:100CA000DF931F92CDB7DEB70E9418046B017C0161 +:100CB00000E010E0B701A601C8010E94E2050F5F45 +:100CC0001F4F04311105B1F780910A0190910B017A +:100CD000A0910C01B0910D018C0D9D1DAE1DBF1D8D +:100CE0008093C4069093C506A093C606B093C7062A +:100CF00010929705E3E7F3E0A591B4918C9180936E +:100D00008906E5E7F3E0A591B4918C9180938A067A +:100D1000E7E7F3E0A591B4918C9180938B0680E096 +:100D200090E00E94E005833461F481E090E00E944D +:100D3000E005863631F482E090E00E94E0058736D7 +:100D400011F16AE871E088E995E00E940A0E0E94BC +:100D500018046093A8047093A9048093AA04909344 +:100D6000AB048091B5049091B6049093A70480934E +:100D7000A6040F90DF91CF911F910F91FF90EF90FC +:100D8000DF90CF90089583E090E00E94E005082F67 +:100D90008FEF800F853118F06FE671E0D4CF60E5FA +:100DA00071E088E995E00E940A0E10E064E0C62E2A +:100DB000D12C74E0F72EC6010E94E005482FC60131 +:100DC000019649830E94E005E82EC60102960E9422 +:100DD000E005282F30E0322F2227C9018E0D911D0A +:100DE0009093B5068093B406C60103960E94E00571 +:100DF000E82EC60104960E94E005282F30E0322F2D +:100E000022272E0D311D3093B7062093B606C6015A +:100E100005960E94E005E82EC60106960E94E005B0 +:100E2000282F30E0322F22272E0D311D3093B906A6 +:100E30002093B806C60107960E94E005E82EC60179 +:100E400008960E94E005282F30E0322F22272E0D31 +:100E5000311D3093BB062093BA0689E0C80ED11C21 +:100E6000F092B9044981493421F484E00E94420E91 +:100E700005C0413419F484E00E94870F1F5F1013EE +:100E80009ACF1092B9041092B8041092B704E4EB10 +:100E9000F6E01192119286E0E43CF807D1F757CFC3 +:100EA000EF92FF920F931F93CF93DF931F92CDB7D3 +:100EB000DEB77C01FC0100811181C80169830E94B9 +:100EC000E0056981861719F0C8010E94DE16F70156 +:100ED000808191810196918380830F90DF91CF91E2 +:100EE0001F910F91FF90EF900895CF92DF92EF92B4 +:100EF000FF920F931F93CF93DF9300D000D0CDB715 +:100F0000DEB76C012B833C8349835A830E945007D0 +:100F10004981642FC6010E9450075A81652FC6017E +:100F20000E9450072B81622FC6010E9450073C810E +:100F3000632FC6010E945007602FC6010E94500710 +:100F4000612FC6010E9450076E2DC6010E945007F6 +:100F50006F2DC6010F900F900F900F90DF91CF91E2 +:100F60001F910F91FF90EF90DF90CF900C9450075E +:100F70002F923F924F925F926F927F928F929F92A9 +:100F8000AF92BF92CF92DF92EF92FF920F931F9397 +:100F9000CF93DF93CDB7DEB7A1970FB6F894DEBF3E +:100FA0000FBECDBF1C016D8BDA01C901F894710130 +:100FB000EE0CFF1CEE0CFF1CF9A2E8A287010A54FC +:100FC0001C4F1E830D83F8012081318142815381A2 +:100FD0002F83388749875A87F701EA59FC4F4080A9 +:100FE000518062807380B7016E517B4FFB01E080BE +:100FF000F18002811381E982FA820B831C839101C3 +:10100000220F331FB90166547B4FFB010190F08121 +:10101000E02DFC87EB87F101E258FB4FE080E98A85 +:1010200048A159A142565D4FFA01E080F18002814A +:101030001381EE8AFF8A088F198F78945301420139 +:10104000EF80F88409851A858E189F08A00AB10AD6 +:10105000E8A1F9A1E25DFB4FC080D180E280F3807E +:1010600049815A816B817C814C195D096E097F0928 +:101070004D875E876F87788B6A017B015989C51A16 +:10108000D108E108F108F901EA5FFB4F20813181C5 +:101090000B851C85021B130B1B8F0A8F1D891111D9 +:1010A000E3C0E8A1F9A1E95BFA4F208131814281D7 +:1010B00053812C8F3D8F4E8F5F8F40910601509151 +:1010C00007016091080170910901498B5A8B6B8B64 +:1010D0007C8BAC01BD0109891A892B893C89401B95 +:1010E000510B620B730B0C8D1D8D2E8D3F8D401B94 +:1010F000510B620B730B77FD47C04091000150917B +:10110000010160E070E0C416D506E606F706F8F0C7 +:101110004091020150910301609104017091050119 +:10112000481559056A057B0590F440910A015091D4 +:101130000B0160910C0170910D0109891A892B89AD +:101140003C89401751076207730709F051C0F894B2 +:10115000E8A1F9A1EA54FC4F80839183A283B38371 +:10116000E8A1F9A1EA59FC4F80839183A283B3835C +:1011700078944C015D010F81188529853A85801A84 +:10118000910AA20AB30A3CC040910A0150910B0196 +:1011900060910C0170910D018C019D01041B150BD8 +:1011A000260B370BB901A8010C8D1D8D2E8D3F8D9F +:1011B000401B510B620B730B77FD3BC1409100014B +:1011C0005091010160E070E0C416D506E606F7060E +:1011D00008F42FC140910201509103016091040174 +:1011E00070910501481559056A057B0508F021C174 +:1011F000F894ED81FE8140825182628273827894FC +:10120000F894F101E258FB4F1082E8A1F9A1E256EF +:10121000FD4F1082118212821382789468A179A105 +:10122000625D7B4F29813A814B815C81FB01208388 +:10123000318342835383F101EE0FFF1FAF014A5FF9 +:101240005B4F0B851C85FA0111830083E8A1F9A18E +:10125000E95BFA4F80839183A283B383F101EE5F50 +:10126000FC4F20812F5F20832C013D011D8969E205 +:1012700071E08091C8069091C9060E941903F1019E +:10128000EE0FFF1FE457F94F40815181052E000CEE +:10129000660B770B8091C8069091C9060E943E0F9D +:1012A00066E271E08091C8069091C9060E94190318 +:1012B00049815A816B817C818091C8069091C906D1 +:1012C0000E94230E63E271E08091C8069091C906E6 +:1012D0000E941903B701A6018091C8069091C90622 +:1012E0000E94230E61E271E08091C8069091C906C8 +:1012F0000E9419034D855E856F8578898091C806A7 +:101300009091C9060E94230E6EE171E08091C8069B +:101310009091C9060E941903B501A4018091C806E5 +:101320009091C9060E94230E6BE171E08091C8067E +:101330009091C9060E941903B301A2018091C806C9 +:101340009091C9060E943E0F69E171E08091C80644 +:101350009091C9060E9419036091B5047091B6047A +:101360008091C8069091C9060E943C0E66E171E02A +:101370008091C8069091C9060E9419036A8D7B8DE1 +:101380008091C8069091C9060E943C0E111116C0AA +:1013900063E171E08091C8069091C9060E9419032B +:1013A000F101EE5FFC4F408150E060E070E02AE028 +:1013B0008091C8069091C9060E94BD0DC114D10448 +:1013C000E104F104C1F060E171E08091C806909100 +:1013D000C9060E9419036E897F89888D998DA7019E +:1013E00096010E940017BA01A9018091C806909148 +:1013F000C9060E94230E8091C8069091C906A19645 +:101400000FB6F894DEBF0FBECDBFDF91CF911F9115 +:101410000F91FF90EF90DF90CF90BF90AF909F9093 +:101420008F907F906F905F904F903F902F900C9493 +:10143000060EA1960FB6F894DEBF0FBECDBFDF91AA +:10144000CF911F910F91FF90EF90DF90CF90BF90C1 +:10145000AF909F908F907F906F905F904F903F9054 +:101460002F9008952F923F924F925F926F927F92AA +:101470008F929F92AF92BF92CF92DF92EF92FF92A4 +:101480000F931F93CF93DF937C012A013B0180913F +:10149000320590E0029664E170E00E94EC16EC01E7 +:1014A00020E030E040E004E110E0C9018C0F9D1F16 +:1014B000B8010E94EC16FC01E657FD4FE081F0E018 +:1014C000EE15FF0509F44F5F2F5F3F4F24313105C3 +:1014D00061F7442309F4DFC01E016EE071E08091E2 +:1014E000C8069091C9060E941903F701EE0FFF1F6D +:1014F000E457F94F40815181052E000C660B770BA4 +:101500008091C8069091C9060E943E0F6CE071E080 +:101510008091C8069091C9060E941903C12CD12C54 +:1015200021E0C601820D931D64E170E00E94EC167B +:101530008C01FC01E657FD4F808190E08E159F05E0 +:1015400009F089C0E801CC0FDD1FCC0FDD1F211190 +:1015500020C0FE01E65CFD4F80819181A281B381B4 +:10156000FE01E651FE4F4081518162817381840FFB +:10157000951FA61FB71F88159905AA05BB0508F476 +:1015800063C069E071E08091C8069091C9060E942D +:101590001903F801EE0FFF1FEE53FE4F60817181BA +:1015A0008091C8069091C9060E943C0E67E071E0E8 +:1015B0008091C8069091C9060E941903FE01E65C5D +:1015C000FD4F40815181628173814419550966093B +:1015D00077098091C8069091C9060E943E0F65E088 +:1015E00071E08091C8069091C9060E941903FE011E +:1015F000E651FE4F40815181628173818091C8061E +:101600009091C9060E94230E63E071E08091C806A4 +:101610009091C9060E941903F801E255FE4F4081DE +:1016200050E060E070E02AE08091C8069091C90621 +:101630000E94BD0DF801E656FE4F60818091C806FC +:101640009091C9060E941C0EC65CDD4F888099806F +:10165000AA80BB8020E08FEFC81AD80A84E1C816A0 +:10166000D10409F05ECF8091C8069091C906DF9140 +:10167000CF911F910F91FF90EF90DF90CF90BF908F +:10168000AF909F908F907F906F905F904F903F9022 +:101690002F900C94060EDF91CF911F910F91FF9028 +:1016A000EF90DF90CF90BF90AF909F908F907F9002 +:1016B0006F905F904F903F902F9008950F931F93DE +:1016C000CF93DF93EC0161E071E08091C8069091C7 +:1016D000C9060E9419038E01000F111FF801E4577B +:1016E000F94F40815181052E000C660B770B8091DC +:1016F000C8069091C9060E943E0FFE01EB58F94FB3 +:1017000020818091C8069091C906222329F02130BA +:1017100031F469EF70E005C060EF70E002C06DEE7B +:1017200070E00E941903CF59D94F8881882341F076 +:1017300065EE70E08091C8069091C9060E94190379 +:101740006FED70E08091C8069091C9060E94190360 +:10175000F801E75CF94F608171818091C806909132 +:10176000C906DF91CF911F910F910C943C0ECF923F +:10177000DF92EF92FF926DED70E08091C80690913C +:10178000C9060E94190360910A0170910B018091B2 +:101790000C0190910D0128EEC22E23E0D22EE12CF7 +:1017A000F12CA70196010E940017BA01A9018091AE +:1017B000C8069091C9060E94230E6BED70E08091DF +:1017C000C8069091C9060E941903609106017091A4 +:1017D00007018091080190910901A70196010E94DB +:1017E0000017BA01A9018091C8069091C9060E940C +:1017F000230E69ED70E08091C8069091C9060E94A1 +:10180000190360910201709103018091040190918C +:101810000501A70196010E940017BA01A901809154 +:10182000C8069091C9060E94230E67ED70E0809172 +:10183000C8069091C9060E94190360910001709139 +:1018400001018091C8069091C906FF90EF90DF904A +:10185000CF900C94260E1F93CF93DF93C5ECD0E06E +:101860001C2F1F5EFE0164918091C8069091C906ED +:101870000E941C0E21961C13F5CF60EC70E0809145 +:10188000C8069091C9060E941903CCEBD0E01C2F2A +:101890001D5FFE0164918091C8069091C9060E9467 +:1018A0001C0E21961C13F5CF61EB70E08091C806E9 +:1018B0009091C9060E941903CCE9D0E01C2F1C5E50 +:1018C000FE0164918091C8069091C9060E941C0E89 +:1018D00021961C13F5CFDF91CF911F9108958F9220 +:1018E0009F92AF92BF92CF92DF92EF92FF920F93AF +:1018F0001F93CF93DF930E9418044B015C018091EA +:10190000C8069091C9060E94060E0E942B0C62E444 +:1019100071E08091C8069091C9060E941903C4E540 +:10192000D1E0C12CD12C760181E02991399137FD8C +:1019300014C0811108C060E471E08091C8069091E4 +:10194000C9060E9419032AE0B701A6018091C806C2 +:101950009091C9060E94BD0D80E09FEFC91AD90A77 +:10196000E90AF90AE6E1CE16D104E104F104E9F648 +:1019700065E371E08091C8069091C9060E94190341 +:1019800062E371E08091C8069091C9060E94190334 +:10199000B501A4018091C8069091C9060E94230E4A +:1019A00060E371E08091C8069091C9060E94190316 +:1019B0006091B5047091B6048091C8069091C906F3 +:1019C0000E943C0E6DE271E08091C8069091C906BC +:1019D0000E9419034091A8045091A9046091AA049F +:1019E0007091AB048091C8069091C9060E94230EA5 +:1019F0006BE271E08091C8069091C9060E941903BC +:101A00006091A6047091A7048091C8069091C906C0 +:101A10000E943C0E8091C8069091C9060E94060E55 +:101A20000E94B70B0CE816E0C0E0D0E0F80181910D +:101A300091918F0197FD09C0CE010E945E0B8091AC +:101A4000C8069091C9060E94060E2196C431D105A0 +:101A500069F7DF91CF911F910F91FF90EF90DF9089 +:101A6000CF90BF90AF909F908F9008951F93CF938A +:101A7000DF93C4E9D0E01C2F195FFE0164918091CF +:101A8000C8069091C9060E941C0E21961C13F5CF22 +:101A9000DF91CF911F9108951F920F920FB60F9271 +:101AA00011242F933F934F935F936F937F938F9363 +:101AB0009F93AF93BF93EF93FF9382E00E94240420 +:101AC000FF91EF91BF91AF919F918F917F916F9116 +:101AD0005F914F913F912F910F900FBE0F901F90EC +:101AE00018951F920F920FB60F9211242F933F93C8 +:101AF0004F935F936F937F938F939F93AF93BF9316 +:101B0000EF93FF9381E00E942404FF91EF91BF9136 +:101B1000AF919F918F917F916F915F914F913F9185 +:101B20002F910F900FBE0F901F9018951F920F923C +:101B30000FB60F9211242F933F934F935F936F93A0 +:101B40007F938F939F93AF93BF93EF93FF9380E027 +:101B50000E942404FF91EF91BF91AF919F918F91CB +:101B60007F916F915F914F913F912F910F900FBE99 +:101B70000F901F9018950E944B174F925F926F9293 +:101B80007F92EF92FF920F931F93CF93DF93CDB786 +:101B9000DEB7A1970FB6F894DEBF0FBECDBF7C01B4 +:101BA000FA01CB0119A2223008F42AE08E010F5D60 +:101BB0001F4F422E512C612C712CBF01A3019201A9 +:101BC0000E940017F901CA01015011096A3014F48A +:101BD000605D01C0695CD8016C93232B242B252BFD +:101BE00061F7B801C7010E943D03A1960FB6F894B2 +:101BF000DEBF0FBECDBFDF91CF911F910F91FF9040 +:101C0000EF907F906F905F904F90089560E871E043 +:101C10000C943D030F931F93CF93DF93EC010E942D +:101C200019038C01CE010E94060E800F911FDF91D7 +:101C3000CF911F910F910895DC01ED91FC910190DE +:101C4000F081E02D09942AE00C94BD0D0F931F93B1 +:101C5000CF93DF93EC01AB0160E070E02AE00E94DB +:101C6000BD0D8C01CE010E94060E800F911FDF91E9 +:101C7000CF911F910F910895AB0160E070E02AE0D1 +:101C80000C94BD0DCF92DF92EF92FF920F931F93B2 +:101C9000843058F40E94360D62EC73E08091C806DF +:101CA0009091C9060E941903DDC02091B4063091BD +:101CB000B506C901019780319E4038F00E94360D6B +:101CC0006091B4067091B50675C0A8EEB3E00E94AD +:101CD00028176B017C0160930A0170930B018093BC +:101CE0000C0190930D010E941804DC01CB018C0DB6 +:101CF0009D1DAE1DBF1D0091C4061091C50620910B +:101D0000C6063091C70680179107A207B30770F483 +:101D10000E941804C60ED71EE81EF91EC092C40603 +:101D2000D092C506E092C606F092C7062091B6068C +:101D30003091B706C901019780319E4038F00E946A +:101D4000360D6091B6067091B70634C0A8EEB3E0C8 +:101D50000E94281760930601709307018093080181 +:101D6000909309012091B8063091B90621318EE097 +:101D7000380738F00E94360D6091B8067091B906A8 +:101D800019C0A8EEB3E00E94281760930201709377 +:101D9000030180930401909305018091BA0690910C +:101DA000BB068536910590F00E94360D6091BA060B +:101DB0007091BB068091C8069091C9061F910F9142 +:101DC000FF90EF90DF90CF900C94260E909301013E +:101DD000809300016EEA73E08091C8069091C90675 +:101DE0000E9419036091B4067091B5068091C806EF +:101DF0009091C9060E943C0E6CEA73E08091C8067F +:101E00009091C9060E9419036091B6067091B706B9 +:101E10008091C8069091C9060E943C0E6AEA73E060 +:101E20008091C8069091C9060E9419036091B80676 +:101E30007091B9068091C8069091C9060E943C0E27 +:101E400068EA73E08091C8069091C9060E94190360 +:101E50006091BA067091BB068091C8069091C90640 +:101E60000E943C0E8091C8069091C9061F910F9167 +:101E7000FF90EF90DF90CF900C94060ECF92DF9200 +:101E8000EF92FF920F931F93CF93DF9377FF1DC0C5 +:101E90006A017B01EC016DE20E941C0E8C0144275B +:101EA0005527BA014C195D096E097F092AE0CE0158 +:101EB0000E94BD0D800F911FDF91CF911F910F9157 +:101EC000FF90EF90DF90CF9008952AE0DF91CF91BF +:101ED0001F910F91FF90EF90DF90CF900C94BD0D6C +:101EE0000F931F93CF93DF93EC01462F50E060E0F8 +:101EF00070E02AE00E94BD0D8C01CE010E94060E0A +:101F0000800F911FDF91CF911F910F9108956F92D4 +:101F10007F928F929F92AF92BF92DF92EF92FF9249 +:101F20000F931F93CF93DF93D82E0E941804AB0119 +:101F3000BC01A090B406B090B50685E18A1558F0B2 +:101F400045019924F401EE0FFF1FEC5AFE4F00816A +:101F5000118117FF1EC00E94360D6DE873E080915D +:101F6000C8069091C9060E9419036A2D8091C8067F +:101F70009091C906DF91CF911F910F91FF90EF9043 +:101F8000DF90BF90AF909F908F907F906F900C9458 +:101F9000700F11277801EE0CFF1CF701E45DFE4F76 +:101FA000C081D181F701E457F94F3F0180819181D0 +:101FB000DD2788159905C9F0FE01E758FC4FE4912B +:101FC000E2508E2F90E0FC01EE0FFF1FED58FC4F0A +:101FD000A591B4912C91FC01E757F94F2083C801DA +:101FE0000E94E205F301918280828091B606909171 +:101FF000B7060297029788F00E94360D64E473E0FA +:102000008091C8069091C9060E9419036A2D80919B +:10201000C8069091C9060E94700FF801EB58F94F5D +:1020200081E02091B6063091B7062330310509F0E2 +:1020300080E08083D801AF59B94FF2E0FD1568F513 +:102040008091B8069091B906892B39F1FE01E25EC4 +:10205000FC4F2491FE01E758FC4F84918823D1F076 +:1020600090E0880F991FFC01EC5EFC4F4591549164 +:10207000FC01E65FFC4F659174919FB7F894FA01FB +:102080003081822F809583238083FB018081282BE0 +:1020900020839FBF81E08C9326C0FE01E25EFC4F4F +:1020A0004491FE01E758FC4F24912223D9F030E0FF +:1020B000220F331FF901EC5EFC4F85919491F901D9 +:1020C000E65FFC4F259134916FB7F894FC01508185 +:1020D000742F7095452F47234083F9018081872312 +:1020E00080836FBF1C92F3E0FD1530F48091BA0637 +:1020F0009091BB06009711F482E090E0F701E75C55 +:10210000F94F91838083FE01E25EFC4F8491FE01D2 +:10211000E758FC4FC491CC23A9F1C250EC2FF0E05A +:10212000EE0FFF1FEA5DFE4FA081B181EC91E82B1D +:10213000EC932091680081E090E001C0880FCA957F +:10214000EAF7822B8093680062E373E08091C8060F +:102150009091C9060E941903C8010E945E0B8091EC +:10216000C8069091C906DF91CF911F910F91FF9002 +:10217000EF90DF90BF90AF909F908F907F906F9087 +:102180000C94060E0E94360D6DE373E08091C80634 +:102190009091C906DF91CF911F910F91FF90EF9021 +:1021A000DF90BF90AF909F908F907F906F900C9436 +:1021B0000A0EE8E9F5E01382128288EE93E0A0E0CF +:1021C000B0E084839583A683B78388E191E091830F +:1021D000808385EC90E09587848784EC90E09787F6 +:1021E000868780EC90E0918B808B81EC90E0938BE4 +:1021F000828B82EC90E0958B848B86EC90E0978BC1 +:10220000868B118E128E138E148E0895CF93DF93CA +:10221000CDB7DEB72A970FB6F894DEBF0FBECDBF9D +:10222000789484B5826084BD84B5816084BD85B5B1 +:10223000826085BD85B5816085BD80916E008160BD +:1022400080936E0010928100809181008260809363 +:102250008100809181008160809381008091800065 +:102260008160809380008091B10084608093B10090 +:102270008091B00081608093B00080917A0084608A +:1022800080937A0080917A00826080937A008091B6 +:102290007A00816080937A0080917A0080688093D0 +:1022A0007A001092C100E091A805F091A90582E0A2 +:1022B0008083E091A405F091A5051082E091A60528 +:1022C000F091A70583E380831092B005E091AC05FF +:1022D000F091AD0586E08083E091AA05F091AB0511 +:1022E000808180618083E091AA05F091AB058081B7 +:1022F00088608083E091AA05F091AB0580818068B9 +:102300008083E091AA05F091AB0580818F7D808369 +:102310000E94F3034B015C0114EFC12EDD24D39422 +:10232000E12CF12C0E94F303DC01CB0188199909FF +:10233000AA09BB09883E9340A105B10558F001E008 +:10234000C01AD108E108F10818EE810E13E0911EC1 +:10235000A11CB11CC114D104E104F10419F7789453 +:1023600088E995E00E94060E88E995E09093C906F9 +:102370008093C8061092B6041092B5040E94180407 +:10238000609335067093360680933706909338062F +:102390000E9449060E946F0CB8EE4B2EB3E05B2EF4 +:1023A000612C712C0E94180400913506109136069C +:1023B000209137063091380660177107820793071E +:1023C00050F42091B5043091B6042F5F3F4F309305 +:1023D000B6042093B5046093350670933606809357 +:1023E00037069093380688E995E00E946F02892BA2 +:1023F00009F4AEC288E995E00E944D02182F8C3294 +:10240000C9F4E091B904E73008F0A2C281E08E0F70 +:102410008093B904F0E0EE0FFF1FEC54F94F809168 +:10242000B7049091B804918380831092B8041092FD +:10243000B7048EC280ED810F8A30A0F42091B704DA +:102440003091B8044AE0429FC001439F900D11248F +:10245000C097810F911D17FD9A959093B8048093B2 +:10246000B70476C28FE9810F8A3108F071C280917A +:102470009705882309F443C068EC72E088E995E089 +:102480000E941903E4EBCE2EE6E0DE2EE12CF12CC7 +:102490008091B90490E08E159F05ACF0E114F10431 +:1024A00031F066EC72E088E995E00E941903F601CC +:1024B000619171916F0188E995E00E943C0EFFEFF8 +:1024C000EF1AFF0AE5CF612F88E995E00E941C0E04 +:1024D0006FEB72E088E995E00E9419034091B9041E +:1024E00050E04F5F5F4F052E000C660B770B88E9BD +:1024F00095E00E943E0F88E995E00E94060E812F2C +:10250000110F990BAA0BBB0BFC01E156F109E63147 +:10251000F10508F00FC2EC5CFF4F0C94221780917C +:10252000B904E82FF0E0EE0FFF1FEC54F94F2091B3 +:10253000B7043091B804318320838F5F0E94870FE6 +:10254000F9C18091B904E82FF0E0EE0FFF1FEC54C1 +:10255000F94F2091B7043091B80431832083009162 +:10256000B4061091B5068F3F61F0063150F4F801C2 +:10257000FF27EE0FFF1FEC5AFE4F8081918197FFDE +:1025800005C00E94360D69E672E024C39927FC015C +:10259000EE0FFF1FE45DFE4F208131813327F901EB +:1025A000E25EFC4F4491F901E758FC4F249122234D +:1025B00009F404C32250E22FF0E0EE0FFF1FEA5DA2 +:1025C000FE4FA081B1813C91E42FE095E323EC9391 +:1025D0003C913111F8C26091680041E050E06A011D +:1025E00002C0CC0CDD1C2A95E2F79601209526232B +:1025F00020936800E8C28091B904E82FF0E0EE0F64 +:10260000FF1FEC54F94F2091B7043091B804318387 +:1026100020838F5F0E94420E8DC10E9449068AC1AD +:102620000E9418044B015C016CE472E08091C806C2 +:102630009091C9060E9419030E942B0C8091C80634 +:102640009091C9060E94060E0E94B70B1CE8E12E6D +:1026500016E0F12E00E010E0F701819191917F01E9 +:1026600018161906B4F4C8010E945E0B69E472E002 +:102670008091C8069091C9060E941903A501940192 +:1026800061E0C8010E94B807B501A401C8010E9419 +:10269000320A0F5F1F4F04311105F1F68091C80611 +:1026A0009091C9060E94060E67E172E08091C8060B +:1026B0009091C9060E94190380E090E00E94E00515 +:1026C000682F8091C8069091C9060E941C0E81E077 +:1026D00090E00E94E005682F8091C8069091C9069D +:1026E0000E941C0E82E090E00E94E005682F80911D +:1026F000C8069091C9060E941C0E6EE072E080919F +:10270000C8069091C9060E94190383E090E00E94D8 +:10271000E005482F50E060E070E08091C80690919D +:10272000C9060E943E0F8091C8069091C9060E947A +:10273000060E80E090E00E94E005833409F058C264 +:1027400081E090E00E94E005863609F051C282E007 +:1027500090E00E94E005873609F04AC27EC22091CF +:10276000B7043091B8048091C8069091C9062F3FF4 +:10277000310588F4209397056AEA72E00E941903F4 +:102780006091B7047091B8048091C8069091C90611 +:102790000E94260ECFC064E872E0CAC00E946F0C8F +:1027A000C9C01A82198263E4CE0101960E945007C3 +:1027B00066E6CE0101960E94500767E6CE010196BB +:1027C0000E9450072CE836E03C832B83F901332428 +:1027D000339481919191181619060CF4339436E0D4 +:1027E000E43BF307B1F7632DCE0101960E94500739 +:1027F000E0900001F09001016091020170910301ED +:102800008091040190910501A30192010E9400179B +:102810002D833E834F835887609106017091070195 +:102820008091080190910901A30192010E94001773 +:1028300049015A0160910A0170910B0180910C01CC +:1028400090910D01A30192010E940017BA01A90104 +:102850000D811E81940169E4CE0101960E947507E5 +:1028600079E3A72E76E0B72EC12CD12CEB81FC8129 +:1028700041915191FC83EB8314161506C4F4F501C4 +:10288000E080F180F601EF59F94F008110E0F60188 +:10289000EB58F94F8081811103C022E030E002C083 +:1028A00023E030E061E4CE0101960E947507FFEF5E +:1028B000CF1ADF0A02E0A00EB11C14E1C116D10448 +:1028C000A9F66DEB71E088E995E00E941903432DAC +:1028D00050E060E070E02AE088E995E00E94BD0DDC +:1028E0006AEB71E088E995E00E94190349815A81F9 +:1028F000052E000C660B770B88E995E00E943E0FD1 +:1029000088E995E00E94060E15C0E091B904F0E058 +:10291000EE0FFF1FEC54F94F8091B7049091B8046B +:102920009183808364EB71E08091C8069091C90621 +:102930000E940A0E1092B9041092B8041092B704C3 +:10294000E4EBF6E01192119226E0E43CF207D1F7B5 +:10295000809197058A3030F50E9418040091C406D2 +:102960001091C5062091C6063091C7066B017C0107 +:10297000C01AD10AE20AF30AF7FEE5C00091060187 +:102980001091070120910801309109014B015C0170 +:10299000801A910AA20AB30AECE8F6E0A7E4B5E0CF +:1029A00020E0C9C03CE8832E36E0932E43E3E42EBA +:1029B00045E0F42E5CE2A52E51E0B52E00E010E0DB +:1029C000F401C190D1904F011C141D040CF094C06F +:1029D000F5012080822D0E94AA03382EF701808104 +:1029E000381609F489C0308263E073E08091C8062C +:1029F0009091C9060E941903A601DD0C660B770BA6 +:102A00008091C8069091C9060E943E0F66EF72E061 +:102A10008091C8069091C9060E941903422D50E08A +:102A200060E070E02AE08091C8069091C9060E949B +:102A3000BD0D62EF72E08091C8069091C9060E94B8 +:102A400019036DEE72E08091C8069091C9060E944C +:102A50001903432D50E060E070E02AE08091C80641 +:102A60009091C9060E94BD0D62EE72E08091C80689 +:102A70009091C9060E9419034091320550E060E030 +:102A800070E02AE08091C8069091C9060E94BD0DB1 +:102A900069ED72E08091C8069091C9060E94190301 +:102AA000F801EE0FFF1FEE0FFF1FEE51FB4F4081AD +:102AB0005181628173818091C8069091C9060E94FC +:102AC000230E6FEC72E08091C8069091C9060E94B7 +:102AD0001903F801EE0FFF1FE654FB4F608171816F +:102AE0008091C8069091C9060E943C0E8091C8064C +:102AF0009091C9060E94060E0F5F1F4FFFEFEF1A5D +:102B0000FF0A22E0A20EB11C0431110509F058CFD2 +:102B100023CFCD90DD90ED90FC901397B501A401EB +:102B20004C195D096E097F0977FF21E0149656E084 +:102B3000E43BF50731F041915191141615064CF321 +:102B4000F5CF2223C1F10E9418044B015C018CE8EF +:102B5000E82E86E0F82E00E010E0F70181919191D7 +:102B60007F0197FD0FC0A501940160E0C8010E949C +:102B7000B80780919705853028F0B501A401C801F8 +:102B80000E94320A0F5F1F4F0431110531F7409147 +:102B90000A0150910B0160910C0170910D01480DDB +:102BA000591D6A1D7B1D4093C4065093C506609352 +:102BB000C6067093C7060E940F03F4CB0E94360D21 +:102BC00062E672E0B1CE40E050E0BA010E94E20558 +:102BD00067E572E08091C8069091C9060E941903CA +:102BE000602F8091C8069091C9060E94700FA2CEF6 +:102BF00068EF71E08091C8069091C9060E940A0EA4 +:102C000067E372E08091C8069091C9060E9419039B +:102C1000C090C406D090C506E090C606F090C706E6 +:102C20000E94180497018601061B170B280B390B0D +:102C3000B901A8018091C8069091C9060E94230E8F +:102C400069E272E08091C8069091C9060E9419035A +:102C50008091C8069091C90655CE83E090E00E940D +:102C6000E005282EF5E1F81718F46DED71E0C2CFFC +:102C7000312C04E010E0321419F2C8010E94E00582 +:102C8000282FC80101962A870E94E005F82EC80166 +:102C900002960E94E005C82ED12CDC2CCC24CF0C4F +:102CA000D11CC80103960E94E005F82EC8010496C5 +:102CB0000E94E005A82EB12CBA2CAA24AF0CB11C9E +:102CC000C80105960E94E005F82EC80106960E94EC +:102CD000E005882E912C982C88248F0C911CC8011B +:102CE00007960E94E005382FC801089639870E9490 +:102CF000E005E82EF12CFE2CEE243985E30EF11CC4 +:102D0000075F1F4F64ED71E08091C8069091C9067E +:102D10000E9419032A85622F8091C8069091C906E6 +:102D20000E941C0E62ED71E08091C8069091C90668 +:102D30000E941903B6018091C8069091C9060E94AD +:102D40003C0E60ED71E08091C8069091C9060E942A +:102D50001903B5018091C8069091C9060E943C0EE6 +:102D60006EEC71E08091C8069091C9060E9419032B +:102D7000B4018091C8069091C9060E943C0E6CEC8B +:102D800071E08091C8069091C9060E941903B701AD +:102D90008091C8069091C9060E943C0E8091C80699 +:102DA0009091C9060E94060E339465CFF999FECF23 +:102DB00092BD81BDF89A992780B50895262FF9997B +:102DC000FECF1FBA92BD81BD20BD0FB6F894FA9A0E +:102DD000F99A0FBE0196089597FB072E16F40094FA +:102DE00007D077FD09D00E94371707FC05D03EF4C5 +:102DF000909581959F4F0895709561957F4F0895A7 +:102E0000A1E21A2EAA1BBB1BFD010DC0AA1FBB1FEE +:102E1000EE1FFF1FA217B307E407F50720F0A21B60 +:102E2000B30BE40BF50B661F771F881F991F1A94CD +:102E300069F760957095809590959B01AC01BD01F7 +:102E4000CF010895EE0FFF1F0590F491E02D099436 +:102E5000A29FB001B39FC001A39F700D811D1124DB +:102E6000911DB29F700D811D1124911D0895AA1B03 +:102E7000BB1B51E107C0AA1FBB1FA617B70710F065 +:102E8000A61BB70B881F991F5A95A9F78095909597 +:102E9000BC01CD01089581E090E0F8940C945017A6 +:042EA000F894FFCFD4 +:102EA4000200D007000060EA0000307500000D1336 +:102EB40007080E0000000000A6020F023E02ED0209 +:102EC4006F024D0261026B006C006D000200030092 +:102ED4000400050006000700080009000A000B00B2 +:102EE4000C000D000E000F00100011001200130062 +:102EF40000000000FFFFFFFF0000010002000300CC +:102F04000400050006000700080009000A000B0081 +:102F14000C000D000E000F00100011001200130031 +:042F24000D0A000092 :00000001FF diff --git a/fhem/contrib/arduino/ArduCounter2.36.ino b/fhem/contrib/arduino/ArduCounter2.36.ino new file mode 100755 index 000000000..96a217a8b --- /dev/null +++ b/fhem/contrib/arduino/ArduCounter2.36.ino @@ -0,0 +1,1409 @@ +/* + * Sketch for counting impulses in a defined interval + * e.g. for power meters with an s0 interface that can be + * connected to an input of an arduino or esp8266 board + * + * the sketch uses pin change interrupts which can be anabled + * for any of the inputs on e.g. an arduino uno, jeenode, wemos d1 etc. + * + * the pin change Interrupt handling for arduinos used here + * is based on the arduino playground example on PCINT: + * http://playground.arduino.cc/Main/PcInt which is outdated. + * + * see https://github.com/GreyGnome/EnableInterrupt for a newer library (not used here) + * and also + * https://playground.arduino.cc/Main/PinChangeInterrupt + * http://www.avrfreaks.net/forum/difference-between-signal-and-isr + * + * Refer to avr-gcc header files, arduino source and atmega datasheet. + */ + +/* Arduino Uno / Nano Pin to interrupt map: + * D0-D7 = PCINT 16-23 = PCIR2 = PD = PCIE2 = pcmsk2 + * D8-D13 = PCINT 0-5 = PCIR0 = PB = PCIE0 = pcmsk0 + * A0-A5 (D14-D19) = PCINT 8-13 = PCIR1 = PC = PCIE1 = pcmsk1 + */ + + +/* + Changes: + V1.2 + 27.10.16 - use noInterrupts in report() + - avoid reporting very short timeDiff in case of very slow impulses after a report + - now reporting is delayed if impulses happened only within in intervalSml + - reporting is also delayed if less than countMin pulses counted + - extend command "int" for optional intervalSml and countMin + 29.10.16 - allow interval Min >= Max or Sml > Min + which changes behavior to take fixed calculation interval instead of timeDiff between pulses + -> if intervalMin = intervalMax, counting will allways follow the reporting interval + 3.11.16 - more noInterrupt blocks when accessing the non uint8_t volatiles in report + V1.3 + 4.11.16 - check min pulse width and add more output, + - prefix show output with M + V1.4 + 10.11.16 - restructure add Cmd + - change syntax for specifying minPulseLengh + - res (reset) command + V1.6 + 13.12.16 - new startup message logic?, newline before first communication? + 18.12.16 - replace all code containing Strings, new communication syntax and parsing from Jeelink code + V1.7 + 2.1.17 - change message syntax again, report time as well, first and last impulse are reported + relative to start of intervall not start of reporting intervall + V1.8 + 4.1.17 - fixed a missing break in the case statement for pin definition + 5.1.17 - cleanup debug logging + 14.10.17 - fix a bug where last port state was not initialized after interrupt attached but this is necessary there + 23.11.17 - beautify code, add comments, more debugging for users with problematic pulse creation devices + 28.12.17 - better reportung of first pulse (even if only one pulse and countdiff is 0 but realdiff is 1) + 30.12.17 - rewrite PCInt, new handling of min pulse length, pulse history ring + 1.1.18 - check len in add command, allow pin 8 and 13 + 2.1.18 - add history per pin to report line, show negative starting times in show history + 3.1.18 - little reporting fix (start pos of history report) + + V2.0 + 17.1.18 - rewrite many things - use pin number instead of pcIntPinNumber as index, split interrupt handler for easier porting to ESP8266, ... + V2.23 + 10.2.18 - new commands for check alive and quit, send setup message after reboot also over tcp + remove reporting time of first pulse (now we hava history) + remove pcIntMode (is always change now) + pulse min interval is now always checked and defaults to 2 if not set + march 2018 many changes more to support ESP8266 + 7.3.18 - change pin config output, fix pullup (V2.26), store config in eeprom and read it back after boot + 22.4.18 - many changes, delay report if tcp mode and disconnected, verbose levels, ... + 13.5.18 - V2.36 Keepalive also on Arduino side + + + ToDo / Ideas: + + +*/ + +/* allow printing of every pin change to Serial */ +#define debugPins 1 + +/* allow tracking of pulse lengths */ +#define pulseHistory 1 + +/* use a sample config at boot */ +// #define debugCfg 1 + +#include "pins_arduino.h" +#include + +const char versionStr[] PROGMEM = "ArduCounter V2.36"; +const char compile_date[] PROGMEM = __DATE__ " " __TIME__; +const char errorStr[] PROGMEM = "Error: "; + +#ifdef ARDUINO_BOARD +const char boardName1[] PROGMEM = ARDUINO_BOARD; +#endif + +#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__) +const char boardName[] PROGMEM = "UNO"; +#elif defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega16U4__) +const char boardName[] PROGMEM = "Leonardo"; +#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +const char boardName[] PROGMEM = "Mega"; +#elif defined(ESP8266) +const char boardName[] PROGMEM = "ESP8266"; +#else +const char boardName[] PROGMEM = "UNKNOWN"; +#endif + +#define SERIAL_SPEED 38400 +#define MAX_INPUT_NUM 8 +#define MAX_HIST 20 + + +#ifdef ESP8266 +// varibales / definitions for ESP 8266 based boards +#include + +const char* ssid = "MySSID"; +const char* password = "secret"; + +WiFiServer Server(80); // For ESP WiFi connection +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 + +boolean tcpMode = false; +uint8_t delayedTcpReports = 0; // how often did we already delay reporting because tcp disconnected +uint32_t lastDelayedTcpReports = 0; // last time we delayed + +#define MAX_APIN 8 +#define MAX_PIN 8 + +/* ESP8266 pins that are typically ok to use + * (some might be set to -1 (disallowed) because they are used + * as reset, serial, led or other things on most boards) + * maps printed pin numbers to sketch internal index numbers */ +short allowedPins[MAX_APIN] = + { 0, 1, 2, -1, + -1, 5, 6, 7}; +/* Wemos / NodeMCU Pins 3,4 and 8 (GPIO 0,2 and 15) define boot mode and therefore + * can not be used to connect to signal + */ + +/* Map from sketch internal pin index to real chip IO pin number */ +short internalPins[MAX_PIN] = + { 16, 5, 4, 0, + 2, 14, 12, 13}; + +#else +// variables / definitions for arduino / 328p based boards +#define MAX_APIN 22 +#define MAX_PIN 20 + +/* arduino pins that are typically ok to use + * (some might be set to -1 (disallowed) because they are used + * as reset, serial, led or other things on most boards) + * maps printed pin numbers to sketch internal index numbers */ +short allowedPins[MAX_APIN] = + {-1, -1, 0, 1, + 2, 3, 4, 5, + 6, 7, 8, 9, + 10, 11, 12, 13, + 14, 15, 16, 17, + 18, 19 }; + +/* Map from sketch internal pin index to real chip IO pin number */ +short internalPins[MAX_PIN] = + { 2, 3, 4, 5, + 6, 7, 8, 9, + 10, 11, 12, 13, + 14, 15, 16, 17, + 18, 19 }; + +/* first and last pin at port PB, PC and PD for arduino uno/nano */ +uint8_t firstPin[] = {8, 14, 0}; // aPin -> allowedPins[] -> pinIndex +uint8_t lastPin[] = {13, 19, 7}; + +/* Pin change mask for each chip port on the arduino platform */ +volatile uint8_t *port_to_pcmask[] = { + &PCMSK0, + &PCMSK1, + &PCMSK2 +}; + +/* last PIN States at io port to detect individual pin changes in arduino ISR */ +volatile static uint8_t PCintLast[3]; + +#endif + + +Print *Output; // Pointer to output device (Serial / TCP connection with ESP8266) +uint32_t bootTime; +uint16_t bootWraps; // counter for millis wraps at last reset +uint16_t millisWraps; // counter to track when millis counter wraps +uint32_t lastMillis; // milis at last main loop iteration +uint8_t devVerbose; // >=10 shows pin changes, >=5 shows pin history + +#ifdef debugPins +uint8_t lastState[MAX_PIN]; // for debug output when a pin state changes +#endif + +uint32_t intervalMin = 30000; // default 30 sec - report after this time if nothing else delays it +uint32_t intervalMax = 60000; // default 60 sec - report after this time if it didin't happen before +uint32_t intervalSml = 2000; // default 2 secs - continue count if timeDiff is less and intervalMax not over +uint16_t countMin = 2; // continue counting if count is less than this and intervalMax not over + +uint32_t timeNextReport; +#ifdef ESP8266 +uint32_t expectK; +#endif + +/* index to the following arrays is the internal pin index number */ + +volatile boolean initialized[MAX_PIN]; // did we get first interrupt yet? +short activePin[MAX_PIN]; // printed arduino pin number for index if active - otherwise -1 +uint16_t pulseWidthMin[MAX_PIN]; // minimal pulse length in millis for filtering +uint8_t pulseLevel[MAX_PIN]; // start of pulse for measuring length - 0 / 1 as defined for each pin +uint8_t pullup[MAX_PIN]; // pullup configuration state + +volatile uint32_t counter[MAX_PIN]; // real pulse counter +volatile uint8_t counterIgn[MAX_PIN]; // ignored first pulse after init +volatile uint16_t rejectCounter[MAX_PIN]; // counter for rejected pulses that are shorter than pulseWidthMin +uint32_t lastCount[MAX_PIN]; // counter at last report (to get the delta count) +uint16_t lastRejCount[MAX_PIN]; // reject counter at last report (to get the delta count) + +volatile uint32_t lastChange[MAX_PIN]; // millis at last level change (for measuring pulse length) +volatile uint8_t lastLevel[MAX_PIN]; // level of input at last interrupt +volatile uint8_t lastLongLevel[MAX_PIN]; // last level that was longer than pulseWidthMin + +volatile uint32_t pulseWidthSum[MAX_PIN]; // sum of pulse lengths for average calculation +uint8_t reportSequence[MAX_PIN]; // sequence number for reports + + +#ifdef pulseHistory +volatile uint8_t histIndex; // pointer to next entry in history ring +volatile uint16_t histNextSeq; // next seq number to use +volatile uint16_t histSeq[MAX_HIST]; // history sequence number +volatile uint8_t histPin[MAX_HIST]; // pin for this entry +volatile uint8_t histLevel[MAX_HIST]; // level for this entry +volatile uint32_t histTime[MAX_HIST]; // time for this entry +volatile uint32_t histLen[MAX_HIST]; // time that this level was held +volatile char histAct[MAX_HIST]; // action (count, reject, ...) as one char +#endif + +volatile uint32_t intervalStart[MAX_PIN]; // start of an interval - typically set by first / last pulse +volatile uint32_t intervalEnd[MAX_PIN]; // end of an interval - typically set by first / last pulse +uint32_t lastReport[MAX_PIN]; // millis at last report to find out when maxInterval is over + +uint16_t commandData[MAX_INPUT_NUM]; // input data over serial port or network +uint8_t commandDataPointer = 0; // index pointer to next input value +uint16_t value; // the current value for input function + + +/* + do counting and set start / end time of interval. + reporting is not triggered from here. + + only here counter[] is modified + intervalEnd[] is set here and in report + intervalStart[] is set in case a pin was not initialized yet and in report +*/ +static void inline doCount(uint8_t pinIndex, uint8_t level, uint32_t now) { + uint32_t len = now - lastChange[pinIndex]; + char act = ' '; + +#ifdef pulseHistory + histIndex++; + if (histIndex >= MAX_HIST) histIndex = 0; + histSeq[histIndex] = histNextSeq++; + histPin[histIndex] = pinIndex; + histTime[histIndex] = lastChange[pinIndex]; + histLen[histIndex] = len; + histLevel[histIndex] = lastLevel[pinIndex]; +#endif + if (len < pulseWidthMin[pinIndex]) { // pulse was too short + lastChange[pinIndex] = now; + if (lastLevel[pinIndex] == pulseLevel[pinIndex]) { // if change to gap level + rejectCounter[pinIndex]++; // inc reject counter and set action to R (pulse too short) + act = 'R'; + } else { + act = 'X'; // set action to X (gap too short) + } + } else { + if (lastLevel[pinIndex] != pulseLevel[pinIndex]) { // edge does fit defined pulse start, level is now pulse, before it was gap + act = 'G'; // now the gap is confirmed (even if inbetween was a spike that we ignored) + } else { // edge is a change to gap, level is now gap + if (lastLongLevel[pinIndex] != pulseLevel[pinIndex]) { // last remembered valid level was also gap -> now we had valid new pulse -> count + counter[pinIndex]++; // count + intervalEnd[pinIndex] = now; // remember time of in case pulse will be the last in the interval + if (!initialized[pinIndex]) { + intervalStart[pinIndex] = now; // if this is the very first impulse on this pin -> start interval now + initialized[pinIndex] = true; // and start counting the next impulse (so far counter is 0) + counterIgn[pinIndex]++; // count as to be ignored for diff because it defines the start of the interval + } + pulseWidthSum[pinIndex] += len; // for average calculation + act = 'C'; + } else { // last remembered valid level was a pulse -> now we had another valid pulse + pulseWidthSum[pinIndex] += len; // for average calculation + act = 'P'; // pulse was already counted, only short drop inbetween + } + } + lastLongLevel[pinIndex] = lastLevel[pinIndex]; // remember this valid level as lastLongLevel + } +#ifdef pulseHistory + histAct[histIndex] = act; +#endif + lastChange[pinIndex] = now; + lastLevel[pinIndex] = level; +} + + +/* Interrupt handlers and their installation + * on Arduino and ESP8266 platforms + */ + +#ifndef ESP8266 +/* Add a pin to be handled (Arduino code) */ +uint8_t AddPinChangeInterrupt(uint8_t rPin) { + volatile uint8_t *pcmask; // pointer to PCMSK0 or 1 or 2 depending on the port corresponding to the pin + uint8_t bitM = digitalPinToBitMask(rPin); // mask to bit in PCMSK to enable pin change interrupt for this arduino pin + uint8_t port = digitalPinToPort(rPin); // port that this arduno pin belongs to for enabling interrupts + if (port == NOT_A_PORT) + return 0; + port -= 2; // from port (PB, PC, PD) to index in our array + pcmask = port_to_pcmask[port]; // point to PCMSK0 or 1 or 2 depending on the port corresponding to the pin + *pcmask |= bitM; // set the pin change interrupt mask through a pointer to PCMSK0 or 1 or 2 + PCICR |= 0x01 << port; // enable the interrupt + return 1; +} + + +/* Remove a pin to be handled (Arduino code) */ +uint8_t RemovePinChangeInterrupt(uint8_t rPin) { + volatile uint8_t *pcmask; + uint8_t bitM = digitalPinToBitMask(rPin); + uint8_t port = digitalPinToPort(rPin); + if (port == NOT_A_PORT) + return 0; + port -= 2; // from port (PB, PC, PD) to index in our array + pcmask = port_to_pcmask[port]; + *pcmask &= ~bitM; // clear the bit in the mask. + if (*pcmask == 0) { // if that's the last one, disable the interrupt. + PCICR &= ~(0x01 << port); + } + return 1; +} + + +// now set the arduino interrupt service routines and call the common handler with the port index number +ISR(PCINT0_vect) { + PCint(0); +} +ISR(PCINT1_vect) { + PCint(1); +} +ISR(PCINT2_vect) { + PCint(2); +} + +/* + common function for arduino pin change interrupt handlers. "port" is the PCINT port index (0-2) as passed from above, not PB, PC or PD which are mapped to 2-4 +*/ +static void PCint(uint8_t port) { + uint8_t bit; + uint8_t curr; + uint8_t delta; + short pinIndex; + uint32_t now = millis(); + + // get the pin states for the indicated port. + curr = *portInputRegister(port+2); // current pin states at port (add 2 to get from index to PB, PC or PD) + delta = (curr ^ PCintLast[port]) & *port_to_pcmask[port]; // xor gets bits that are different and & screens out non pcint pins + PCintLast[port] = curr; // store new pin state for next interrupt + + if (delta == 0) return; // no handled pin changed + + bit = 0x01; // start mit rightmost (least significant) bit in a port + for (uint8_t aPin = firstPin[port]; aPin <= lastPin[port]; aPin++) { // loop over each pin on the given port that changed + if (delta & bit) { // did this pin change? + pinIndex = allowedPins[aPin]; + if (pinIndex > 0) { // shound not be necessary but test anyway + doCount (pinIndex, ((curr & bit) > 0), now); // do the counting, history and so on + } + } + bit = bit << 1; // shift mask to go to next bit + } +} + + +#else +/* Add a pin to be handled (ESP8266 code) */ + +/* attachInterrupt needs to be given an individual function for each interrrupt . + * since we cant pass the pin value into the ISR or we need to use an + * internal function __attachInnterruptArg ... but then we need a fixed reference for the pin numbers ... +*/ +uint8_t AddPinChangeInterrupt(uint8_t rPin) { + switch(rPin) { + case 4: + attachInterrupt(digitalPinToInterrupt(rPin), ESPISR4, CHANGE); + break; + case 5: + attachInterrupt(digitalPinToInterrupt(rPin), ESPISR5, CHANGE); + break; + case 12: + attachInterrupt(digitalPinToInterrupt(rPin), ESPISR12, CHANGE); + break; + case 13: + attachInterrupt(digitalPinToInterrupt(rPin), ESPISR13, CHANGE); + break; + case 14: + attachInterrupt(digitalPinToInterrupt(rPin), ESPISR14, CHANGE); + break; + case 16: + attachInterrupt(digitalPinToInterrupt(rPin), ESPISR16, CHANGE); + break; + default: + PrintErrorMsg(); Output->println(F("attachInterrupt")); + } + return 1; +} + +void ESPISR4() { // ISR for real pin GPIO 4 / pinIndex 2 + doCount(2, digitalRead(4), millis()); +} + +void ESPISR5() { // ISR for real pin GPIO 5 / pinIndex 1 + doCount(1, digitalRead(5), millis()); +} + +void ESPISR12() { // ISR for real pin GPIO 12 / pinIndex 6 + doCount(6, digitalRead(12), millis()); +} + +void ESPISR13() { // ISR for real pin GPIO 13 / pinIndex 7 + doCount(7, digitalRead(13), millis()); +} + +void ESPISR14() {// ISR for real pin GPIO 14 / pinIndex 5 + doCount(5, digitalRead(14), millis()); +} + +void ESPISR16() { // ISR for real pin GPIO 16 / pinIndex 0 + doCount(0, digitalRead(16), millis()); +} +#endif + + +void PrintErrorMsg() { + uint8_t len = strlen_P(errorStr); + char myChar; + for (unsigned char k = 0; k < len; k++) { + myChar = pgm_read_byte_near(errorStr + k); + Output->print(myChar); + } +} + + +void printVersionMsg() { + uint8_t len = strlen_P(versionStr); + char myChar; + for (unsigned char k = 0; k < len; k++) { + myChar = pgm_read_byte_near(versionStr + k); + Output->print(myChar); + } + Output->print(F(" on ")); + len = strlen_P(boardName); + for (unsigned char k = 0; k < len; k++) { + myChar = pgm_read_byte_near(boardName + k); + Output->print(myChar); + } + +#ifdef ARDUINO_BOARD + Output->print(F(" ")); + len = strlen_P(boardName1); + for (unsigned char k = 0; k < len; k++) { + myChar = pgm_read_byte_near(boardName1 + k); + Output->print(myChar); + } +#endif + + Output->print(F(" compiled ")); + len = strlen_P(compile_date); + for (unsigned char k = 0; k < len; k++) { + myChar = pgm_read_byte_near(compile_date + k); + Output->print(myChar); + } +} + + +void showIntervals() { + Output->print(F("I")); + Output->print(intervalMin / 1000); + Output->print(F(" ")); + Output->print(intervalMax / 1000); + Output->print(F(" ")); + Output->print(intervalSml / 1000); + Output->print(F(" ")); + Output->println(countMin); +} + + +void showPinConfig(short pinIndex) { + Output->print(F("P")); + Output->print(activePin[pinIndex]); + switch (pulseLevel[pinIndex]) { + case 1: Output->print(F(" rising")); break; + case 0: Output->print(F(" falling")); break; + default: Output->print(F(" -")); break; + } + if (pullup[pinIndex]) + Output->print(F(" pullup")); + Output->print(F(" min ")); + Output->print(pulseWidthMin[pinIndex]); +} + +#ifdef pulseHistory +void showPinHistory(short pinIndex, uint32_t now) { + uint8_t hi; + uint8_t start = (histIndex + 2) % MAX_HIST; + uint8_t count = 0; + uint32_t last; + boolean first = true; + + for (uint8_t i = 0; i < MAX_HIST; i++) { + hi = (start + i) % MAX_HIST; + if (histPin[hi] == pinIndex) + if (first || (last <= histTime[hi]+histLen[hi])) count++; + } + if (!count) return; + + Output->print (F("H")); // start with H + Output->print (activePin[pinIndex]); // printed pin number + Output->print (F(" ")); + for (uint8_t i = 0; i < MAX_HIST; i++) { + hi = (start + i) % MAX_HIST; + if (histPin[hi] == pinIndex) { + if (first || (last <= histTime[hi]+histLen[hi])) { + if (!first) Output->print (F(", ")); + Output->print (histSeq[hi]); // sequence + Output->print (F("s")); + Output->print ((long) (histTime[hi] - now)); // time when level started + Output->print (F("/")); + Output->print (histLen[hi]); // length + Output->print (F("@")); + Output->print (histLevel[hi]); // level (0/1) + Output->print (histAct[hi]); // action + first = false; + } + last = histTime[hi]; + } + } + Output->println(); +} +#endif + +/* + lastCount[] is only modified here (count at time of last reporting) + intervalEnd[] is modified here and in ISR - disable interrupts in critcal moments to avoid garbage in var + intervalStart[] is modified only here or for very first Interrupt in ISR +*/ +void showPinCounter(short pinIndex, boolean showOnly, uint32_t now) { + uint32_t count, countDiff, realDiff; + uint32_t startT, endT, timeDiff, widthSum; + uint16_t rejCount, rejDiff; + uint8_t countIgn; + + noInterrupts(); // copy counters while they cant be changed in isr + startT = intervalStart[pinIndex]; // start of interval (typically first pulse) + endT = intervalEnd[pinIndex]; // end of interval (last unless not enough) + count = counter[pinIndex]; // get current counter (counts all pulses + rejCount = rejectCounter[pinIndex]; + countIgn = counterIgn[pinIndex]; // pulses that mark the beginning of an interval + widthSum = pulseWidthSum[pinIndex]; + interrupts(); + + timeDiff = endT - startT; // time between first and last impulse + realDiff = count - lastCount[pinIndex]; // pulses during intervall + countDiff = realDiff - countIgn; // ignore forst pulse after device restart + rejDiff = rejCount - lastRejCount[pinIndex]; + + if (!showOnly) { // real reporting sets the interval borders new + if((long)(now - (lastReport[pinIndex] + intervalMax)) >= 0) { + // intervalMax is over + if ((countDiff >= countMin) && (timeDiff > intervalSml) && (intervalMin != intervalMax)) { + // normal procedure + noInterrupts(); // vars could be modified in ISR as well + intervalStart[pinIndex] = endT; // time of last impulse becomes first in next + interrupts(); + } else { + // nothing counted or counts happened during a fraction of intervalMin only + noInterrupts(); // vars could be modified in ISR as well + intervalStart[pinIndex] = now; // start a new interval for next report now + intervalEnd[pinIndex] = now; // no last impulse, use now instead + interrupts(); + timeDiff = now - startT; // special handling - calculation ends now + } + } else if( ((long)(now - (lastReport[pinIndex] + intervalMin)) >= 0) + && (countDiff >= countMin) && (timeDiff > intervalSml)) { + // minInterval has elapsed and other conditions are ok + noInterrupts(); // vars could be modified in ISR as well + intervalStart[pinIndex] = endT; // time of last also time of first in next + interrupts(); + } else { + return; // intervalMin and Max not over - dont report yet + } + noInterrupts(); + counterIgn[pinIndex] = 0; + pulseWidthSum[pinIndex] = 0; + interrupts(); + lastCount[pinIndex] = count; // remember current count for next interval + lastRejCount[pinIndex] = rejCount; + lastReport[pinIndex] = now; // remember when we reported +#ifdef ESP8266 + delayedTcpReports = 0; +#endif + reportSequence[pinIndex]++; + } + Output->print(F("R")); // R Report + Output->print(activePin[pinIndex]); + Output->print(F(" C")); // C - Count + Output->print(count); + Output->print(F(" D")); // D - Count Diff (without pulse that marks the begin) + Output->print(countDiff); + Output->print(F("/")); // R - real Diff for long counter - includes first after restart + Output->print(realDiff); + Output->print(F(" T")); // T - Time + Output->print(timeDiff); + Output->print(F(" N")); // N - now + Output->print((long)now); + Output->print(F(",")); + Output->print(millisWraps); + Output->print(F(" X")); // X Reject + Output->print(rejDiff); + + if (!showOnly) { + Output->print(F(" S")); // S - Sequence number + Output->print(reportSequence[pinIndex]); + } + if (countDiff > 0) { + Output->print(F(" A")); + Output->print(widthSum / countDiff); + } + Output->println(); +#ifdef ESP8266 + if (tcpMode && !showOnly) { + Serial.print(F("D reported pin ")); + Serial.print(activePin[pinIndex]); + Serial.print(F(" sequence ")); + Serial.print(reportSequence[pinIndex]); + Serial.println(F(" over tcp ")); + } +#endif + +} + + +/* + report count and time for pins that are between min and max interval +*/ + +boolean reportDue() { + uint32_t now = millis(); + boolean doReport = false; // check if report needs to be called + if((long)(now - timeNextReport) >= 0) // works fine when millis wraps. + doReport = true; // intervalMin is over + else + for (uint8_t pinIndex=0; pinIndex < MAX_PIN; pinIndex++) + if (activePin[pinIndex] > 0) + if((long)(now - (lastReport[pinIndex] + intervalMax)) >= 0) + doReport = true; // active pin has not been reported for langer than intervalMax + return doReport; +} + + + +void report() { + uint32_t now = millis(); +#ifdef ESP8266 + if (tcpMode && !Client1Connected && (delayedTcpReports < 3)) { + if(delayedTcpReports == 0 || ((long)(now - (lastDelayedTcpReports + (1 * 30 * 1000))) > 0)) { + Serial.print(F("D report called but tcp is disconnected - delaying (")); + Serial.print(delayedTcpReports); + Serial.print(F(")")); + Serial.print(F(" now ")); + Serial.print(now); + Serial.print(F(" last ")); + Serial.print(lastDelayedTcpReports); + Serial.print(F(" diff ")); + Serial.println(now - lastDelayedTcpReports); + delayedTcpReports++; + lastDelayedTcpReports = now; + return; + } else return; + } +#endif + + for (uint8_t pinIndex=0; pinIndex < MAX_PIN; pinIndex++) { // go through all observed pins as pinIndex + if (activePin[pinIndex] >= 0) { + showPinCounter (pinIndex, false, now); // report pin counters if necessary +#ifdef pulseHistory + if (devVerbose >= 5) + showPinHistory(pinIndex, now); // show pin history if verbose >= 5 +#endif + } + } + timeNextReport = now + intervalMin; // check again after intervalMin or if intervalMax is over for a pin +} + + +/* give status report in between if requested over serial input */ +void showCmd() { + uint32_t now = millis(); + Output->print(F("M Status: ")); + printVersionMsg(); + Output->println(); + showIntervals(); + for (uint8_t pinIndex=0; pinIndex < MAX_PIN; pinIndex++) { + if (activePin[pinIndex] > 0) { + showPinConfig(pinIndex); + Output->print(F(", ")); + showPinCounter(pinIndex, true, now); +#ifdef pulseHistory + showPinHistory(pinIndex, now); +#endif + } + } + readFromEEPROM(); + Output->print(F("M Next report in ")); + Output->print(timeNextReport - millis()); + Output->print(F(" milliseconds")); + Output->println(); + //Output->println(F("M #end#")); +} + + +void helloCmd() { + uint32_t now = millis(); + Output->println(); + printVersionMsg(); + Output->print(F(" Hello, pins ")); + boolean first = true; + for (uint8_t aPin=0; aPin < MAX_APIN; aPin++) { + if (allowedPins[aPin] >= 0) { + if (!first) { + Output->print(F(",")); + } else { + first = false; + } + Output->print(aPin); + } + } + Output->print(F(" available")); + Output->print(F(" T")); + Output->print(now); + Output->print(F(",")); + Output->print(millisWraps); + Output->print(F(" B")); + Output->print(bootTime); + Output->print(F(",")); + Output->print(bootWraps); + + Output->println(); + showIntervals(); + for (uint8_t pinIndex=0; pinIndex < MAX_PIN; pinIndex++) { // go through all observed pins as pinIndex + if (activePin[pinIndex] >= 0) { + showPinConfig(pinIndex); + Output->println(); + } + } +} + + + +/* + handle add command. +*/ +void addCmd(uint16_t *values, uint8_t size) { + uint16_t pulseWidth; + uint32_t now = millis(); + + uint8_t aPin = values[0]; // value 0 is pin number + if (aPin >= MAX_APIN || allowedPins[aPin] < 0) { + PrintErrorMsg(); + Output->print(F("Illegal pin specification ")); + Output->println(aPin); + return; + }; + uint8_t pinIndex = allowedPins[aPin]; + uint8_t rPin = internalPins[pinIndex]; + + if (activePin[pinIndex] != aPin) { // in case this pin is not already active counting + #ifndef ESP8266 + uint8_t port = digitalPinToPort(rPin) - 2; + PCintLast[port] = *portInputRegister(port+2); + #endif + initPinVars(pinIndex, now); + activePin[pinIndex] = aPin; // save arduino pin number and flag this pin as active for reporting + } + + if (values[1] < 2 || values[1] > 3) { // value 1 is level (rising / falling -> 0/1 + PrintErrorMsg(); + Output->print(F("Illegal pulse level specification for pin ")); + Output->println(aPin); + } + pulseLevel[pinIndex] = (values[1] == 3); // 2 = falling -> pulseLevel 0, 3 = rising -> pulseLevel 1 + + + if (size > 2 && values[2]) { // value 2 is pullup + pinMode (rPin, INPUT_PULLUP); + pullup[pinIndex] = 1; + // digitalWrite (rPin, HIGH); // old way to enable pullup resistor + } else { + pinMode (rPin, INPUT); + pullup[pinIndex] = 0; + } + + if (size > 3 && values[3] > 0) { // value 3 is min length + pulseWidth = values[3]; + } else { + pulseWidth = 2; + } + pulseWidthMin[pinIndex] = pulseWidth; + + if (!AddPinChangeInterrupt(rPin)) { // add Pin Change Interrupt + PrintErrorMsg(); + Output->println(F("AddInt")); + return; + } + + Output->print(F("M defined ")); + showPinConfig(pinIndex); + Output->println(); +} + + +/* + handle rem command. +*/ +void removeCmd(uint16_t *values, uint8_t size) { + uint8_t aPin = values[0]; + if (size < 1 || aPin >= MAX_APIN || allowedPins[aPin] < 0) { + PrintErrorMsg(); + Output->print(F("Illegal pin specification ")); + Output->println(aPin); + return; + }; + uint8_t pinIndex = allowedPins[aPin]; + +#ifdef ESP8266 + detachInterrupt(digitalPinToInterrupt(internalPins[pinIndex])); +#else + if (!RemovePinChangeInterrupt(internalPins[pinIndex])) { + PrintErrorMsg(); Output->println(F("RemInt")); + return; + } +#endif + initPinVars(pinIndex, 0); + Output->print(F("M removed ")); + Output->println(aPin); +} + + + +void intervalCmd(uint16_t *values, uint8_t size) { + /*Serial.print(F("D int ptr is ")); + Serial.println(size);*/ + if (size < 4) { // i command always gets 4 values: min, max, sml, cntMin + PrintErrorMsg(); + Output->print(F("size")); + Output->println(); + return; + } + if (values[0] < 1 || values[0] > 3600) { + PrintErrorMsg(); Output->println(values[0]); + return; + } + intervalMin = (long)values[0] * 1000; + if (millis() + intervalMin < timeNextReport) + timeNextReport = millis() + intervalMin; + + if (values[1] < 1 || values[1] > 3600) { + PrintErrorMsg(); Output->println(values[1]); + return; + } + intervalMax = (long)values[1]* 1000; + + if (values[2] > 3600) { + PrintErrorMsg(); Output->println(values[2]); + return; + } + intervalSml = (long)values[2] * 1000; + + if (values[3] > 100) { + PrintErrorMsg(); Output->println(values[3]); + return; + } + countMin = values[3]; + + Output->print(F("M intervals set to ")); + Output->print(values[0]); + Output->print(F(" ")); + Output->print(values[1]); + Output->print(F(" ")); + Output->print(values[2]); + Output->print(F(" ")); + Output->print(values[3]); + Output->println(); +} + + +void keepAliveCmd(uint16_t *values, uint8_t size) { + Output->println(F("alive")); +#ifdef ESP8266 + if (values[0] == 1 && size > 0 && size < 3 && Client1.connected()) { + tcpMode = true; + if (size == 2) { + expectK = millis() + values[1] * 2500; + } else { + expectK = millis() + 600000; // 10 Minutes if nothing sent (should not happen) + } + } +#endif +} + + +#ifdef ESP8266 +void quitCmd() { + if (Client1.connected()) { + Client1.println(F("closing connection")); + Client1.stop(); + tcpMode = false; + Serial.println(F("M TCP connection closed")); + } else { + Serial.println(F("M TCP not connected")); + } +} +#endif + + + +void updateEEPROM(int &address, byte value) { + if( EEPROM.read(address) != value){ + EEPROM.write(address, value); + } + address++; +} + + +void updateEEPROMSlot(int &address, char cmd, int v1, int v2, int v3, int v4) { + updateEEPROM(address, cmd); // I / A + updateEEPROM(address, v1 & 0xff); + updateEEPROM(address, v1 >> 8); + updateEEPROM(address, v2 & 0xff); + updateEEPROM(address, v2 >> 8); + updateEEPROM(address, v3 & 0xff); + updateEEPROM(address, v3 >> 8); + updateEEPROM(address, v4 & 0xff); + updateEEPROM(address, v4 >> 8); +} + + +void saveToEEPROMCmd() { + int address = 0; + uint8_t slots = 1; + updateEEPROM(address, 'C'); + updateEEPROM(address, 'f'); + updateEEPROM(address, 'g'); + for (uint8_t pinIndex=0; pinIndex < MAX_PIN; pinIndex++) + if (activePin[pinIndex] > 0) slots ++; + updateEEPROM(address, slots); // number of defined pins + intervall definition + updateEEPROMSlot(address, 'I', (uint16_t)(intervalMin / 1000), (uint16_t)(intervalMax / 1000), + (uint16_t)(intervalSml / 1000), (uint16_t)countMin); + for (uint8_t pinIndex=0; pinIndex < MAX_PIN; pinIndex++) + if (activePin[pinIndex] > 0) + updateEEPROMSlot(address, 'A', (uint16_t)activePin[pinIndex], (uint16_t)(pulseLevel[pinIndex] ? 3:2), + (uint16_t)pullup[pinIndex], (uint16_t)pulseWidthMin[pinIndex]); +#ifdef ESP8266 + EEPROM.commit(); +#endif + Serial.print(F("config saved, ")); + Serial.print(slots); + Serial.print(F(", ")); + Serial.println(address); +} + + +void readFromEEPROM() { + int address = 0; + Output->println(); + Output->print(F("M EEPROM Config: ")); + Output->print((char) EEPROM.read(0)); + Output->print((char) EEPROM.read(1)); + Output->print((char) EEPROM.read(2)); + Output->print(F(" Slots: ")); + Output->print((int) EEPROM.read(3)); + Output->println(); + if (EEPROM.read(address) != 'C' || EEPROM.read(address+1) != 'f' || EEPROM.read(address+2) != 'g') { + Output->println(F("M no config in EEPROM")); + return; + } + address = 3; + uint8_t slots = EEPROM.read(address++); + if (slots > MAX_PIN + 1) { + Output->println(F("M illegal config in EEPROM")); + return; + } + uint16_t v1, v2, v3, v4; + char cmd; + for (uint8_t slot=0; slot < slots; slot++) { + cmd = EEPROM.read(address); + v1 = EEPROM.read(address+1) + (((uint16_t)EEPROM.read(address+2)) << 8); + v2 = EEPROM.read(address+3) + (((uint16_t)EEPROM.read(address+4)) << 8); + v3 = EEPROM.read(address+5) + (((uint16_t)EEPROM.read(address+6)) << 8); + v4 = EEPROM.read(address+7) + (((uint16_t)EEPROM.read(address+8)) << 8); + address = address + 9; + Output->print(F("M Slot: ")); + Output->print(cmd); + Output->print(F(" ")); + Output->print(v1); + Output->print(F(",")); + Output->print(v2); + Output->print(F(",")); + Output->print(v3); + Output->print(F(",")); + Output->print(v4); + Output->println(); + } +} + + +void restoreFromEEPROM() { + int address = 0; + if (EEPROM.read(address) != 'C' || EEPROM.read(address+1) != 'f' || EEPROM.read(address+2) != 'g') { + Serial.println(F("M no config in EEPROM")); + return; + } + address = 3; + uint8_t slots = EEPROM.read(address++); + if (slots > MAX_PIN + 1 || slots < 1) { + Serial.println(F("M illegal config in EEPROM")); + return; + } + Serial.println(F("M restoring config from EEPROM")); + char cmd; + for (uint8_t slot=0; slot < slots; slot++) { + cmd = EEPROM.read(address); + commandData[0] = EEPROM.read(address+1) + (((uint16_t)EEPROM.read(address+2)) << 8); + commandData[1] = EEPROM.read(address+3) + (((uint16_t)EEPROM.read(address+4)) << 8); + commandData[2] = EEPROM.read(address+5) + (((uint16_t)EEPROM.read(address+6)) << 8); + commandData[3] = EEPROM.read(address+7) + (((uint16_t)EEPROM.read(address+8)) << 8); + address = address + 9; + commandDataPointer = 4; + if (cmd == 'I') intervalCmd(commandData, commandDataPointer); + if (cmd == 'A') addCmd(commandData, commandDataPointer); + } + commandDataPointer = 0; + value = 0; + for (uint8_t i=0; i < MAX_INPUT_NUM; i++) + commandData[i] = 0; + +} + + +void handleInput(char c) { + if (c == ',') { // Komma input, last value is finished + if (commandDataPointer < (MAX_INPUT_NUM - 1)) { + commandData[commandDataPointer++] = value; + value = 0; + } + } + else if ('0' <= c && c <= '9') { // digit input + value = 10 * value + c - '0'; + } + else if ('a' <= c && c <= 'z') { // letter input is command + + if (devVerbose > 0) { + Serial.print(F("D got ")); + for (short v = 0; v <= commandDataPointer; v++) { + if (v > 0) Serial.print(F(",")); + Serial.print(commandData[v]); + } + Serial.print(c); + Serial.print(F(" size ")); + Serial.print(commandDataPointer+1); + Serial.println(); + } + + switch (c) { + case 'a': + commandData[commandDataPointer] = value; + addCmd(commandData, commandDataPointer+1); + break; + case 'd': + commandData[commandDataPointer] = value; + removeCmd(commandData, commandDataPointer+1); + break; + case 'i': + commandData[commandDataPointer] = value; + intervalCmd(commandData, commandDataPointer+1); + break; + case 'r': + initialize(); + break; + case 's': + showCmd(); + break; + case 'v': + if (value < 255) { + devVerbose = value; + Output->print(F("M devVerbose set to ")); + Output->println(value); + } else { + Output->println(F("M illegal value passed for devVerbose")); + } + break; + case 'h': + helloCmd(); + break; + case 'e': + saveToEEPROMCmd(); + break; + case 'f': + // OTA flash from HTTP Server + break; +#ifdef ESP8266 + case 'q': + quitCmd(); + break; +#endif + case 'k': + commandData[commandDataPointer] = value; + keepAliveCmd(commandData, commandDataPointer+1); + break; + default: + break; + } + commandDataPointer = 0; + value = 0; + for (uint8_t i=0; i < MAX_INPUT_NUM; i++) + commandData[i] = 0; + //Serial.println(F("D End of command")); + } +} + +#ifdef debugCfg +/* do sample config so we don't need to configure pins after each reboot */ +void debugSetup() { + commandData[0] = 10; + commandData[1] = 20; + commandData[2] = 3; + commandData[3] = 0; + commandDataPointer = 4; + intervalCmd(commandData, commandDataPointer); + + commandData[0] = 1; // pin 1 + commandData[1] = 2; // falling + commandData[2] = 1; // pullup + commandData[3] = 30; // min Length + commandDataPointer = 4; + addCmd(commandData, commandDataPointer); + + commandData[0] = 2; // pin 2 + addCmd(commandData, commandDataPointer); + +/* + commandData[0] = 5; // pin 5 + addCmd(commandData, commandDataPointer); + + commandData[0] = 6; // pin 6 + addCmd(commandData, commandDataPointer); +*/ +} +#endif + + +#ifdef debugPins +void debugPinChanges() { + for (uint8_t pinIndex=0; pinIndex < MAX_PIN; pinIndex++) { + short aPin = activePin[pinIndex]; + if (aPin > 0) { + uint8_t rPin = internalPins[pinIndex]; + uint8_t pinState = digitalRead(rPin); + + if (pinState != lastState[pinIndex]) { + lastState[pinIndex] = pinState; + Output->print(F("M pin ")); + Output->print(aPin); + Output->print(F(" ( internal ")); + Output->print(rPin); + Output->print(F(" ) ")); + Output->print(F(" to ")); + Output->print(pinState); +#ifdef pulseHistory + Output->print(F(" histIdx ")); + Output->print(histIndex); +#endif + Output->print(F(" count ")); + Output->print(counter[pinIndex]); + Output->print(F(" reject ")); + Output->print(rejectCounter[pinIndex]); + Output->println(); + } + } + } +} +#endif + + +#ifdef ESP8266 +void connectWiFi() { + Client1Connected = false; + Client2Connected = false; + + // Connect to WiFi network + WiFi.mode(WIFI_STA); + delay (1000); + if (WiFi.status() != WL_CONNECTED) { + Serial.print(F("M Connecting WiFi to ")); + Serial.println(ssid); + WiFi.begin(ssid, password); // authenticate + while (WiFi.status() != WL_CONNECTED) { + Serial.print(F("M Status is ")); + switch (WiFi.status()) { + case WL_CONNECT_FAILED: + Serial.println(F("Connect Failed")); + break; + case WL_CONNECTION_LOST: + Serial.println(F("Connection Lost")); + break; + case WL_DISCONNECTED: + Serial.println(F("Disconnected")); + break; + case WL_CONNECTED: + Serial.println(F("Connected")); + break; + default: + Serial.println(WiFi.status()); + } + delay(1000); + } + Serial.println(); + Serial.print(F("M WiFi connected to ")); + Serial.println(WiFi.SSID()); + } else { + Serial.print(F("M WiFi already connected to ")); + Serial.println(WiFi.SSID()); + } + + // Start the server + Server.begin(); + Serial.println(F("M Server started")); + + // Print the IP address + Serial.print(F("M Use this IP: ")); + Serial.println(WiFi.localIP()); +} + + +void handleConnections() { + IPAddress remote; + uint32_t now = millis(); + + if (Client1Connected) { + if((long)(now - expectK) >= 0) { + Serial.println(F("M no keepalive from Client - disconnecting")); + Client1.stop(); + } + } + if (Client1.available()) { + handleInput(Client1.read()); + //Serial.println(F("M new Input over TCP")); + } + if (Client1.connected()) { + Client2 = Server.available(); + if (Client2) { + Client2.println(F("connection already busy")); + remote = Client2.remoteIP(); + Client2.stop(); + Serial.print(F("M second connection from ")); + Serial.print(remote); + Serial.println(F(" rejected")); + } + } else { + if (Client1Connected) { // client used to be connected, now disconnected + Client1Connected = false; + Output = &Serial; + Serial.println(F("M connection to client lost")); + } + Client1 = Server.available(); + if (Client1) { // accepting new connection + remote = Client1.remoteIP(); + Serial.print(F("M new connection from ")); + Serial.print(remote); + Serial.println(F(" accepted")); + Client1Connected = true; + Output = &Client1; + expectK = now + 600000; // max 10 Minutes (to be checked on Fhem module side as well + helloCmd(); // say hello to client + } + } +} +#endif + + +void handleTime() { + uint32_t now = millis(); + if (now < lastMillis) millisWraps++; + lastMillis = now; +} + + +void initPinVars(short pinIndex, uint32_t now) { + activePin[pinIndex] = -1; // inactive (-1) + initialized[pinIndex] = false; // no pulse seen yet + pulseWidthMin[pinIndex] = 0; // min pulse length + counter[pinIndex] = 0; // counter to 0 + counterIgn[pinIndex] = 0; + lastCount[pinIndex] = 0; + rejectCounter[pinIndex] = 0; + lastRejCount[pinIndex] = 0; + intervalStart[pinIndex] = now; // time vars + intervalEnd[pinIndex] = now; + lastChange[pinIndex] = now; + lastReport[pinIndex] = now; + reportSequence[pinIndex] = 0; + uint8_t level = digitalRead(internalPins[pinIndex]); + lastLevel[pinIndex] = level; +#ifdef debugPins + lastState[pinIndex] = level; // for debug output +#endif +} + + +void initialize() { + uint32_t now = millis(); + for (uint8_t pinIndex=0; pinIndex < MAX_PIN; pinIndex++) { + initPinVars(pinIndex, now); + } + timeNextReport = now + intervalMin; // time for first output + devVerbose = 0; +#ifndef ESP8266 + for (uint8_t port=0; port <= 2; port++) { + PCintLast[port] = *portInputRegister(port+2); // current pin states at port for PCInt handler + } +#endif +#ifdef debugCfg + debugSetup(); +#endif + restoreFromEEPROM(); + bootTime = millis(); // with boot / reset time + bootWraps = millisWraps; +#ifdef ESP8266 + expectK = now + 600000; // max 10 Minutes (to be checked on Fhem module side as well +#endif +} + + +void setup() { + Serial.begin(SERIAL_SPEED); // initialize serial +#ifdef ESP8266 + EEPROM.begin(100); +#endif + delay (500); + interrupts(); + Serial.println(); + Output = &Serial; + millisWraps = 0; + lastMillis = millis(); + initialize(); + helloCmd(); // started message to serial +#ifdef ESP8266 + connectWiFi(); +#endif +} + + +/* + Main Loop + checks if report should be called because timeNextReport is reached + or lastReport for one pin is older than intervalMax + timeNextReport is only set here (and when interval is changed / at setup) +*/ +void loop() { + handleTime(); + if (Serial.available()) { + handleInput(Serial.read()); + } +#ifdef ESP8266 + handleConnections(); +#endif + +#ifdef debugPins + if (devVerbose >= 10) { + debugPinChanges(); + } +#endif + + if (reportDue()) { + report(); + } +} +