Prošlo je dosta vremena od mog pitanja, u međuvremenu sam naučio znatno više nego sam mislio da je potrebno (a bilo je potrebno), tako da sam jučer uspio napraviti koliko-toliko zaokruženu funkcionalnost background servicea na androidu.
U kratkim crtama:
- osnove objektnog programiranja must-have --> poželjno znanje Jave. Osobno mi je Java mrska, ali uspio sam se nekako natjerati. Nije preteško.
- Počeo sam jednostavno, da shvatim kako radi USB host: device enumeration, USB port list, interfaces + direction.
- Primanje bilo kakvih podataka preko USB-a.
- Prebacio sam se na korištenje usb-serial-for-android, iz kojeg sam naučio da ima priličan broj parametara koji se još moraju "dodati" na osnovno ostvarivanje komunikacijskog kanala s USB uređajem kako bi se moglo ispravno čitati podatke. Postoje gotovi driveri za najpopularnije USB-serial IC-ove, među njima i za moj u vidu Cp21xxSerialDriver.
- Fenomenalna stvar je bila SerialInputOutputManager (u daljnjem tekstu manager), koji dolazi u paketu sa usb-serial-for-android. Manager reagira na ulazni i/ili izlazni stream podataka na USB-u. Iz toga sam shvatio da nema kruha bez Threadinga. Tu se stvari počinju malo komplicirati, jer za nekog tko nije radio (multi)threading dosad, ne može se samo uzet nečiji primjer i adaptirati, trebalo bi se razumjeti što se radi. Nazad na osnove, pa onda potom tek dalje.
- Prvo sam koristio također primjere iz gore navedene biblioteke, SerialConsoleActivity. Kad sam počeo dobivati suvisle (očekivane) podatke na USB-u, išao sam korak dalje.
- Stvaranje poruka od podataka iz USB buffera. Drugim riječima, prepoznavanje koju sam tipku na volanu pritisnuo. KeyMapping.
- Odrađivanje funkcije kad se prepozna koja je tipka pritisnuta. Iz Manager Threada se informacija u primjerima vraća u UI Thread --> za background service neće ići. U ovom trenu preko UI Threada funkcionira pojačavanje/stišavanje.
- "Gradnja" servisa: glavni problem mi je bio shvatiti kako iz Managera odraditi podešavanje glasnoće: novim threadom i izgradnjom podklase tipa Runnable koja će se vrtiti na tom threadu. Funkcionira super
Ovo gore je jako puno sitnica i finesa komprimirano u najkraće moguće objašnjenje, tko treba detaljnije, neka pita.
Trenutno pokušavam shvatiti kako mogu kontrolirati mediaplayback (next, previous, ffw, rwd) ako je neki mediastream aktivan, a ako nije da tipke gore/dolje mogu služiti navigiranjem izbornicima. Ako netko ima iskustva, nek mi javi, rado bih prihvatio kratki how-to da si smanjim muku
Kad završim i koliko-toliko uredim kod, osvanut će na githubu, ako će eventualno nekome koristiti.