From kobe
Jump to: navigation, search

Contents

 [hide] 

OnePro   ❖

Aplikace na vzdálené přehrávání medií postavená převážně pro monitory firmy Philips, popřípadě pár vybraných Generic boxů.

Vlasní stránky či externí odkazy[edit]

Komunikace o vývoji[edit]

Ovládání a nastavování OnePro klienta[edit]

Mechanismy OnePro[edit]

Ovládání monitoru[edit]

Odemčení launcheru

HOME+1888+EXIT

Repository[edit]

Repozitář projektu je uložen na BitBucketu

Verze[edit]

Other[edit]

  • pro většinu Philips hardware
  • minSdkVersion: 24
  • poslední verze: 3.4.2

Kitkat[edit]

  • pro staré Sign2 zařízení
  • minSdkVersion: 21
  • zastaveno z důvodu nekompatibility s WS knihovnami
  • poslední verze: 2.7.38 (24.7.2024)

OnePro technology[edit]

Net Connections[edit]

TCP/IP[edit]

Port 20[edit]

Port 21[edit]

Port 80[edit]

Port 443[edit]

Port 8080[edit]

Port 8443[edit]

UDP[edit]

Port 123[edit]

  • NTP time sync - url: north-america.pool.ntp.org
  • NTP time sync - url: pool.ntp.org
  • NTP time sync - url: 37.187.104.44
  • NTP time sync - url: tik.cesnet.cz
  • NTP time sync - url: 195.113.144.201

ICMP[edit]

Na testování spojení s internetem je používán shellovsý ping který komunikuje přímo na úrovni ICMP

Serial number[edit]

Pro smysluplnou komunikaci mezi OnePro klientem a Artemis serverem je potřeba mít jednoznačné seriové číslo. To jak OnePro získává SN je závislé na instalovaném HW a jeho zapojení.

Získání SN[edit]

Podle HW a zapojení

  • HW s SICP lan (Philips) - SICP command [0x15]
  • HW s SICP serial (GBox+Philips) - SICP command [0x15]
  • HW bez SICP (GBox) - záleží na typu a postupně se snaží načíst
    • MBOX (Enjoy) - vytvoří z Mac addressy
    • Pomocí Build.SERIAL
    • Pomocí getprop ro.serialno
    • A nakonec pomocí Android generated
[Collapse]

▼ Routine

	public void readValue() {

		String serial = NS.NAN;

		// In case that device is Mbox -----------------------------------------------------
		// fill LAN Mac Address directly
		if (Device.isMbox()) {
			String mac = Device.getLanMacAddress();
			serial = mac.replace(":", "");
			Log.i(OneproService.TAG, "SN gained from MAC");
			mValue = serial;
/*EX*/		return;
		}

		// Next try will be the old classic way ---------------------------------------------
		// Some Android > 9 block access to this info and return "123456789" or "unknown"
		serial = Build.SERIAL;
		if ((!serial.startsWith("123456789")) && (!serial.equals("unknown"))) {
			Log.i(OneproService.TAG, "SN gained from Device");
			mValue = serial;
/*EX*/		return;
		}

		// Another way is to load directly from disk ----------------------------------------
		// If method failed then return "unknown"
		serial = Device.getSystemPropertySerialNumber();
		if (!serial.equals("unknown")) {
			Log.i(OneproService.TAG, "SN gained via getprop");
			mValue = serial;
/*EX*/		return;
		}

		// The last option is to use Android Security ID ------------------------------------
		// It Will not survive factory reset and new one was generated!
		serial = Device.getDeviceKey(mModel.getContext()).toUpperCase();
		Log.i(OneproService.TAG, "SN gained from Android");

		mValue = serial;
	}

Pokud selžou všechny standardní postupy, tak se vytváří MSN serial number Tak se děje pokud se zařízení nedokáže dobouchat na připojené SICP - 2.6.28

Persistence[edit]

Pro urychlení startu se získané SN ukládají v shared paměti (od verze 2.7.27)

ukládají se tato dvě SN

  • REAL_SERIAL - SN získané z HW
  • FAKE_SERIAL - SN generované jako MSN 2.6.28
Mechanismus[edit]

po startu aplikace

  • Zjistí zda není už uloženo REAL_SERIAL
    • pokud ANO ✔
      • pošle se do Worker rutiny
      • (EXIT)
    • pokud NE ✗
      • (CONTINUE)
  • Pokusí se z HW získat REAL_SERIAL
    • pokud ANO ✔
      • pošle se do Worker rutiny
      • uloží se pro příští použití
      • (EXIT)
    • pokud NE ✗
      • (REPEAT) - nekonečný počet pokusů

Scenario[edit]

Scénářem se myslí instrukce přicházející ze serveru, nesoucí veškeré instrukce co, jak a kdy přehrávat.

Fake scenario[edit]

Pro možnost testování nových vlastností existuje možnost jak podvrhnout odpověď ze serveru. Dělá se to tak, že se do datového adresáře OnePro se umístí soubor plan.json. Pokud OnePro nalezne tento soubor na disku, tak použije tyto data a ignoruje odpověd na volání ze serveru.

/sdcard/artemis/plan.json


Screen on/off[edit]

V cyklu 1 minuty je provázena kontrola, zda existuje nějaký aktivní playlist. Pokud je služba povolená tak se podle potřeby zapíná a vypíná monitor. V případě že je detekované SICP rozhraní, tak se vypíná přes SICP, pokud ne, tak se volá klávesa KEYCODE_POWER, která u Androidu uspává/probouzí zařízení.

Source on Bitbucket: Worker.actionScreenLock()

Defaultně je tato volba vypnutá, zapnout se dá v

Settings > Screen always on when playlist active

Simulace[edit]

Na Gbox zařízeních se dá vyzkoušet funkce screen ON/OFF pomocí

adb shell input keyevent 26

Požadavek ze serveru[edit]

Pomocí serveru se dá v sekci nařídit zapnutí vypnutí/zapnutí monitoru.

Admin > Screens > Settings > Screen ON/OFF request

V tom případě by měli být ostatní logiky ohledně playlistů zablokovány. Proto je teď ve třídě proměnná mTurnByLock ta detekuje, kdo naposled vypnul obrazovku. Zda Lock rutina nebo uživatel na serveru. Z toho vyplývá:

  • Pokud jednou uživatel ze serveru zasáhne do zapnutí/vypnutí monitoru, je logika ohledně detekce plalistu vypnutá až do dalšího rebootu.
  • Logika je volba Screen always on when playlist active je vypnutá, je logika ohledně detekce playlistu vypnutá trvale.

Commit on Bitbucket: c2796f

Screenshot[edit]

  • Je spoštěný na začátku každého playlistu (způsobuje nestabilitu)
  • Je inicializovaný uživatelem přes server Artemis podle WS implementace
    • Bez WS je periodicky volané volání GET api/devices/requested_actions?device_sn=:device_sn
    • S WS se přijímá instrukce okamžitě a pouze jednou
  • Pokud je požadovaný screenshot, příjde na volání instrukce screenshot
  • Pokud není zařízení registrovné na serveru, ja zachycování screenshotu blokované
  • Samotné zachytávání provádí třída/metoda Screen.takeScreenshot()
  • Uvnitř metody je smyčka se sleep 1000, kde se čeká na screenshot uložený na disku
  • Maximální počet pokusů je 16
  • Zachytávání obrázku se provádí podle typu zařízení:
    • Philips - pomocí intentu php.intent.action.TAKE_SCREENSHOT
    • gBox - pomocí adb /system/bin/screencap -p /sdcard/artemis/screen-full.jpg
  • Tato metoda není napsaná asynchronně, takže blokuje další běh mainthread
  • Metoda provádí downscale na velikost 427x240px
  • Obrázek se převádí do formátu jpeg s kompresí 90, bos
  • Metoda dále obrázek konertuje pomocí base64
  • Odesílá se na server přes volání upload_screenshot
  • Data se posílají jako součást JSON dat

Kiosk mode[edit]

Umožňuje spustit definovaný trigger dotykem na obrazovku.

  • Trigger se definuje pomocí volby number of trigger which starts a kiosk playlist
  • Dobu zobrazení kiosku určuje čas playlistu přiřazený danému triggeru
  • V případě zobrazení kioskového Triggeru se dalším dotykem prodlouží doba zobrazení o definovaný čas triggeru
  • Pokud v daném času nedojde k dotyku, vrací se OnePro spátky do základního scénáře

Scheduled Playlist[edit]

Akce která se může přiřadit událostem, která způsobí uzavření aktuálního Triggeru a návrat na regulérní scénář.

Příklad - zákazník opustil sledovanou oblast a senzor tuto událost zachytil. Další běh upoutávkového videa na super duper produkt již není třeba a může se pustit standardní scénář.

Pic Overlay[edit]

Pohybový senzor detekuje pohyb v blískosti zařízení a v tom případě se nad přehrávaným obsahem zobrazí PNG obrázek s alfa kanálem většinou button a navádí kolemjdoucího aby na obrazovku kliknul a dozvěděl se více

Zadání[edit]

  • Na trigger se má zobrazit button
  • Po kliknutí na obrazovku se musí button schovat
  • Následně se emituje další trigger
  • Tento trigger spoští interaktivní html/web obsah
  • Po dobu zobrazení interaktivního obsahu je další zobrazení buttonu potlačeno

Princip[edit]

Jedná se o paralerní zobrazení contentu, režim FORE přes content běžící na pozadí v režimu BACK. Využívá se zobrazení souboru png

OnePro když zjistí že má na disku uložený soubor, tak místo standardního černobílého buttonu zobrazí uložený PNG.

/sdcard/artemis/overlay-button.png

Nastavení[edit]

Pro použití jsou definované tyto options

  • Timeout of overlay button

Distribuce[edit]

Neboli nastavení na serveru. Distribuuje se spolu s definicí neutral monitoru.

Dashboard > Nastavení > Palylisty a nastavení > základní nastavení > Defaultní obrázek

Musí se použít playlist typu Photos který obsahuje alespoň jeden png obrázek.

Pokud se definice neutralu dostane na OnePro, spustí se rutina copyNeutralFile(), která se snaží ze zaslaného plalistu vyoperovat první PNG který nalezne a ten pak překopíruje na disk jako overlay-button.jpg.

Tato akce se provádí v případě že je detekován nový scénář.

Ze serveru by měla přijít definice v novém plánu. Hash odkazuje na prezentaci typu Editor prezentace (presentation)

    {
       "url": "/offline/725c2708242d62820558752096b5636f.zip",
       "name": "725c2708242d62820558752096b5636f.zip",
       "crc": 3126385033,
       "hash": "725c2708242d62820558752096b5636f",
       "type": "presentation",
       "duration": 10,
       "id": 318
    }
    ...
    "neutral" : {
        "hash": "3ebe2a62c357081b1f8f7157b9e4e83f"
    },

Volba musí být povolená administrátorem.

Trigger commands[edit]

Samotná implementace a princip použití hardware a ovladačů je shrnutá zde

Doplněná funkcionalita umožňuje přiřadit každému Triggeru, Pic Overlay či Scheduled Playlist command který se vyemituje v čase přijmutí signálu spouštějící trigger.

Definice[edit]

Commandy se definují na stránce trigger management. Musí se klikat na button view mode dokud se neobjeví list s popiskem assign command. Po výběru příslušného triggeru pomocí select trigger se přes button edit command dají vkládat sekvence commandu. Nová definice přepisuje tu starou. Editační pole se musí opustit příkazem enter na klávesnici jinak někdy nedojde k zápisu.

Pozor! - V OnePro je možné uložit pouze jednu definici commandu per trigger

Adresace[edit]

Uložené commandy jsou rozesílané na všechny připojené řadiče. Pokud by to dělalo problémy, dá se specifikovat Serial Number řadiče. Delimitrem mezi SN a commandy je znak #

CLA3b106315#G005B[A 1 100 5]

V konfiguračním souboru prolific-settings.txt lze uvést i obecný příkaz, který způsobí substituci připojeného Nexmo řadiče - místo Upload FEDSb106315 lze zadat Upload hub_SN Licencování oproti serveru bude zachováno.

Kumulace[edit]

Pokud by bylo potřeba posílat vícero příkazů na jedno připojené zařízení, musí se commandy oddělit delimitrem ,

CLA3b106315#G005B[A 1 100 5],G005B[B 1 100 5]

Licensing[edit]

Z politicko-obchodních důvodů se od verze 2.10.6 bodou kontrlovat Sériová čísla připojených řadičů a obsluhovat se budou pouze ta, která mají licensi.

Orders[edit]

Implementováno v 2.7.25

Součást topologie Master/Slaves kdy jedno zařízení s OnePro kontroluje sadu vedlejších zařízení pomocí triggerů posílaných po síti.

Logika[edit]

Na každý playlist je možno namapovat přes jeho hash sadu operací

  • trigger on start
  • trigger on stop
  • command on start
  • command on stop

Komunikace[edit]

Požadované orders přicházejí jako nové položky JSON při volání get_plan

Při spuštění klienta 2.7.25 není funkce ještě serverem podporována

Pro testování je potřeba podvrhnout plan.json

"orders" : [
	    {
		    "hash": "7f63ba8b-2cd8-4b87-b2fa-2da928a206ab",
		    "name": "Central jedna",
		    "emits_on": [
			    {
				    "ip" : "192.168.0.190",
				    "trigger": "trigger1"
			    },
			    {
				    "ip" : "192.168.0.148",
				    "trigger": "trigger2"
			    }
		    ],
		    "emits_off": [],
		    "commands_on": [
			    {
				    "command" : "G005B[A 3 100 0]"
			    }
		    ],
		    "commands_off": []
	    }
],

Persistence[edit]

Pro odery byla vytvořena nová tabulka orders, kde jsou příkay ukládány.

    public static final String CREATE_ORDERS =
            "CREATE TABLE " + TABLE_ORDERS + " ( " +
                    TO__ID   + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                    TO_HASH  + " TEXT, " +
                    TO_NAME  + " TEXT, " +
                    TO_TYPE  + " INTEGER DEFAULT 0, " +
                    TO_ADDRESS + " TEXT, " +
                    TO_ACTION + " TEXT)" ;

Implementace[edit]

Nově implementované orders jsou načítány a ukládány jako součást datových schránek ShowKeeper a jsou tak kdykoliv k dispozici.

V případě přehrávání plalistu v rámci aktivity ActivityBoardShow jsou pak tyto ordery ošetřeny voláním metod:

		// Send triggers to OnePro slaves in net
		sendTrigger(sk, OrderKeeper.EMIT_ON);

		// Send commands on connected Prolific drivers
		sendCommand(sk, OrderKeeper.COMM_ON);

Ovládání[edit]

Definice orders je řízeno pouze serverem a lokálně je měnit nelze. Pouze se dá prohlédnou aktuálně nastavené orders na stránce Triggers settings v podstránce orders.

Neutral monitor[edit]

Jedná se o obrazovku, která se zobrazuje v případě že není aktivní žádný playlitst.

Princip[edit]

OnePro když zjistí že má na disku uložený soubor, tak místo standardně šedé plochy zobrazí uložené JPG.

/sdcard/artemis/neutral.jpg

Soubor se dá na disk uložit ručně nebo poslat přes server.

Distribuce[edit]

Neboli nastavení na serveru

Dashboard > Nastavení > Palylisty a nastavení > základní nastavení > Defaultní obrázek

Musí se použít playlist typu Photos který obsahuje alespoň jeden jpg obrázek.

Pokud se definice neutralu dostane na OnePro, spustí se rutina copyNeutralFile(), která se snaží ze zaslaného plalistu vyoperovat první JPG který nalezne a ten pak překopíruje na disk jako neutral.jpg.

Tato akce se provádí v případě že je detekován nový scénář.

Ze serveru by měla přijít definice v novém plánu. Hash odkazuje na prezentaci typu Editor prezentace (presentation)

    {
       "url": "/offline/725c2708242d62820558752096b5636f.zip",
       "name": "725c2708242d62820558752096b5636f.zip",
       "crc": 3126385033,
       "hash": "725c2708242d62820558752096b5636f",
       "type": "presentation",
       "duration": 10,
       "id": 318
    }
    ...
    "neutral" : {
        "hash": "3ebe2a62c357081b1f8f7157b9e4e83f"
    },

Volba musí být povolená administrátorem.

Master playlist[edit]

V Artemisu zmiňovaný jako Priority playlist. Dokument k implementaci uložen zde. Master playlist využívá už implementovanou funkci triggerů a v určitý čas pouští trigger daného listu. Playlist může mít i vícero definovaných časů. Nelze definovat dny, kdy se má master pouštět.

Pro implemenaci se definují Androidí Alarmy se všemy nedostatky, který alarmy v novějších verzích mají.

Definice v plan

    "masters": [
        {
            "id": "master5",
            "name": "master-mix-video-food-03",
            "hash": "6a8501701549c9be633ed99b685116eb",
            "times": [960, 1020]
        }
    ]

Aby master byl spustitelný, musí mít soubor definovaný pomocí hash v sekci files

Implementace[edit]

Alarmy se pro mastery definují buď po startu nebo po načtení nového plánu a to pomcí metody masterAlarmsActivate()

White/Black screen detection[edit]

Při dlouhodobějšímu přehrávání HTML obsahu dochází občas k uvíznutí v bílé obrazovce.

V intervalu minut je prováděná kontrola monitoru pomocí unverzálního balíku Voyeur. V případě detekce závadné obrazovky je uživately poslán email přes správně nastavený Launcher.

Recovery[edit]

Recovery zavedená ve verzi 2.4.7 se realizuje pomocí volání intentu com.philips.artemis.onepro.PLAYLIST_RESTART který je volán i rutinou při serverovém volání requested_action

JS check[edit]

Stejně jako u aplikace FerrBuckk se dá předpokládat, že se jedná o zaseknutí integrovaného JS a tím přerušení promítání obsahu. Řešením by mohlo být kontrolní volání z Androidu do JS, které by v případě žádné odezvy vyvolalo restart obsahu.

Žádoucí by bylo také o události informovat klienta pomocí emailu.

Jedna z možností je volat funkci ko.version která je přítomna ve všech HTML base playlistech. Když je JS funkční vrací String ve tvar "n.n.n".

comm = "( function() { return ko.version; } ) ()";

Nerealizováno

GIT support[edit]

Aplikovaný pro zákazníky, kteří si přejí četřit na mobilních datech. Vytvořena nová kategorie GIT která stahuje obsah playlistu z GIT repozitáře.

komponenty[edit]

Pro provoz GITu jsou nezbytné tyto komponenty

    implementation(name:'ajgit-lib-release', ext:'aar')
    implementation 'com.jcraft:jsch:0.1.50'
    implementation 'com.googlecode.javaewah:JavaEWAH:0.7.9'
    implementation 'org.slf4j:slf4j-log4j12:1.7.2'

knihovny jsou použíté ve třídách

Asynchronní operace jsou ošetřovány pomocí rozhraní

Net Check[edit]

Interní kontrola wlan0 inodu na linuxové úrovni. Pokud se inod nenalezne, uvozuje se z toho nefunkční internetové spojení a provede se reboot v doufání, že síť naskočí. Počet těchto rebootů je limitován maximálně na 3 pokusy, pak až do dalšího ručního nebo jiného rebootu se už rebooty neprovádí. Tato max hodnota se dá v settings změnit.

Detekce se provádí pomocí shell příkazu

ifconfig wlan0

Jako indikátor nefunkční sítě se považuje chybový výstup No such device

Last Server[edit]

Občas se stane, že Artemis server přestane reagovat. To znamená, že nechodí callBack onRespose() ani onError(). Proto si OnePro od verze 2.7.16 ukládá čas posledního calbacku ze serveru.

Tento čas je pak vyhodnocován pomocí Cyclonu LAST_SERVER a v případě že komunikace nenaskočí do několika pokusů, tak OnePro pošle na adresu [1] krátké info o této události.

Smysl to má pouze v případě, že server nestíhá a vypadává komunikace.

DOM injection[edit]

V případě, že plalist typu website je chráněn loginem, může se OnePro pokusit provést automatické přihlášení pomocí DOM injection. Funguje to ale jen na slabě zabezpečených stránkách.

Podporováno od verze 2.7.28.5

Head parsing[edit]

Zatím neaplikovaná vlastnost

V případě scénáře typu webSite One parsuje metatagy umístěné v hlavičce a pátrá o dodatečných direktivách. Účelem aplikace bylo obládat světla po boku Philips monitoru pomocí SICP funkce.

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta id="SICP" name="color" content="red">
    <title>Red Page</title>
    ...
</head>

O parsování se stará metoda makeHead() ve třídě RiderWebCore

Na strabě stránky je k získání metatagů pouště JavaScript assets/parse_head.js

(function() {
    var metas = document.getElementsByTagName('meta');
    var metaInfo = [];

    for (var i = 0; i < metas.length; i++) {
        metaInfo.push({name: metas[i].name, id: metas[i].id, content: metas[i].content});
    }

    return "parse_head=" + JSON.stringify(metaInfo);
})
();

Podporováno od verze 2.7.28.13

Premium options[edit]

Podporované od verze 2.8.15

Jedná se otechnologii, kdy některé vlastnosti jsou zapínané ze serveru. To umožní management premium customer

Proměnné které zapínají premium vlastnosti jsou normálně registrované EL elementy, jen je není možné zapnout na klientovy přes UI

Podporované parametry[edit]

  • ENABLE_RLOG_EXPORT - Enable export runtime log to the server
  • ENABLE_AUTOSCR - Enable export runtime log to the server
  • ENABLE_WEBSOCKET - Enable WebSocket connection

Ladění[edit]

Pokud je to podporováno devel verzí, dá se premium parametr zapnout pomocí ADB

adb shell am broadcast -a com.philips.artemis.onepro.CHANGE_BOL_PARAM --es "name" "ENABLE_RLOG_EXPORT" --es author "adb" --ez "value" true
adb shell am broadcast -a com.philips.artemis.onepro.CHANGE_BOL_PARAM --es "name" "ENABLE_AUTOSCR" --es author "adb" --ez "value" false
adb shell am broadcast -a com.philips.artemis.onepro.CHANGE_BOL_PARAM --es "name" "ENABLE_WEBSOCKET" --es author "adb" --ez "value" false

Tato možnost je časově omezená

Nastavení časového omezení je statické v každé verzi ve třídě NS

public static final long DEV_DEDLINE = 1738309389000l;   // 20 days

V DEVEL verzích jsou nastavení chráněna před přepsání ze serveru z důvodu ladění. Tato ochrana je platná až do restartu aplikace!

EDP support[edit]

Podpora zařízení s Einkem

Přibyla nová volba

Settings > Projection options > interface for E-ink module

Pukud je zahrnutá volba Philips tak se nepoužívají klasické RiderHtml* ale extra rider RiderEpdCore

Ten provádí:

  • parsuje soubor index.html a zjišťuje
    • zahrnuté obrázky a jejich název
    • časování mezi obrázky
  • zvolí správný subdriver (zatím jen Philips)
  • podle zjištěného časování posílá obrázky na EPD zařízení
  • na standardním displeji zobrazuje informace o posílaných obrázcích

Pokud je časování menší než 120sec, nastaví se na 120sec

Podporované jsou pouze plalisty typu Photos

Subdriver Philips[edit]

Připojuje přes AIDL spuštěnou servisu IEPDAidlInterface. Z tohoto inteface zatím používá volání:

  • registerCallback()
  • setLedOff()
  • setLedOn()
  • sendImage()

Parsování obrázku PDA service trvá cca 62sec, po tuto dobu je posílání uzamčeno

Podmínky přehrávání[edit]

Aby prezentace na modelech s E-inkem se přhrávaly korektně je potřeba splnit tyto požadavky

  • Do scénáře se musí umisťovat jen playlisty typu photos
  • Časové prodlevy mezi obrázky musí bý větší nebo rovny 120 sekundám
  • Obrázky vložené do playlistu musí mít stejné rozlišení a orientaci jako použitý EDP panel

Slim support[edit]

Pro lepší ovladatelnost na SLIM panelech byl v experimentálním branchi dev-slim napsaná detekce rozměru panelu a podle toho se volí upravený layout s komponentou ScrollView. Jedná se o verzi 2.10.19.1 z 10.7.2025

Player config[edit]

Nová možnost nastavovat některé parametry OnePro přímo ze serveru. Požadavek včetěně výčetu parametrů vyšel od p. Krejzlíka a pro jeho realizaci byla vytvořena tabulka s pdorbnostmi ohledně obsluhovaných parametrů. Tato tabulka je dostupná zde

Jak to funguje

  • Data přicházejí jako object JSONu player_config při volání get_plan
  • Pokud není na serveru přiřazen configurační set - objek vůbec nechodí
  • Pokud příjde, je porovnán zda se v něčem liší od posledně zaslaného
  • Pokud ano - pošle se na další zpracování
  • Tato procedura je z důvodu zamezení opakovaného zápisu parametrů a tím navázaných rutin

Související nastavení

Settins > Devel > Don't allow Artemis server to overwrite local settings
Setings > Devel > detailed logging about setting parameters

Remote control[edit]

Pro zařízení, která mají atipicky display a tak funkční zobrazení OnePro UI je neproveditelné, slouží vzálené ovládání pomocí lokální IP adresy. Je potřeba znát buď IP adresu zařízení nebo pomocí telefonu naskenovat QR kód na úvodní obrazovce.

Aby vše fungovalo, musí být:

Adresa má podobu: http://192.168.1.175:8080/menu

Pro lepší zobrazení na PC se může upřesnit: http://192.168.1.175:8080?device=pc

Pozor - server neběží pod protokolem https. Na lokální síti to ani nemá smysl

Logování[edit]

OnePro podporuje několik druhů logování

Logování přehrávání[edit]

Pro účely účtování reklamy se v OnePro kolektují přehledy o přehraných playlistech

Persistence[edit]

Data se persistují v tabulce plays - (nejsou uvedeny všechny sloupce)

  • token - token scénáře přidělený serverem (869c3063a7bdeafe9e76feadb41f5bb8)
  • id - id playlistu přidělené serverem (315)
  • doe - Day Of Epoch (19333)

Export[edit]

V intervalu 10 minut se z toho udělá výcuc a posílá na Artemis server v podobě

  • token - token scénáře přidělený serverem (869c3063a7bdeafe9e76feadb41f5bb8)
  • id - id playlistu přidělené serverem (315)
  • count - počet přehrání v daném intervalu
  • date - Datum ve formátu yyyy-MM-dd

Log se na server posílá přes volání

POST api/devices/log?device_sn=:device_sn

Detailed log[edit]

Pro podrobnější sledování je ve verzi 2.4.32 doplněna funkce ukládání podrobných logů na disk a jejich archivace

  • Defaultně je volba archivace vypnutá

Persistence[edit]

  • Používají se stejná data jako využívá standardní logování přehrávání
  • Data se čerpají z tabulky plays (z dodaných sloupců time, long)

Export[edit]

  • Archivace se pouští 4 minuty po startu aplikace
  • Logy se archivují do adresáře /sdcard/artemis/plays
  • Ukládají se dva soubory plays a events
  • Ukládá se jen jeden soubor (od verze 3.0.19.5)
  • Formát souborů je yyyy-MM-dd_*_log.csv
  • do souboru events se ukládají všechny záznamy z databáze
  • do souboru plays se ukládají pouze záznamy s délkou přehrání větší než je nastaveno
  • Archivní CSV má podobu 09:01:17;stable-02-machine;25.0 (čas spuštění; název playlist; čas promítání v sec)
  • Jeden soubor logu obsahuje jeden den přehrávání
  • Z důvodu bezpečnosti se počet archivovaných souborů udržuje na nastaveném počtu
  • Defaultně je počet udržovaných souborů nastavených na 90
  • Po archivaci se příslušné řádky v databázi označí jako save=1
  • V databázi jsou exportované řádky drženy určený počet dnů
  • Defaultní hodnota pro držení řádků je 7 - zatím není v settings
  • Od verze 3.0.19.5 byla doplněna možnost posílání e-mailem
  • Musí být nainstalovaný launcher > 3.5.2

Související nastavení[edit]

Settings > logging options > detailed playback log > store detailed playback log
Settings > logging options > detailed playback log > export archive via email
Settings > logging options > detailed playback log > avoid playback records in log shorter then (ms)
Settings > logging options > detailed playback log > delete playback records ...
Settings > logging options > detailed playback log > run and create detailed ...

Určení dne[edit]

Pro úspěšné a srozumitelné archivování bylo do verze 2.10.17 přidané archivování podle Local DOE

Spouštěče[edit]

K spouštění archivace se používá cyclon

    mCyc_ArchivePlays = new Cyclon(this, Cyclon.TypeOfCyclon.DAILY, 4, 6, 0, getActionIntent(Worker.ARCHIVE_OLDER));

K mazání starých řádků a starých archivů se používá cyclon

    mCyc_DeletePlays = new Cyclon(this, Cyclon.TypeOfCyclon.DAILY, 10, 6, 0, getActionIntent(Worker.DELETE_PLAYS));

Logování událostí[edit]

Log vznikl pro potřeby ladění událostí vzniklých na senzorech Prolific

Ukládá pouze události spojené se zachycením událostí na senzorech a tím navázené triggery. Logování je posíláno do třídy EventHandler a tam podle nastavení je log posílán buď na obrazovku přes intent ACTION_TOAST nebo se ukládá do tabulky TABLE_EVENTS

  • Volba je zatím defaultně vypnutá
  • O vkládání se stará třída EventHandler
  • Záznamy jsou označnené typem, pro případ filtrování.
    • type 1 - Přijaté code spouštějící triggery
    • type 2 - Přijaté code které nemá přířazený trigger (musí být povoleno)
    • type 3 - Emitované comm pro připojené periferie
    • type 5 - Spuštěné triggery na základě code
    • type 6 - Spuštěné triggery na příkaz po síti
    • type 7 - Emitivané triggery po síti na jiné klienty
    • type 9 - Logy o běhu emitované aplikací

Persistence[edit]

Data se ukládají do tabulky events

  • _id - int - Table unique ID
  • type - int - Type of category
  • event - str - Event
  • time - long - exact time of event start in epoch ms

Související nastavení[edit]

Settings > logging options > trigger event logging onot disc > enable event logging
Settings > logging options > trigger event logging onot disc > log even unassigned codes
Settings > logging options > trigger event logging onot disc > log even NOISE events
Settings > logging options > trigger event logging onot disc > maximal amount of stored events
Settings > logging options > trigger event logging onot disc > export method
Settings > logging options > trigger event logging onot disc > interval of export running (hours)
Settings > logging options > trigger event logging onot disc > url of export server
Settings > logging options > trigger event logging onot disc > run export
Settings > logging options > trigger event logging onot disc > show statistic about event log

Archivace[edit]

  • Neprovádí se žádná archivace do souborů na disk

Export na server[edit]

  • Záznamy s tabulky se exportují na server
  • Akce je poušěná každých 30 minut
  • Prozatímní řešení je ukládání na devel serveru
  • Adresa je http://devel.framexx.com/philips/save_log.php?sn=ABCD
  • sn je seriové číslo OnePro klienta
  • Samotná data se sposílají jako post body
[Collapse]

Exportovaný CSV soubor jmá takovouto podobu

26-01-13;08:04:45;2;CGBTb106315;STOCK5
26-01-13;08:04:46;1;CGBTb106315;NORMAL
26-01-13;08:04:46;5;trigger3;---
26-01-13;08:04:56;2;CGBTb106315;PICKUP5
26-01-13;08:04:56;1;CGBTb106315;MIN
26-01-13;08:04:56;5;trigger1;---
26-01-13;08:05:10;2;CGBTb106315;STOCK5

Export pomocí pošty[edit]

  • Implementováno ve verzi 3.0.19
  • Místo posílání na server se data posílají pomocí pošty
  • Musí být nainstalovaný launcher > 3.5.2

Spouštěče[edit]

A pouštění exportu se stará cyclon

mCyc_SendEventLog = new Cyclon(this, Cyclon.TypeOfCyclon.MODAL, 30, 9, 0, getActionIntent(Worker.SEND_EVENT_LOG));

Čtení a analýza[edit]

Z tohoto serveru se dají stáhnout pomocí linku

Logování na lokální server[edit]

Vzniklo na požadavek p. Krejzlíka aby si zákazníci mohli detailněji analyzovat běh OnePro

Nastavení se nachází ve složce a dá se taky nastavit vzdáleně

Settins > logging options > logging onto local server

Logování triggerů[edit]

Funkce splňuje požadavek klientů na okamžité odesílání triggerů na server. Tato struktura je odlišná od even/play logování a nepřebírá žádné nastavení (např. se neaplikuje treshold na šum). Na serveru musí existovat modul, který je schopen tato data přijímat.

Související nastavení[edit]

Settings > logging options > logging onto local server > enable trigger logging (tlog)
Settings > logging options > logging onto local server > tlog url

Export na server[edit]

Při spuštění a ukončení triggeru se vytvoří JSON, který se posílá na nastvený server

{
  "date": 1754477817926,
  "event": "start",
  "trigger": "trigger1",
  "name": "jmeno_playlistu_az_jej_bude_posilat_server",
  "time": 2500
}
  • time u eventu start představuje nastavený čas v ms
  • time u eventu end reálný čas přehrávání v ms (občas je trigger utnut)
  • date představuje timestamp události v UTC

Čtení a analýza[edit]

Ukládaná data je možně si prohlédnout v adresáři (jen v devel verzi)

Logování přehrávání[edit]

Nová vlastnost přidaná na požadavek p.Krejzlíka ve verzi 3.4.32

Po každém přehrání je poslán na určenou adresu JSON obsahující data o přehrání:

[Collapse]

▼ data

{  "start":1791629810869,
   "hash":"12826b00-bb33-4f85-a780-81bafe48791f",
   "name":"Rapsberries",
   "type":"VIDEO",
   "duration":16506 }

Související nastavení[edit]

Settings > logging options > logging onto local server > enable playback logging (plog)
Settings > logging options > logging onto local server > plog url

Testování[edit]

Pro účely testování je možné posílat data na adresu:

Pro stejné účely je možné si poslaná data prohlížet na adrese:

Je potřeba ručně doplnit validní SN

Logování Runtime[edit]

Runtime log je implementován už od počátku aplikace. Jeho úkolem je ukládat hlavní události běhu aplikace většinou pro aktuální analýzu chování.

O jeho iplementaci se stará třída com.philips.artemis.nomad.log.LogHandler

Od verze 2.8.1 se některé logy zasílají také na Artemis server

"interval of system info from trigger (sec)" určuje jak dlouho je viditelný tost na obrazovce (jestliže je "show toast with runtime info" povolený)

Watchdog log[edit]

Sleduje komunikaci OnePro se serverem a v případě výpadku spojení zaloguje na fixně danou adresu tuto událost. Bylo napsáno pro účely hledání chyby při selhávání WiFi interace. Asi se jedná o už nepoužívaný relikt.

Dodatečné poznámky[edit]

Aktuální popis (5/12/2025) - trigger even logging onto local server

  • zabezpečuje vytváření trigger logu. V tomto dialogu se definuje cíl kam se jednorázově odešle - buď na server nebo jako příloha mailu (na adresy v Launcher/Watchdog).
  • Došlý email - Even log - obsahue prilohu event_log.csv, ktery obsahuje pouze udaje o aktivovanych triggerech - viz
13:24:54;1;FEDSb106315#MIN
13:24:54;5;trigger4
13:24:56;1;FEDSb106315#MIN
13:24:56;5;trigger4
  • Tento seznam je nutné ručně aktivovat (run export), nedochází k automatickému odesílání souboru

- detailed play log

  • umožňuje automatické vytváření logu událostí kolem triggerů. Pro automatizované odesílání (1x denně) mailu s přílohou "today_plays_log.csv" je třeba povolit "export archive via email". Soubor obsahuje nasledující udaje >
25-12-05_08:49:05;Redb - pickup;8.8
25-12-05_08:53:32;Redb - background;238.0
25-12-05_08:57:30;Redb - background;1075.0
25-12-05_10:09:30;Redb - background;12.7
25-12-05_10:09:43;Redb - refill;1.3

"run and create detailed log for today" provede okamžité odeslání tohoto logu, dojde k vyprázdnění db (takže log, který se automatizovaně vytvoří následující den, tato exportovaná data již neobsahuje).

Vnitřnosti[edit]

Database[edit]

Dlouhodobá persistence v aplikaci OnePro je řešená pomocí vnitřní databáze SQLite

Založené tabulky[edit]

udržuje údaje o

  • groups - skupiny playlistů, časové určení
  • shows - jednotlivé playlisty, name, denní rozvrhy, délka
  • files - jednotlivé soubory, umístění, hash
  • triggers - playlisty spouštěné na události
  • masters - playlisty spouštěné v určitý čas
  • impulses - odchytávané kódy pro triggery, emitace commandů
  • orders - emitace triggerů, commandů k určitému playlistu
  • mounds - obsahuje velikost souborů a údaje expiraci - důvod mazání starých plalistů
  • times - persistované schedullery
  • plays - logování přehrání plalistů pro přeúčtování
  • logs - runtime log záznamy
  • events - event log záznamy

Clock actions[edit]

Aplikace OnePro obsahuje rutinu pro pravidelné volání potřebných událostí. Jedná se o velice hrubý ale nenáročný nástroj, který používá násobnky základního 5 sekundového iniciátoru. Pro vyhodnocení zda je na požadovanou akci správný čas se vyhodnocuje každým cyklem a používá se k tomu třída

Cyclony jsou definované v hlavni servise a volají se hned po startu

private void initiateCyclons() {
	// gap(min), ofset(beats), start(ignore beats)
	mCyc_NetCheck = new Cyclon(this, Cyclon.TypeOfCyclon.EXACT, 9, 0, getActionIntent(Worker.NET_CHECK));
	mCyc_GitCheck = new Cyclon(this, Cyclon.TypeOfCyclon.MODAL, NS.GIT_CHECK_INT, 7, getActionIntent(Worker.GIT_CHECK));
	mCyc_SendLog = new Cyclon(this, Cyclon.TypeOfCyclon.MODAL, 10, 8, 0, getActionIntent(Worker.SEND_LOG));
	mCyc_SicpParams = new Cyclon(this, Cyclon.TypeOfCyclon.MODAL, 10, 9, getActionIntent(Worker.UPDATE_DEVICE));
	mCyc_CheckPlan = new Cyclon(this, Cyclon.TypeOfCyclon.MODAL, 5, 11, getActionIntent(Worker.CHECK_PLAN));
	mCyc_CheckIntegrity = new Cyclon(this, Cyclon.TypeOfCyclon.EXACT, 30, 0, 0, getActionIntent(Worker.CHECK_INTEGRITY));
	mCyc_ApkVersion = new Cyclon(this, Cyclon.TypeOfCyclon.WEEKLY, 10, 1, 0, getActionIntent(Worker.APK_VERSION));
	mCyc_DeleteOld = new Cyclon(this, Cyclon.TypeOfCyclon.DAILY, 5, 5, 0, getActionIntent(Worker.DELETE_OLD));
	mCyc_SyncTime = new Cyclon(this, Cyclon.TypeOfCyclon.HOURLY, 5, 7, 0, getActionIntent(Worker.SYNC_TIME));
	mCyc_ArchiveOlder = new Cyclon(this, Cyclon.TypeOfCyclon.DAILY, 4, 6, 0, getActionIntent(Worker.ARCHIVE_OLDER));
	mCyc_GuiCheck = new Cyclon(this, Cyclon.TypeOfCyclon.MODAL, 5, 13, getActionIntent(Worker.GUI_CHECK));
	mCyc_DeletePlays = new Cyclon(this, Cyclon.TypeOfCyclon.DAILY, 10, 6, 0, getActionIntent(Worker.DELETE_PLAYS));
	mCyc_SpeedTest = new Cyclon(this, Cyclon.TypeOfCyclon.QUARTELY, 15, 3, 0, getActionIntent(Worker.SPEED_TEST));
	mCyc_ScreenLock = new Cyclon(this, Cyclon.TypeOfCyclon.MODAL, 1, 1, getActionIntent(Worker.SCREEN_LOCK));
	mCyc_CheckConnection = new Cyclon(this, Cyclon.TypeOfCyclon.MODAL, 20, 15, getActionIntent(Worker.CHECK_CONNECTION));}

POZOR Při vyhodnocení se vždy vybere první který je spustitelný a ostatní se ignorují. Proto je nutné udržovat správné pořadí - od nejvzácnějších po ty nejčastější.

Komunikace se serverem[edit]

RestApi[edit]

API Server <> Klient

  • Základní datová komunikace
  • Založeno (bohužel) na RestApi
  • Dokumentace API od RailFormers zde

Definované Calls[edit]

Detailní dokumentace k implementaci v OnePro zde

Technologie na straně klienta[edit]

Klient OnePro ke komunikaci RestApi volání požívá trochu obstarožní knihovnu Retrofit2

Přidání nového volání[edit]

Při přidávání nového volání se musí vytvořit a modifikovat několik tříd. Zde je příklad vytvoření nového volání SpeedTestDone

Modifikace[edit]

com/philips/artemis/merkur/Merkur.java
com/philips/artemis/merkur/api/MerkurBackApi.java
com/philips/artemis/merkur/api/MerkurInApi.java
com/philips/artemis/merkur/rest/ArtemisRestApi.java

Kreace[edit]

com/philips/artemis/merkur/calls/SpeedTestDone.java
com/philips/artemis/merkur/rest/component/SpeedTestDoneData.java
com/philips/artemis/merkur/rest/component/SpeedTestDoneResponse.java

Zabezpečení[edit]

RF navrhuje zavést autorizaci zařízení podle rfc8628, zde je analýza co pro to na straně klienta bude potřeba všechno udělat.

  • Pokud se device_code, user_code, verification_url budou vracet přes volání system/check_connection
    • rozšířit Retrofit object com.philips.artemis.merkur.rest.component.CheckConnectionResponse o pložky
      • device_code
      • user_code
      • verification_url
  • Init obrazovka se bude muset rozšířit o zobrazování QR code
  • Rozdělení komunikace na save/unsave
    • Vytvořit kopii třídy com.philips.artemis.merkur.Merkur
    • V nové třídě se zachová unsave komunikace, té bude méně
    • V původní třídě se zavede Oauth komunikace
  • Zprovoznit komunikaci pro pooling
    • Buď to bude nové RestApi volání
    • Nebo to bude spec komunikace s autorizačním serverem
    • Každopádně bude potřeba přerušit provision rutinu v OneProService dokud nedojde k spárování
  • Zařídit persistenci access_tokenu
  • Další potřbné subroutiny
    • Z aplikace CorteXX nebo FerrBuck okopírovat rutinu pro QR kódy
    • Z aplikace FerrBuck okopírovat rutinu s OAuth clientem
    • Z aplikace FerrBuck okopírovat OkHhtpClienta

Rozsah odhadovaných prací v případě hladkého průběhu: 3 dny programování + 2 dny testování a ladění. Potřebný čas bude taky závislý na tom jaká bude expirace access_tokenu a jak se bude aplikovat refresh_token

Nerealizováno

WebSocket[edit]

  • Rychlá komunikace ve směru Server=>Device
  • Založeno na khihovně Onyx která je pointem

Premiová funkce - musí být povolená Krejzlíkem

Aby se propsala na zařízení, musí mít zařízení přidělenou configuraci

Core[edit]

Knihovna Onyx se připojuje ve třídě Worker. O automatickou rekonexi se stará knihovna sama.

Princip[edit]

V případě funkčního WS připojení je blokováno RestApi volání requested_action z důvodu úspory přenesených dat a vytížení serveru.

Logování[edit]

Události spojené s WS komunikací je logováno v Runtime logu. Logováno je:

  • Připojení/odpojení WS Oracul
  • Příchozí zpráva

Testování[edit]

Pro testování je zřízen PHP script na Devel serveru.

Tento script je autorizován pomocí IP adresy a po otestování bude vypnut z důvodu bezpečnosti

Stahování souborů[edit]

Stahování je složitý proces a tak je k němu vytvořený diagram a zřízena samostatná stránka

SICP[edit]

Detekce hodnot[edit]

Hodnoty SICP se cyklicky kontrolují a v případě detekce změny, se informuje Artemis server. Z důvodu šetření přístupu na SICP jsou SIPC parametry rozdělené na tři skupiny.

  • statické parametry - načítají se jen na začátku - model number, etc..
  • pomalé parametry - načítají se v cyklu modulo 60 - kontrast, sytost, etc..
  • rychlé parametry - načítají se v cyklu modulo 4 - teplota, power

Fragment ze třídy OneProService

  // Each 4 cycle check SICP parameters
  if ((mCyclonCounter % 4) == 0) {
	  // Each 60 cycle check lazy SICP parameters
	  if ((mCyclonCounter % 60) == 0) {
		  mComparatorParam.execute(getActionIntent(Worker.SICP_CHANGED));
	  } else {
		  mComparatorTempr.execute(getActionIntent(Worker.SICP_CHANGED));
	  }
  }

Pomalé a rychlé parametry mají své Comparatory které kontrolují zda došlo ke změně.

Aplikace hodnot[edit]

Hodnoty zaslané serverem jsou vyhodnocovány a aplikovány třídou

Třída persistuje předešlé hodnoty a pomocí metody isChange() říká zda je nějaká změna a zápis je potřebný, kdy sepoužije metoda apply(). Jinak se nové nezměněné hodnoty ignorují.

Modely[edit]

Rozdílné volání SICP je řešeno pomocí modelů. Každý odlišný HW/FW má vlastní modul. Postupně nechá moduly provést self test zda vyhovují podmínkám a pokud nějaký model odpoví že ano, použije se ten a další modely se už nehledají. Záleží tedy na pořadí modelů.

O vybírání a pořadí modelů rozhoduje třída

Dostupné moduly[edit]

  • Model_VS - Virtuální SICP monitor - podmínka conn == Connection.VIRTUAL
  • Model_GB - Generic Box, řešení pro non SICP zařízení - podmínka conn == Connection.GENERIC
  • Model_TT - Jeden atypický model od Philips - podmínka modelName.equals(MODEL_1)
  • Model_QL3 - Nové Qéčka - podmínka modelName.endsWith("BDL3050Q")
  • Model_D - Nové Déčka - podmínka modelName.endsWith("BDL4550D")
  • Model_Dex - Stará Déčka a Téčka - podmínka end.equals("D") || end.equals("T")
  • Model_base - Je použitý na všechny starší modely, u kterých je detekované SICP a neprojdou jinou podmínkou.

Výše zmíněné testování už neplatí a testuje se na základě platform

O výsledku výběru modulu informuje aplikace v LogCatu

I/ModelFactory: ┌──[ WRAPPER CASTING ]─────────────────────────────────────────────────────────┐
I/ModelFactory: │ Model                  : 32BDL3650Q/00                                       │
I/ModelFactory: │ Connectom              : LAN                                                 │
I/ModelFactory: │                                                                              │
D/ModelFactory: │ Setup-VirtualSet       : [NO]                                                │
D/ModelFactory: │ Setup-GenericBox       : [NO]                                                │
D/ModelFactory: │ Model-TT               : [NO]                                                │
D/ModelFactory: │ Platform-Dragon_1.0    : [NO]                                                │
D/ModelFactory: │ Platform-Hymalaya_2    : [NO]                                                │
D/ModelFactory: │ Platform-BDL4550D_3.0  : [NO]                                                │
D/ModelFactory: │ Platform-RK3399        : [NO]                                                │
D/ModelFactory: │ Platform-BDL3650Q      : [YES]                                               │
I/ModelFactory: │                                                                              │
I/ModelFactory: │ Casted wrapper         : Platform-BDL3650Q                                   │
D/ModelFactory: │ Initialization take    : 1541 ms                                             │
I/ModelFactory: └──────────────────────────────────────────────────────────────────────────────┘

Funkce[edit]

Všechny registrované get/set SICP funkce mají své zastoupení v Enum

Tyto funkce si každý model udržuje v zásobnících

  • protected Map<Functions, GetDefault> mGetters;
  • protected Map<Functions, SetDefault> mSetters;

A buď použije defaultní metody pro set/get nebo si přiřadí své extra volání.

SICP set/get[edit]

Scheduller[edit]

Od verze ??? se musí před definicí nového schedulleru provést vynulování předchozích. Tato vlastnost je dostupná pouze pro nové "D" modely. Toto tvrzení nebylo potvrzeno!

Update[edit]

Klient podporuje dva druhy updatu. Updates si klient stahuje z FTP serveru. Liší se způsobem inicializace.

Update má dva způsoby instalace podle platformy

  • UpdateNoRoot - pro zařízení Philips
  • UpdateAsRoot - pro ostatní rootlá zařízení

Automatický update[edit]

  • Je periodicky inicializován klientem
  • První inicializace je deset minut po startu aplikace
  • V případě že zařízení není dlouho restartováno, provede se opakovaně po jednom týdnu
  • Update začíná voláním GET api/system/apk_version

Volání vrací json ve tvaru, ale tato pole jsou akceptovaná pouze starší verzí OnePro < 2.0

{
    "build_number": 40,
    "apk_name": "OnePro-1.8.apk"
}

Pokud má být automatický update proveden na OnePro >= 2.0 musí volání vracet pole:

{
    "build_number": 40,
    "apk_name": "OnePro-1.8.apk"
    "build_number_2": 990,
    "apk_name_2": "OnePro-2.5.apk"
}
  • Odkazované APK musí být přítomno na FTP
  • OnePro porovnává čísla buildů
  • Pokud je build na zařízení menší než v JSONu, spustí se automatický update
  • Toto se provádí pouze s dvojmístnými verzemi


Související rutiny

Postup nasazení[edit]

Pro nasazení OnePro 3.0 navrhuji postup:

  • Udělat verzi 2.99 s buildem 1824
  • a bez změny v kódu verzi 3.0 s buildem 1825
  • Nasadit na devel server nejprve verzi 2.99
  • Zařízení, která budou připojená na devel by měla provést automatický update
  • Pak nasadit verzi 3.0
  • Zařízení, která budou připojená na devel by měla opět provést automatický update
  • tím se prověří, že se nenaboural systém updatů
  • Pak se může verze 3.0 umístit na ostrý sever.

Selektivní update[edit]

  • Je inicializovaný uživatelem přes server Artemis
  • Používá se periodicky volané volání GET api/devices/requested_actions?device_sn=:device_sn
  • Pokud je požadovaný update, příjde instrukce selective_update
  • Oznámí se na Artemis server, že instrukce byla přijata clearing
  • To se provádí voláním POST api/devices/selective_update_done
  • Následně spuštěná rutina si z FTP serveru stáhne soubor OnePro-latest-2.apk
  • A po úspěšném stažení se spustí update v závislosti na platformě

Související rutiny

Worker/actionSelectiveUpdate()

Testování

adb shell am broadcast -a com.philips.artemis.onepro.RUN_TEST --es action test_request --es par1 "selective_update"

Vložený update[edit]

Na přání Philipsu byla do verze 3.0.2 vložena možnost distribuce dalších balíků pomocí OnePro.

O tuto funkcionalitu se stará třída Packer, která je asynchronní obálka pro potřebné procesy. Je navázaná přes rozhraní PackerProcessApi na třídu Worker která jí spouští.

Probíhají při ní tyto kroky

  • Aplikace zjistí, zda je poprvé puštěna v nové verzi
  • Pokud ano -> Spustí procesy v Packer třídě
  • Nejprve se vymažou staré instalační balíky v adresáři /sdcard/artemis/packs
  • Pak se zjistí, jaké verze jsou už na zařízení nainstalované
  • Poté se ověří, zda jsou nové balíky přítomny v OnePro assets adresáři
  • Pokud ano, tak se nakopírují do adresáře /sdcard/artemis/packs
  • Následně se pustí postupná instalace balíků
  • V uzavřeném cyklu se ověřuje, zda se instalace povedla, pad se jede dál
  • Oznámí se třídě worker výsledky instalace

Testování[edit]

Poslední verze se pouští automaticky a zatím není napsaný mechanismus jak dostat aplikaci do stavu opětovného spuštění instalace

Testování[edit]

Přímé broadcasty[edit]

Rutina Worker[edit]

Nezdokumentované testy[edit]

		if (action.equals(ActionTestVolume.ACTION_NAME)) new ActionTestVolume(mOPS, intent);
		if (action.equals(ActionTestSerial.ACTION_NAME)) new ActionTestSerial(mOPS, intent);
		if (action.equals(ActionTestReboot.ACTION_NAME)) new ActionTestReboot(mOPS, intent);
		if (action.equals(ActionTestUpdate.ACTION_NAME)) new ActionTestUpdate(mOPS, intent);
		if (action.equals(ActionTestPmList.ACTION_NAME)) new ActionTestPmList(mOPS, intent);
		if (action.equals(ActionTestInstall.ACTION_NAME)) new ActionTestInstall(mOPS, intent);
		if (action.equals(ActionTestPower.ACTION_NAME)) new ActionTestPower(mOPS, intent);
		if (action.equals(ActionTestShift.ACTION_NAME)) new ActionTestShift(mOPS, intent);
		if (action.equals(ActionTestScreenshot.ACTION_NAME)) new ActionTestScreenshot(mOPS, intent);
		if (action.equals(ActionTestCustom.ACTION_NAME)) new ActionTestCustom(mOPS, intent);
		if (action.equals(ActionTestClock.ACTION_NAME)) new ActionTestClock(mOPS, intent);
		if (action.equals(ActionTestScreen.ACTION_NAME)) new ActionTestScreen(mOPS, intent);
		if (action.equals(ActionTestRequest.ACTION_NAME)) new ActionTestRequest(mOPS, intent);
		if (action.equals(ActionTestScylla.ACTION_NAME)) new ActionTestScylla(mOPS, intent);
		if (action.equals(ActionTestSicp.ACTION_NAME)) new ActionTestSicp(mOPS, intent);
		if (action.equals(ActionTestTermin.ACTION_NAME)) new ActionTestTermin(mOPS, intent);
		if (action.equals(ActionTestMemory.ACTION_NAME)) new ActionTestMemory(mOPS, intent);

Export log[edit]

adb shell am broadcast -a com.philips.artemis.EXP_ACT_LOG --ei ex_event 21 --es ex_messg abcd --es ex_data 50%

ActivityBoardShow[edit]

Akce[edit]

Spustí rutinu check

adb shell am broadcast -a com.philips.artemis.onepro.ACTION_CHECK

Triggers[edit]

Vyvolá spuštění triggeru s názvem trigger1 pokud je definovaný na serveru. Trigery jsou označeny trigger1, trigger2, trigger3,...

adb shell am broadcast -a com.philips.artemis.onepro.CATCH_TRIGGER --es trigger trigger1

Ukončí aktivní trigger

adb shell am broadcast -a com.philips.artemis.onepro.ACTION_DROPSHOW

Lamia testing[edit]

Univerzální wrapper na pouštění/testování interních rutin.

Interval testing[edit]

Testuje vyhodnocení platnosti Playlisto omezené datem od/do. Inrvaly jsou vyjádřeny v millisconds of epoch. První parametr je interval from a druhý parametr interval to.

adb shell am broadcast -a com.philips.artemis.onepro.RUN_TEST --es action test_termin --el par1 1667257200000 --el par2 1667257200000

Premium parameters[edit]

Dá se aplikovat jen v devel verzi

Pro účely testování se dají měni premium parametry pomocí ADB příkazu.

Záludnosti[edit]

Samovypínání[edit]

Některé konfigurace posílané ze serveru způsobují samovolné zavření OnePro a následovné vypnutí obrazovky.

Více ve SICP záludnosti

Start s USB device[edit]

Pokud Philips zařízení má vložený USB Prolific řadič, tak to může způsobovat to, že se po restartu zařízení nanastartuje OnePro.

Ono zachytí intent spojený s záznamem v AndroidManifes.xml

		<activity android:name=".ActivityBoardMain"
		android:directBootAware="true"
		android:launchMode="singleTask"
		android:label="@string/app_name" >
			<intent-filter>
				<action android:name="android.intent.action.MAIN" />
				<category android:name="android.intent.category.LAUNCHER" />
				<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
			</intent-filter>
			<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/usb_device_filter" />
		</activity>

Spustí třídu BootReceiver ale nespustí OnePro s UI.

Částečným řešením je pouštění OnePro po startu Philipsu. Nastavení je popsáno zde


.