From 6e7e8c24d04be5cfb76a4f6c42613a4024a5726f Mon Sep 17 00:00:00 2001 From: mgehre Date: Wed, 13 Feb 2013 16:21:44 +0000 Subject: [PATCH] MAX: defer sending if we would encounter LOVF git-svn-id: https://fhem.svn.sourceforge.net/svnroot/fhem/trunk/fhem@2718 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- FHEM/14_CUL_MAX.pm | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/FHEM/14_CUL_MAX.pm b/FHEM/14_CUL_MAX.pm index 0f6644faa..334cf5f8f 100644 --- a/FHEM/14_CUL_MAX.pm +++ b/FHEM/14_CUL_MAX.pm @@ -6,6 +6,7 @@ package main; use strict; use warnings; use MaxCommon; +use POSIX; sub CUL_MAX_Send(@); sub CUL_MAX_BroadcastTime(@); @@ -311,9 +312,19 @@ CUL_MAX_SendQueueHandler($) if( $packet->{sent} == 0 ) { #Need to send it first #Send to CUL - IOWrite($hash, "", "Zs". $packet->{packet}); - $packet->{sent} = 1; - $timeout += $ackTimeout; #reschedule after ackTimeout + my ($credit10ms) = (CommandGet("","$hash->{IODev}{NAME} credit10ms") =~ /[^ ]* [^ ]* => (.*)/); + # We need 1000ms for preamble + len in bits (=hex len * 4) ms for payload. Divide by 10 to get credit10ms units + # keep this in sync with culfw's code in clib/rf_moritz.c! + my $necessaryCredit = ceil(100 + (length($packet->{packet})*4)/10); + if( defined($credit10ms) && $credit10ms < $necessaryCredit ) { + my $waitTime = $necessaryCredit-$credit10ms; #we get one credit10ms every second + $timeout += $waitTime; + Log 2, "CUL_MAX_SendQueueHandler: Not enough credit! credit10ms is $credit10ms, but we need $necessaryCredit. Waiting $waitTime seconds."; + } else { + IOWrite($hash, "", "Zs". $packet->{packet}); + $packet->{sent} = 1; + $timeout += $ackTimeout; #reschedule after ackTimeout + } } elsif( $packet->{sent} == 1) { #Already sent it, got no Ack Log 2, "CUL_MAX_Resend: Missing ack from $packet->{dest} for $packet->{packet}";