Page 1 of 2
Lång tid att skicka kommandon
Posted: Fri Mar 17, 2023 9:45 am
by zyberzero
Tjena!
Jag köpte mig en tellstick + dimmer ifrån Kjell idag. Jag har fått de att kommunicera med varandra, men dokumentationen var en aning halvkass + jag kunde inte uppdatera WIKIn där jag kände att jag kunde bidra (ställa in självlärande enheter ifrån Linux).
Hursomhelst, jag har nu börjat knacka ihop ett program, mycket enkelt:
Code: Select all
#include <iostream>
#include "../telldus-core/driver/libtelldus-core/telldus-core.h"
using namespace std;
int main()
{
int i =0;
while(true) {
i=i%256;
cout << i << endl;
tdDim(1, i);
i=i+15;
}
return 0;
}
Jag tyckte det tog lång tid innan något hände så jag testade att köra:
Code: Select all
zyber@jake:~$ time tdtool -v 255 -d 1
Dimming device: 1 Test to 255 - Success
real 0m1.594s
user 0m0.000s
sys 0m0.020s
Ska det verkligen ta 1.5 SEK att skicka ett dimmningskommando? Jag hade tänkt använda min tellstick till min HTPC (till en början XBMC under linux, senare MythTV) för att mjukt tända och släcka ljuset vid filmvisning (automagiskt förstås!).
Det blir ju inte jättesnyggt direkt, jag hade åtminstånde hoppats på kanske 0.2 sek / kommando.
Min utvecklingsmaskin är inte särskilt långsam; Intel Core 2 Duo @ 2.53 GHz (P8700), 4GB RAM, Linux x64 (Ubuntu 9.10) så det är knappast den som är slö på att räkna.
Jag slökikade genom källkoden för att leta efter någon typ av wait eller pause-funktion men kammade noll.
Ska det verkligen vara så? (tänk Sverker Olofssons hysteriska stil...)
Tack på förhand!
OfT: Naturligtvis tänkte jag släpa ett eventuellt plugin fritt så även andra får ta del av detta 
Posted: Fri Mar 17, 2023 9:45 am
by micke.prag
Vilken version kör du?
Redigering på wikin är tyvärr avstängt p.g.a. spamskäl. Vi undersöker alternativ till att öppna det igen.
Vissa Nexa/Proove mottagare dimmar alltid mjukt till vald nivå och behöver då inte "loopas" till rätt nivå.
Posted: Fri Mar 17, 2023 9:45 am
by zyberzero
Jag kör emot era debianpaket - vilket betyder att tdtool är version 2.0.1.
Tyvärr gör inte den här proove-enheten det, utan den dimmar bara från 0->godtyckligt värde mjukt.
Min tellstick är ifrån batch 8.
Posted: Fri Mar 17, 2023 9:45 am
by Jaxån
micke.prag wrote:Vilken version kör du?
Redigering på wikin är tyvärr avstängt p.g.a. spamskäl. Vi undersöker alternativ till att öppna det igen.
Inloggning via OpenID kanske. Då slipper ni hantera lösenord.
Posted: Fri Mar 17, 2023 9:45 am
by erikr
Jag upptäckte samma sak i windows när jag skulle göra en lite mer uppdaterad .Net wrapper. Vad är det som gör att det måste ta nära två sekunder (i mitt fall) att sända kommandot?
Jag antar att det finns en förklaring och att man antagligen får anpassa sig till detta, men jag kan inte sova innan jag förstår varför anropen tar så lång tid?

Posted: Fri Mar 17, 2023 9:45 am
by Jaxån
erikr wrote:Jag antar att det finns en förklaring och att man antagligen får anpassa sig till detta, men jag kan inte sova innan jag förstår varför anropen tar så lång tid?

Läs källkoden. Du förstår hur det fungerar, och du somnar ganska fort

Posted: Fri Mar 17, 2023 9:45 am
by erikr
Hehe.. mm.. jag tänkte kanske slippa gogga igenom hela koden. Vet ju inte riktigt vart jag ska titta, men jag kanske får göra ett försök. Har du något tips vart i koden man borde titta?[/quote]
Posted: Fri Mar 17, 2023 9:45 am
by erikr
Tjahapp, en liten titt i DeviceNexa.cpp och libtelldus-core/win/Device.cpp gav ju att hastigheten tycks vara 4800 baud och en typisk dimsträng är typ runt 60 tecken, dvs 480 bit. Det ger ju en tid på ca 100 millisekunder för att sända kodsträngen, men man får väl lägga på lite för overhead av olika slag, men det känns inte som hela förklaringen.. Mitt hopp är att någon som har bättre insikt kan belysa saken lite mer?
Posted: Fri Mar 17, 2023 9:45 am
by Jaxån
erikr wrote:Hehe.. mm.. jag tänkte kanske slippa gogga igenom hela koden. Vet ju inte riktigt vart jag ska titta, men jag kanske får göra ett försök. Har du något tips vart i koden man borde titta?
Tyärr. Jag somnar för snabbt
Det är troligen inte något som man gör på en kafferast, eller två.
I vart fall så har jag inte gjort någon mer noggran genomläsning av koden. Mestadels för att de mer håriga sakerna man kan göra med C++ ger mig nässelutslag (tror jag), så jag brukar hålla mig borta från sådan kod. Men jag skall nog titta igenom det vid tillfälle.
Posted: Fri Mar 17, 2023 9:45 am
by Jaxån
erikr wrote:Tjahapp, en liten titt i DeviceNexa.cpp och libtelldus-core/win/Device.cpp gav ju att hastigheten tycks vara 4800 baud och en typisk dimsträng är typ runt 60 tecken, dvs 480 bit. Det ger ju en tid på ca 100 millisekunder för att sända kodsträngen, men man får väl lägga på lite för overhead av olika slag, men det känns inte som hela förklaringen.. Mitt hopp är att någon som har bättre insikt kan belysa saken lite mer?
Jag har för mig, om inte minnet sviker mig, att man inte kan skicka ut kommandona för snabbt. Vilket gör att det är inlagt en fördröjning i programmet.
Posted: Fri Mar 17, 2023 9:45 am
by zyberzero
Jo, jag kan gå med på att det är viktigt med en fördröjning, men en fördröjning som är 15-20x längre tid än vad själva tiden för att skicka ett kommando tar? Jag ska försöka ge mig på att modifiera pauserutinen en skvätt. Jag återkommer med resultat!
Posted: Fri Mar 17, 2023 9:45 am
by micke.prag
Om det är pausen på rad 38 ni är på jakt efter här:
http://developer.telldus.se/browser/tru ... pp?rev=192
Så finns den inte längre kvar:
http://developer.telldus.se/browser/bra ... Device.cpp
TellStick svarar när den har sänt klart och då returnerar Device::send(). Dock finns det en fallback på ~5 sekunder om det inte kommer något svar.
I trunk pågår för tillfället ett arbete med att ha en process igång konstant som har en koppling till TellStick hela tiden. Om detta kan snabba på det hela får vi se.
Posted: Fri Mar 17, 2023 9:45 am
by zyberzero
Nej, det är inte den jag jagar - jag sitter och kikar i källkoden för 2.0.1. Men frågan är varför det blir 1.5 sekunder? det är ju varken fallbacktiden och som erikr konstaterade bör ju tiden mer ligga på 0.1 sekunder. om baudraten är 4800 (vilket den uppenbarligen är) så på 1.5 sek bör man ju hinna skicka 7200 bitar och jag har svårt att tro att det krävs 0.9 kB för att dimma en lampa.
Posted: Fri Mar 17, 2023 9:45 am
by micke.prag
Att skicka själva paketet tar ca 0,5s om jag inte missminner mig.
Posted: Fri Mar 17, 2023 9:45 am
by zyberzero
Då är fortfarande frågan var den sista sekunden är till för? Jag hittar inget i källkoden (grep -r sleep * ) som ska ge en sekunds paus. Jag har nu f.ö. tagit bort debianpaketet och kompilerat allt ifrån 2.0.1...