Sekce AutoIt: Ano nebo Ne?

Diskuze o software, který má mnoho společného s touto značkou (MapSource, BaseCamp, POI Loader, WebUpdater a ostatní).

Má smysl zabývat se skriptovacím jazykem AutoIt v tomto fóru?

AutoIt znám a už jsem ho použil.
15
39%
Tohle by se mi opravdu hodilo.
9
24%
Skriptovat neumím, ale zájem mám.
11
29%
Skripty píšu v něčem jiném, tohle mě nezajímá.
1
3%
Absolutně zbytečné téma.
1
3%
Tohle není pro mě.
1
3%
 
Celkem odpovědí : 38

Sekce AutoIt: Ano nebo Ne?

Odeslatod Path » 11.03.11 2:15 (Pá)

Napadlo mě, jestli na path.cz neotevřít sekci, které by se zabývala skriptovacím jazykem AutoIt. Nejde ani tak o nějaké kurzy samotného jazyka, sám nejsem na takové úrovni, abych něco podobného mentoroval a určitě jsou česká fóra přímo na tento nebo podobný jazyk zaměřená, ale jde mi spíš o spojitost se značkou Garmin.

Na druhou stranu, každý sem tam něco potřebuje automatizovat, vypočítat, automaticky zálohovat soubory, vytáhnout hodnoty ze souboru a klidně by si takový skript napsal, jen kdyby věděl jak a kde začít. A určitě lze skriptování využít i na Garminích produktech.

Momentálně mě moc důvodů pro zavedení podobné sekce taky nenapadá (i když všechny programy pro Garminy od path.cz jsou napsané právě v AutoIt).

A co třeba tento příklad fiktivního uživatele:

"Na tomto fóru jsem se dočetl, že mám u nově zakoupené navigace nárok na jednu aktualizaci mapy zdarma, ale maximálně 60 dní od její uvedení do provozu. Ve fóru path.cz jsem členem skupiny Garmin developer, kde jsem našel informaci, jak datum první lokalizace polohy vypočítat v MS Excel. Já ale Excel nemám a na kalkulačce to spočítat neumím."

My ale máme sekci o AutoIt a takový výpočet je pro nás malina. 8o) Profesionální programátoři mi doufám drobné konvenční odchylky odpustí.

Výpočet epochy první lokalizace polohy (FirstFix)

Víme, že tato informace je uložena v souboru GarminDevice.xml v tagu <Ifix>...</Ifix>, respektive tento tag existuje, pokud byl první fix polohy reálně uskutečněn. Vytvoříme tedy jednoduchý soubor s příponou au3 (např. epocha.au3), otevřete ho ve výchozím editoru, vložíme následující kód a stiskneme klávesu F5 (spustit):

autoit Code: Vybrat vše
#Include <Date.au3>
 
; ze souboru GarminDevice.xml: <Ifix>646243273</Ifix>
; Ifix = epocha = počet sekund od data 1.1.1990 00:00:00
Local $iFix = 646243273
 
$datum = _DateAdd('s', $iFix, "1990/01/01 00:00:00"); připočteme epochu
$datum = _DateTimeFormat($datum, 0)     ; formát data
 
ConsoleWrite($datum) ; do konzole vypíše výsledek: 24.6.2010 16:01:13

Poznámka: Pokud na soubor au3 pouze poklepete, automaticky se spustí skript, ale protože vypisujeme výsledek pouze do okna konzole, je potřeba skript spustit přímo v editoru.

Screenshot editoru:
Obrázek

A pokud chceme jednotlivé řádky rozluštit:

autoit Code: Vybrat vše
#Include <Date.au3>

Pomocí #Include vkládáme externí soubor se skriptem, v tomto případě s funkcemi pro práci s datem (_DateAdd, _DateTimeFormat, atp.). Soubor Date.au3 je součástí AutoIt (složka .\AutoIt3\Include\), takže opět bez práce.

Středník ( ; ) slouží pouze pro komentáře, které AutoIt ignoruje - přeskakuje.

autoit Code: Vybrat vše
Local $iFix = 646243273

Do proměnné $iFix (námi definované proměnné začínají znakem $ a obvykle je píšeme malými písmeny) vložíme hodnotu 646243273, kterou jsme zkopírovali ze souboru GarminDevice.xml

Poznámka: Kdo neví co znamená slovo proměnná, pak klepněte zde: google hledat… : co je proměnná.

autoit Code: Vybrat vše
$datum = _DateAdd('s', $iFix, "1990/01/01 00:00:00"); připočteme epochu

Interní funkce _DateAdd umí k definovanému datu připočíst určitou hodnotu.

My víme, že Garmin má počátek epochy, která se počítá v sekundách ke dni 1.1.1990 00:00:00. K počátku epochy tedy touto funkcí přičteme 646243273 sekund 's' a výsledné - nové - datum vložíme do naší proměnné $datum.

Už teď máme hotovo, ale protože proměnná $datum obsahuje nové datum ve formátu RRRR/MM/DD HH:MM:SS, zformátujeme ho do čitelnějšího formátu pomocí funkce _DateTimeFormat(0 = krátké datum):

autoit Code: Vybrat vše
$datum = _DateTimeFormat($datum, 0)

A to je celé. Samozřejmě lze skript obohatit o input box nebo dialogové okno pro načtení souboru GarminDevice.xml a automatické vyparsování (vyčtení) hodnoty tagu Ifix, kompilaci do exe apt.


Jak celý příklad rozběhnout na vašem PC (polopatě)

1) stáhněte a nainstalujte AutoIt - autoit-v3-setup.exe

2) v nějaké složce (třeba i na ploše klepněte pravým tlačítkem myši a zvolte Nový > AutoIt v3 Script

nebo vytvořte textový soubor a příponu txt přejmenujte na au3

3) na vytvořeném souboru klepněte pravým tlačítkem myši a zvolte Edit Script

4) v okně editoru můžete odstranit výchozí komentář (zelený text) a zkopírujte celý skript uvedený výše.

5) pro spuštění vyberte v nástrojové liště Tools > Go nebo stiskněte klávesu F5

Doporučení: Kdo si chce s AutoIt opravdu pohrát, pak mu doporučím instalovat vylepšený editor SciTE4AutoIt3, který toho umí o poznání více než ten co je standardní součástí AutoIt. Na první pohled vypadají stejně.

Zdrojový soubor přikládám...
epocha.rar
Nemáte oprávnění prohlížet přílohy.
Obrázek uživatele
Path
Site Admin
 
Příspěvků: 3406
Registrace: 15.05.07 23:15 (Út)

Re: Sekce AutoIt: Ano nebo Ne?

Odeslatod Path » 31.03.11 23:58 (Čt)

A pro úplnost ještě ukázka, jak se epocha počítá z data, např. pro tento okamžik. Ten by se na mě mohl Garmin mračit, protože z hodnoty epochy uvedené v GarminDevice.xml vyhodnocuje, zda má či nemá uživatel nárok na první aktualizaci zdarma. Nicméně existuje mnoho objektivních důvodů, proč uživatel nemusí 60 denní ochrannou lhůtu vůbec stihnout. Z praxe znám těchto případů několik...

Zde je ukázka výpočtu epochy:
autoit Code: Vybrat vše
#Include <Date.au3>
 
; ### výpočet epochy pro tento okamžik
 
; do proměné $nyni vložíme aktuální datum a čas
$nyni   = _NowCalc()
 
; do proměnné $epocha vložíme rozdíl mezi datumy v sekundách
$epocha = _DateDiff('s',"1990/01/01 00:00:00", $nyni)
 
; výsledek vypíšeme do konzole (_DateTimeFormat pro výchozí formát data)
ConsoleWrite("Epocha pro " & _DateTimeFormat($nyni, 0) & " je: " & $epocha & @lf) ; výsledek
Obrázek uživatele
Path
Site Admin
 
Příspěvků: 3406
Registrace: 15.05.07 23:15 (Út)

Re: Sekce AutoIt: Ano nebo Ne?

Odeslatod Garmin OC Letňany » 01.04.11 19:27 (Pá)

Path napsal:Ve fóru path.cz jsem členem skupiny Garmin developer, kde jsem našel informaci, jak datum první lokalizace polohy vypočítat v MS Excel. Já ale Excel nemám a na kalkulačce to spočítat neumím."[/i]


Hmm.. Excel mám, tabulku jak to v excelu spočítám jsem si před časem udělal taky, ale co mě zajímá je skupina Garmin developer.. Tam člověk může získat členství jak? :o
Standa Bureš - vedoucí prodejny
letnany@garmin.cz
Facebook
Obrázek uživatele
Garmin OC Letňany
VIP
 
Příspěvků: 369
Registrace: 28.07.10 14:52 (St)

Re: Sekce AutoIt: Ano nebo Ne?

Odeslatod Path » 02.04.11 0:06 (So)

Uživatelský panel > Skupiny
Obrázek uživatele
Path
Site Admin
 
Příspěvků: 3406
Registrace: 15.05.07 23:15 (Út)

Re: Sekce AutoIt: Ano nebo Ne?

Odeslatod Path » 02.04.11 1:20 (So)

Do třetice uvedu ještě jeden typ epochy, který kupodivu Garmin nevyužívá a stejně tak ani výrobci třetích stran. Jedná se o Garmin Week, resp. označení týdne s počátkem nula k datu 1.1.2001. Nový GWeek (týden) začíná vždy v pondělí.

Příklad:
GWeek 1 platí pro interval od 2.1.2001 do 8.1.2001
GWeek 2 platí pro interval od 9.1.2001 do 15.1.2001


A k čemu, že je Garmin Week? Využít ho mohou všichni výrobci software (mapy, hlasy, poi atp.) určeného pro produkty Garmin a distribuované s odemykacím klíčem, kde Garmin Week je jedním z jeho atributů. Velice snadno tak výrobce může určit, kdy se např. mapa uživateli v přístroji uzamkne. Využití je celá řada, ať už od testovacích verzí map, map zakoupených pro sezonní akce atp.

Pokud se například výrobce mapy rozhodne, že jeho produkt expiruje k datu 1. září 2011 bude tuto hodnotu muset uvést ještě před generováním odemykacího klíče. Nicméně 1.9.2011 je středa a hodnota Garmin Week se mění pouze v pondělí, takže se stejně výrobce musí rozhodnout, zda produkt expiruje už o dva dny dříve, tj. 29.8.2011 (Po) nebo až o pět dní později, tj. 5.9.2011 (Po). Při volbě 5.9.2011 (poslední funkční den produktu) bude hodnota Garmin Week 557.

Nicméně všichni výrobci uvádějí hodnotu Garmin Week "0", a tím má produkt neomezenou expiraci. Platí to pro 99,9% současných produktů této společnosti.

Pro úplnost ještě uvedu, že Garmin Week nemůže nabývat nekonečné hodnoty. Jedná se o 12-bitové číslo a jeho interval je tedy od 0 do 4095, resp. od 1.1.2001 do 26.6.2079. Určitě jste si všimli, že Garmin bude muset svou licenční politiku dříve či později změnit. Má na to ještě 68 let 8)

Pro potenciální developery uvádím příklad konverze Garmin Week z datumu pomocí AutoIt:
autoit Code: Vybrat vše
#include <Date.au3>
 
Local $day   = 5     ; den
Local $month = 9      ; měsíc
Local $year  = 2011   ; rok
 
; datum převedeme na Garmin Week
Local $iGarminWeek = _GarminWeekFromDate($day,$month,$year)
 
; výsledek vypíšeme do konzole
ConsoleWrite("Garmin Week: " & $iGarminWeek)
 
; funkce vrátí garmin week
Func _GarminWeekFromDate($dd, $mm, $rrrr)
        Local $result  = _DateDiff( 'w',"2000/12/26 00:00:00", $rrrr & "/" & $mm & "/" & $dd & " 00:00:00")
        If $result < 1 Then $result = 0
        Return $result
EndFunc


A ještě reverzní funkci, která vrátí z Garmin Week poslední funkční den nastavené licence:
autoit Code: Vybrat vše
#include <Date.au3>
 
Local $iGarminWeek = 535
 
; výsledek vypíšeme do konzole
ConsoleWrite( _LastWorkingDateFromGarminWeek($iGarminWeek) )
 
; funkce vrátí datum z Garmin Week
Func _LastWorkingDateFromGarminWeek($iWeek)
        Local $date     = _DateAdd('d', $iWeek*7, "2001/01/01")
        Return _DateTimeFormat($date, 0)
EndFunc


V php by konverzní funkce mohly vypadat nějak takto:
php Code: Vybrat vše
/**
* Vrátí poslední funkční den z garmin weeek, kde week č.1 = (2.1.2001 - 8.2.2001).
* garmin week vždy začíná v pondělí
*/
function garmin_last_working_day_from_week($week){
    $date =  mktime(0, 0, 0, 1, 1 + (7*$week), 2001);
    return date("d.n.Y", $date);
}

/**
* Převede den, měsíc, rok na Garmin Week, kde week č.1 = (2.1.2001 - 8.2.2001).
* garmin week vždy začíná v pondělí
*/
function get_garmin_week_from_date($day, $month, $year) {
    
    $dateZero 
= mktime(0, 0, 0, 1, 1, 2001);
    $userDate = mktime(0, 0, 0, $month, $day, $year);
    // zaokrouhlit na celá čísla nahoru
    $gweek = ceil(($userDate - $dateZero) / 604800); 
    if 
($gweek < 0 | $gweek > 4095 ) {
        $gweek = 0;
    }
    return  $gweek;


V Excelu by se Garmin Week počítal zhruba takto:
Code: Vybrat vše
=KDYŽ(ROUNDUP(((datum-36892)/7);0)<0;0;ROUNDUP(((datum-36892)/7);0))
Obrázek uživatele
Path
Site Admin
 
Příspěvků: 3406
Registrace: 15.05.07 23:15 (Út)

Re: Sekce AutoIt: Ano nebo Ne?

Odeslatod Path » 05.04.11 15:34 (Út)

TIP: Věděli jste, že pro AutoIt existuje online kompilátor, který z vašeho skriptu vytvoří exe soubor? Samozřejmě vytvoříme exe jediným kliknutím v PC, kde máme AutoIt nainstalováno, ale tahle lahůdka se může hodit, když jste někde v terénu nebo na cizím PC.

Zkuste si například zkopírovat následující skript a vložit ho do formuláře na této stránce. Pak klepněte na Compile Script a stáhněte si hotový soubor exe.

autoit Code: Vybrat vše
#Include <Date.au3>
 
Local $iFix = InputBox("Zadejte hodnotu iFix", "Hodnota iFix:")
 
If Not StringIsInt($iFix) Then
        MsgBox(8240,"Chyba","Zadali jste neplatnou hodnotu!")
        Exit
EndIf
 
$datum = _DateAdd('s', Int($iFix), "1990/01/01 00:00:00"); připočteme epochu
$datum = _DateTimeFormat($datum, 0)     ; formát data
 
MsgBox(8256,"iFix","Datum a čas první lokalizace družic: " & $datum)
Obrázek uživatele
Path
Site Admin
 
Příspěvků: 3406
Registrace: 15.05.07 23:15 (Út)


Zpět na Garmin: Software

Kdo je online

Online uživatelé v tomto fóru: Brandwatch/Magpie [Bot], CommonCrawl [Bot] a žádný návštěvník.