Skip to main content

Posts

Showing posts from 2013

Android Bluetoothsocket

Bluetoothyhteyden muodostaminen koitui projektin haastavimmaksi osuudeksi. Eri Android-versiot ja puhelimet toimivat eri tavoin kun muodostetaan laiteyhteyttä. Lisäksi käytettävä Bluetoothrauta ja Android eivät tykkää toisistaan ( http://stackoverflow.com/questions/9052460/with-just-one-particular-bluetooth-spp-module-createrfcommsockettoservicerecor ). Ratkaisuna ongelmaan ohjelmassa käyttäjä voi valita mitä yhdistystapaa käytetään. Jos laiteyhteyksiä ei saa muodostettua, käyttäjä voi vaihtaa yhdistystapaa. Keräsin kaikki löytämäni bluetoothyhdistystavat, joilla jokaiseen testipuhelimeen löytyi oikeat asetukset. /** * Luo socketin laitteeseen. Huom! yhdistämisessä paljon eroja eri * laitteiden välillä. Katso API-levelit ja android versioiden vastaavuudet * Androidin nettisivuilta. * * Yhdistystapaa voi muuttaa asetuksista. Oletuksena on neljä erilaista tapaa. Kts. * @param device * * @throws IOException */ private BluetoothSocket createBluetoothSocket(Blue...

Android ja Bluetooth

Android-ohjelma, jota teen töissä toimii kaukosäätimenä erilaisille moottorinohjaimille. Kaukosäädin toimii bluetoothilla. Androidin SDK:n mukana tulee hyvä esimerkkiprojekti bluetoothin käyttämisestä, jonka pohjalta on helppo aloittaa. Androidiin bluetooth muistuttaa mitä tahansa verkkosockettia jolla on sisääntulo ja ulostulostreamit, joihin voi kirjoittaa samanaikaisesti. Bluetooth toimikin testipuhelimellani (2.1) suhteellisen pienen työn jälkeen moitteettomasti. Viime viikolla testasin laitteilla, joissa oli Androidin versiot 2.3 ja 4.0.1 ja näissä ei ollut toivoakaan saada yhteyttä testilankkuun. Ongelmat johtuivat vielä eri syistä molemmissa laitteissa. Pahinta oli että toimimattomuus oli satunnaista, joten en ollut täysin varma onko vika testilankussa vai puhelimessa. Löysin muutaman Androidin ratkaisemattoman bugiraportin, joissa viitattiin käsittelemiini ongelmiin. Ratkaisuksi annettiin muutamia väliaikaisia korjauskikkoja, mutta nämäkään eivät auttaneet tapauksessa...

LoanMoaner

Työskentelen tällä hetkellä Android kehittäjänä ja applikaatio, jota olen tekemässä, alkaa olla kohta valmis. Viimeistelen ohjelman layouttia ja mieleeni palasi unohtumattomat kokemukset LoanMoaner Meego-ohjelmasta. Osallistuimme opiskelukaverini kanssa Cybercomin järjestämään koodauskilpailuun, jossa tarkoituksen oli käyttää Qt:tä joko kännykkä tai työpöytäohjeman tekemisessä. Käytimme QML:ää käyttöliittymän tekemisessä ja C++ tietokantajutuissa ja Googlen kalenterisynkkauksessa. Samoin kuten nyt Androidissa, kumpikaan ei ollut käyttänyt käyttöjärjestelmää missään laitteessa ja N9 oli vasta muutaman kuukauden vanha. Emme oikeastaan etukäteen tienneen millaista käyttökokemusta laitteelle haetaan. Itse Meegosta ei ollut muutenkaan paljon tietoa ja silloin pidimme vielä itsestään selvänä että myös uusia Meego puhelimia on tulossa mahdollisesti eri resoluutioilla. Käyttöliittymän tekeminen on helppoa QML:llä. QML layoutin muodostus muistuttaa Androidin ja WP:n XML määrittely...

Instacode

Tästä lähtien koodipätkät pelkästään kuvina! http://instacode.linology.info/38678

ykj2wgs84

Viljelysuunnitteluprojektissa olennaisena osana ovat luonnollisesti pellot. Suomalaiset maanviljelijät saavat omat peltotietonsa koordinaatteineen maaseutuviraston GISistä. Teimme oman parsijan, joka parsii koordinaatit ja peltojen nimet mavin viljelijäpalvelusta. Koordinaatit ovat palvelussa YKJ tasokoordinaatistossa ja ne täytyy muuttaa karttapalveluja ja mobiiliosan GPS träkkeriä varten WGS84 koordinaateiksi. Tein muunnosoperaatiota varten melko mielenkiintoisen metodin public double[] ykj2wgs84(double E, double N) { double f = 1.0D / 297.0; double el = f / (2 - f); double a = 6378388.0; double A1 = (a / (1 + el)) * (1 + (Math.pow(el, 2) / 4) + (Math.pow(el, 4) / 64)); double E0 = 3500000.0; double lambda_0 = 27 * (Math.PI / 180); double k_0 = 1.0D; double eps = N / (A1 * k_0); double n = (E - E0) / (A1 * k_0); double h1 = ((((1.0D / 2.0) * el) - ((2.0 / 3.0) * Math.pow(el, 2))) + ((37.0 / 96.0) * Math .pow(el, 3))) - ((1.0D / 360.0) * Math....

Koodausrutiini

Olen osana maatalouden viljelysuunnitteluun liittyvässä projektissa, jossa on kaksi muuta tekijää, jotka ovat opiskelukavereitani. Projekti on lähtenyt liikkeelle syksyllä 2011 ja on sitä myöden edennyt enemmän tai vähemmän tasaisesti. Haasteena on rakentaa helppokäyttöinen ohjelmisto ei tekniselle käyttäjäkunnalle. Lisäksi viljelysuunnitteluun liittyvä lainsäädäntö on suhteellisen monimutkaista. Olen vastannut projektin ominaisuuksien valinnoista ja niiden priorisoinnista, mikä on myös johtanut siihen että olen koodannut ylivoimaisesti eniten ominaisuuksia. Epätasainen työnjako on tuttua opiskelijaprojekteissa ja miksei myös muissa projekteissa. Opiskeluvaiheessa tämä ei itseäni ainakaan haittaa: oma ammattitaitoni kasvaa lähes riskittömässä ympäristössä. Palkkaa tosin ei saa. Kokemattiomien koodaajien kesken on hankalaa löytää itseluottamusta projektin eteenpäin viemiseen. On vaikeaa saada rohkeutta tai kannustaa muita tekemään. Varsinkin jos kohde ei ole tuttu ja taskit...

Digilasku osa 5

Digilaskussa siirretään suurin osa usein tarvittava tietokannassa oleva data ohjelman muistiin. Vaatimella tämä onnistuu helposti, kunhan ymmärtää miten instanssit ja istunnot toimivat. Tavoitteena on siis hakea data aina kerran ja vain siihen liittyvään istuntoon. Vaatimessa on oma metodinsa, jolla saa nykyisen instanssin sovelluksesta, mutta se osoittautui ongelmalliseksi. Ratkaisuna käytimme ThreadLocal patternia, josta kirjoitettu lisää mm. täällä https://vaadin.com/wiki/-/wiki/Main/ThreadLocal%20Pattern Käytännössä, kun ohjelmainstanssi luodaan, se tallennetaan staattiseen muuttujaan, joka on sidottuna ainoastaan nykyiseen instanssiin (säikeeseen). private static ThreadLocal<DigilaskuApplication> instance = new ThreadLocal<DigilaskuApplication>(); Jos halutaan käsitellä jotain instanssiin liittyviä tietoja, siihen päästään käsiksi helposti mistä tahansa ohjelmaa Instanssiin liittyvän tiedon haku DigilaskuApplication. getInstance ()....