From b11b8965bddd27c02f5b2757b92801aa0be7ba65 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Tue, 19 Jan 2021 13:37:02 +0100 Subject: [PATCH] new version --- README.md | 22 ++ connectiq/.settings/IQ_IDE.prefs | 2 + connectiq/bin/ura-busstops-settings.json | 1 + connectiq/manifest.xml | 18 +- connectiq/monkey.jungle | 2 + connectiq/resources/drawables/ASEAG.svg | 48 +++ connectiq/resources/drawables/bus_icon.png | Bin 0 -> 13143 bytes .../resources/drawables/bus_stop_sign.png | Bin 0 -> 2281 bytes .../resources/drawables/bus_stop_sign.svg | 6 + connectiq/resources/drawables/drawables.xml | 2 +- .../resources/drawables/launcher_icon.png | Bin 1292 -> 1940 bytes connectiq/resources/porperties.xml | 15 + connectiq/resources/strings/strings.xml | 6 +- connectiq/source/BusStopApp.mc | 83 ++--- connectiq/source/BusStopDelegate.mc | 38 ++- connectiq/source/BusStopView.mc | 288 ++++++++++++------ connectiq/source/DepartureDelegate.mc | 36 +++ connectiq/source/DepartureView.mc | 84 +++++ rev-eng/script.sh | 8 + 19 files changed, 508 insertions(+), 151 deletions(-) create mode 100644 README.md create mode 100644 connectiq/.settings/IQ_IDE.prefs create mode 100644 connectiq/bin/ura-busstops-settings.json create mode 100644 connectiq/monkey.jungle create mode 100644 connectiq/resources/drawables/ASEAG.svg create mode 100644 connectiq/resources/drawables/bus_icon.png create mode 100644 connectiq/resources/drawables/bus_stop_sign.png create mode 100644 connectiq/resources/drawables/bus_stop_sign.svg create mode 100644 connectiq/resources/porperties.xml create mode 100644 connectiq/source/DepartureDelegate.mc create mode 100644 connectiq/source/DepartureView.mc create mode 100644 rev-eng/script.sh diff --git a/README.md b/README.md new file mode 100644 index 0000000..4dbcb53 --- /dev/null +++ b/README.md @@ -0,0 +1,22 @@ + + +## Related + +- https://github.com/asplendidday/ACbus +- https://github.com/feuerrot/aseag-python +- https://github.com/RobertKrajewski/PyASEAG +- https://github.com/RobinMeis/pyASEAG +- https://github.com/lebu/ASEAG-Busabfahrten +- https://git.rwth-aachen.de/markus.witt/aseag-cli +- https://github.com/stklcode/juraclient +- https://github.com/acmurmeltier69/Alexa-Busauskunft + + +- http://content.tfl.gov.uk/tfl-live-bus-river-bus-arrivals-api-documentation.pdf + + +# API Endpoints + +http://countdown.api.tfl.gov.uk +http://ivu.aseag.de/interfaces/ +http://opendata.avv.de/current_GTFS/AVV_GTFS_mit_SPNV.zip diff --git a/connectiq/.settings/IQ_IDE.prefs b/connectiq/.settings/IQ_IDE.prefs new file mode 100644 index 0000000..10bb291 --- /dev/null +++ b/connectiq/.settings/IQ_IDE.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +project_manifest=manifest.xml diff --git a/connectiq/bin/ura-busstops-settings.json b/connectiq/bin/ura-busstops-settings.json new file mode 100644 index 0000000..3221ce5 --- /dev/null +++ b/connectiq/bin/ura-busstops-settings.json @@ -0,0 +1 @@ +{"settings":[{"key":"api_url_index","valueType":"number","defaultValue":1,"configTitle":"ApiUrl","configPrompt":"ApiUrlPrompt","configHelpUrl":null,"configError":null,"configType":"list","configReadonly":false,"configRequired":false,"configOptions":[{"display":"ApiUrlLocalhost","value":0},{"display":"ApiUrlNulll","value":1}],"configMin":null,"configMax":null,"configMaxLength":null}],"languages":{"valyrian":{"ApiUrl":"API URL","ApiUrlNulll":"https://connectiq-ura.0l.de","ApiUrlLocalhost":"http://localhost:8080","AppName":"Bus Stops","ApiUrlPrompt":"API URL:"}}} \ No newline at end of file diff --git a/connectiq/manifest.xml b/connectiq/manifest.xml index 646f7b4..3b9f280 100644 --- a/connectiq/manifest.xml +++ b/connectiq/manifest.xml @@ -1,16 +1,16 @@ - - + - - - + - + + + - - - + + deu + eng + diff --git a/connectiq/monkey.jungle b/connectiq/monkey.jungle new file mode 100644 index 0000000..45c1bf8 --- /dev/null +++ b/connectiq/monkey.jungle @@ -0,0 +1,2 @@ +project.manifest = manifest.xml + diff --git a/connectiq/resources/drawables/ASEAG.svg b/connectiq/resources/drawables/ASEAG.svg new file mode 100644 index 0000000..6f04314 --- /dev/null +++ b/connectiq/resources/drawables/ASEAG.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/connectiq/resources/drawables/bus_icon.png b/connectiq/resources/drawables/bus_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ec4260a10e5fd184373275d72896cbc6e5d3a6dd GIT binary patch literal 13143 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 Huz~*r&0qmT literal 0 HcmV?d00001 diff --git a/connectiq/resources/drawables/bus_stop_sign.png b/connectiq/resources/drawables/bus_stop_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..44b9e3795ad69a79714151b6602588993e53813d GIT binary patch literal 2281 zcmVEX>4Tx04R}tkv&MmP!xqvTcskE4i*)0$WWauii$XD6^c+H)C#RSn7s54nlvOS zE{=k0!NH%!s)LKOt`4q(Aov5~=H{g6A|>9J6k5c1;qgAsyXWxUeSp7SW~$jS4yc-C zq!Mu;cejJx~0i`z~v4w@T5zI6D_nJGm<~dFufHci2c>^3A z0wV>=UiWx+SNq)l?P<>M2YO0!sv`Y31ONa424YJ`L;wH)0002_L%V+f000SaNLh0L z01ejw01ejxLMWSf00007bV*G`2ju|}0wE{OH7ZyD00!krL_t(o!@ZerY*W`6#((Et zx=C5Pt&D(%G_*ls(moEg8!JUx%Yj} z`@UB&56Cm9!DUp&6*ePTE8%G&$Vajm0Ku4$3`n?%;HrqxXj(_B5X9%YmY9pNuN9{% zIDll=V8mGXi9e6FfR*l0HvM5E_hUK$GSw)Bh7cv0L0o1Z8l1>5W*6_xi=cF~C=lnkCt}#U|Avc? z{dUrcZ(6+^FKxrVDEvpW%Fjdvld~o`;3hLO&igF^+qPZpRSZvNun@58!_=2Isx1XK)x7lLzVo+k5cA=O`qu`zKC&`Pa$!cbq`@-4g*22E${Ek2GGw^L#E&*^ox z25h|1RYq&Tra7OxD8l7+f5(v#-eIZaPYDD^Td>6i|M~9q>YQW&v8V9A99r>jZj6}# z(1|$JONM78cKKc|QKnjPTy?Gk=_dv(&lIrr>kzoM{uT7q=blX1bZGoGbM$^B;4 zzu4#O=5KfN+0p(y0E^WqeVhI=Bf%fGKhM~dfWKG%DZeiM97jf&Uv!oy*k1D6`M~S6 zzHIM(6F2~%0Qf%RsY$8qIeM#9bCLZ^yV&RKPFwWub9V8QB>s-vdWNVJd;M;fJ|w8B z96aZ7>a|38y~W2{#T{vvm}4dFRGNJW<2|7)&Uu}BCH^2-6e&@V)SenB(%w;V2Rb3s zPEaQ#$4c5Yg}D9!m)-IVsuFBv-C)G{)RmE(1jBFV_G|7kU8peo*`7O)F#hRC4xWgi zaI}cEN?c*{C-?F+HL5oMHVciN`8^3^aVcoJmxq*WQIJ%)16Iu&Vw2Uo-~_i=y%^O* zp?8m3L9$j6u&Q%BJHfzZ@@YPpZWz@VYfXuw-!+~Mg4H?+`GXN-fD5djAT;a7F z6)9~}p-^M3fv^!EUk5Cn7Sc!I$Oxx&JSi1U4=#V=Q*>w$48|4#WGCI8Ku{-O(4h}mzaA+4;mp(p zjf5P1B&AI%^lQa{Ap|g}Na$RZ6-+Q_3s@gkX$y%^Oy$~WqRf?K1wnFCLEx^?2=j1U z@yD@{HCw<2ORZn6%cXuOMtG(>1Byz5z}S*BK7hY^BC#k7uAM@Fc( z%92>3emGpfXCt-+BiA-+<)h((gz*K-Pnw)OO>Lca6*iZ3;to#-v*L~lvj$i021gp++MHRs-3`8hh|$($|MV#ePfr(3kC&Zo>=>HJc(=M`E1rn^aCk*fhK;dtuS$LX?WHrj?hw2VAosNS*ttVn| zHr>m^J!++M+{9qmFrB88txi&42vL$1#AWvL;*ufk`fx8$AB|EsEy8JQq9=Tx5@pm) zg_LYTvKGN=pb(~hL% + + + + + \ No newline at end of file diff --git a/connectiq/resources/drawables/drawables.xml b/connectiq/resources/drawables/drawables.xml index d0de5d6..66f0bd4 100644 --- a/connectiq/resources/drawables/drawables.xml +++ b/connectiq/resources/drawables/drawables.xml @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/connectiq/resources/drawables/launcher_icon.png b/connectiq/resources/drawables/launcher_icon.png index d3594e7cb975929fe36f50e5bffde505262c0901..28847fb93bda3cbae7e3104ce947220469654d5a 100644 GIT binary patch literal 1940 zcmV;F2W$9=P)EX>4Tx04R}tkv&MmP!xqvTcskE4i*)0$WWauii$XD6^c+H)C#RSn7s54nlvOS zE{=k0!NH%!s)LKOt`4q(Aov5~=H{g6A|>9J6k5c1;qgAsyXWxUeSp7SW~$jS4yc-C zq!Mu;cejJx~0i`z~v4w@T5zI6D_nJGm<~dFufHci2c>^3A z0wV>=UiWx+SNq)l?P<>M2YO0!sv`Y31ONa424YJ`L;wH)0002_L%V+f000SaNLh0L z01ejw01ejxLMWSf00007bV*G`2ju||7AG?0=Os`800odqL_t(o!|hmWY?DBB5|bHNFB_Mz!ESB8^ZKK64EajOTB1MpCSQ6^zxTZ7`ObSkz$8u5 ze@hgwyEqPy4xn$${5pUD6FP;ing%km8fP^h?|+a0PXef%umDDnl45;MyZgw404P*w zpoSR!i3(ssHYxRU!0!6=M%7wV(g6x{T2K*H6C;$Mtk(y-FP!MkFR&$9#m*>F)|`qW znXwp^rU?<@Y!GIH)p7vk0LXyV$Doxt-qz-%0G#N;U_sGR)=YZ<*bQDs0DjlzZTmQ3 zfL&|0K(wC*lnzz0L=)|&cR}gXj188ru+*A{?Ab^18;*s#mQ`A`uA6mC*kWv;s@@#z z*^qhNKbX)7`s^hTkWp1aUoIez-t%->b+W+LoQ|`H03c{DThHL#04xUFZry}6xo15W z6H>9y;e_DmR1wz+rmb;3SkS@YRDLzT#nb02Dw!{o{1HH&0c#kn%+VcbOavgvNuB`r_~3SGBnj2aLQ#{vp1T8 zD*(aKBE*{Ek%CP-09*vnIudHG#SrwQ=~kpUP_&>lr^B;PX>tjGzmfnjT`K-5EcJ|W zc`*Z`yUyC>i%e}a_yo(b6oyr;xK|EkA2{|Ep;*Ro1W%Aeh7 z6U8@>Zc%ijYOQIo`$7|d#c@h|zapy6@wPSx=GbSFupDB7%cuolK|6*V)^G9~j)f8q zGr>aV=S=k4IQfSOwAt!y{qow>oYaubx(C3z7{)sUsNX^2>csmUzBrz)&M4}CXYmI& zW?uIX`isgo2%UE`!JOoFWLU6VWa!10@@7I#&4LW+V1Yivm`HSb*lb!k)6?t^&MjNS zf*S$kCJmm_H$lj~al=ek@q+164}S~bX@l1RDE)ccZ|8muI2TV-;enk}(Yi!WlN1_R zVD-4G83rh5cWxu5olLiDNTdGa@`A@RO*aQBl;jC_cf+aNU>T&o`!2Wqj?!vk@hyP# zyFXhT1?%tIylw8Jww?F8AW-OXfN&VV?3gl1fOK_N3Ip)ZpK7FFN5{Eajfbo6t%6 aztZ3GDo4k1g0H#&0000@WZT1er-h zK~zY`<(A)TmSq^nKiB>IdiTD2w>fi5H+`GV>1^WEG${}%gHBRYgw7JFgHHMnf)0XC zDu^JYjx2~muu?oJVwhw>YA7}ln>v=;+}v#M-k;C=-1ptVv!AZHNrDGn@Eklm&wYQd zU*GR_$&$=Q%OfzwBeF*Z?EbIQ)`B&Nv4F)QpaevL$O8adi&R2T4%T(=3n-NkQ(KQs zrLkTBN`W;HmQlGZlF!BtD77%Ktx6HKZ9;NmID>uhMKetVDVH#{^;A~2618t3YH3F| zuD}LKq+G-q?#Jor#=CY2x2GE^jDs^b2&by9@!iQ6-Lj7Hx8KL4>+rhIBVl*bEu(P;CXR9tpQ{3FZ@in zWhbRwdxcYT+gdtJeCQNz>L=}QFr=||yUz!x64c^6HQ6sl8%QKjU6;pLy zFk*>9bYnBNx)$&H6{K8RyuNro?)3>u8AG(P6_m5sR2yuv8tVth=nz;IRHa!_XGbB5 z;(O9{i;oxtjE)bwJ_vwaw4{pT#b5&H$^#4u$3fj4L5g{FQ%mfKT_8hVfUQb`(L@bR z;0K@_)Sba8HCzDLV*CKN?;0w57n5m4H#E(k>Zn4LX=Ci2BNPt4g-zAq4));;^g$)W z?YRPrrjzI4cArPaMj)4^xbH9|l5=$&!1d6}S7B2%gxhve+;a$1TTk-K52^nAJ)~Ti za(Y^;MKH^j6F$2e=XM|drQeWp5kw(j8PSHQWj%W3YH&TAz8+LD&qUGV3ys0Obput* z5oOwl)^*06-PeQLdv#W0&JTQX8kh-Mm?u`C8=HyRH)EDQi8DGBi-<9ZHL=#a9`0Y4 z5v_@uo+8@t4AyaQ|GqJ6=**VP$@!@iRs@;RoiB>-V`oLCQmGr8NqzAViJy)G#NaQ#h8n$1;`GV5B(s<^aFf(mAEQQx zky0^UWA0f5Y$8c;`ULKk3q)%>&<)MlnkC?R5LJ-e7;gW~_}y9(UEhOpsB~<{xic^& zw=!$JH3kVwvB-P=f{G?#Ii_5?4qP9i3M!ukqp?BNM8j#UpTI0_#Odz^N5wPXq3qSx z#*fH + + + 1 + + + + + + @Strings.ApiUrlLocalhost + @Strings.ApiUrlNulll + + + + diff --git a/connectiq/resources/strings/strings.xml b/connectiq/resources/strings/strings.xml index ec44fdc..88febd5 100644 --- a/connectiq/resources/strings/strings.xml +++ b/connectiq/resources/strings/strings.xml @@ -1,3 +1,7 @@ - ASEAG Fahrplan + Bus Stops + API URL + API URL: + http://localhost:8080 + https://connectiq-ura.0l.de \ No newline at end of file diff --git a/connectiq/source/BusStopApp.mc b/connectiq/source/BusStopApp.mc index df3e1cc..af55e85 100644 --- a/connectiq/source/BusStopApp.mc +++ b/connectiq/source/BusStopApp.mc @@ -1,54 +1,57 @@ -using Toybox.Application as App; -using Toybox.Position as Position; -using Toybox.Time as Time; +using Toybox.Application; +using Toybox.Position; +using Toybox.Time; +using Toybox.Sensor; +using Toybox.System; -class BusStopApp extends App.AppBase { - var mView; - var mDelegate; +class BusStopApp extends Application.AppBase { + var view; + var delegate; + var position; + var sensors; + var api_url; - function intialize() { - AppBase.initialize(); - } - - //! onStart() is called on application start up - function onStart() { - Position.enableLocationEvents(Position.LOCATION_CONTINUOUS, method(:onPosition)); - } - - //! onStop() is called when your application is exiting - function onStop() { - Position.enableLocationEvents(Position.LOCATION_DISABLE, method(:onPosition)); + var offset = 0; + var stopId = 0; + + function initialize() { + Application.AppBase.initialize(); + + loadSettings(); } - function fakePosition() { - var pos = new Position.Info(); - - pos.accuracy = 0; - pos.altitude = 0; - pos.heading = 0; - pos.speed = 0; - pos.when = Time.now(); - pos.position = new Position.Location({ - :latitude => 50.7855, - :longitude => 6.0541, - :format => :degrees - }); - - mView.setPosition(pos); + function onSettingsChanged() { + loadSettings(); + } + + function loadSettings() { + var api_url_index = 1; //getProperty("api_url_index"); + + switch (api_url_index) { + case 0: + api_url = "https://localhost:8080"; + break; + + case 1: + api_url = "https://connectiq-ura.0l.de"; + break; + } + + System.println(api_url); } - function onPosition(info) { - positionView.setPosition(info); + function onStart(state) { + } + + function onStop(state) { } //! Return the initial view of your application here function getInitialView() { - mView = new BusStopView(); - mDelegate = new BusStopDelegate(); + view = new BusStopView(self); + delegate = new BusStopDelegate(self); - fakePosition(); - - return [ mView, mDelegate ]; + return [ view, delegate ]; } } \ No newline at end of file diff --git a/connectiq/source/BusStopDelegate.mc b/connectiq/source/BusStopDelegate.mc index 6fd792e..d36ec75 100644 --- a/connectiq/source/BusStopDelegate.mc +++ b/connectiq/source/BusStopDelegate.mc @@ -1,10 +1,36 @@ -using Toybox.WatchUi as Ui; -using Toybox.Graphics as Gfx; -using Toybox.System as Sys; +using Toybox.WatchUi; -var last_key = null; - -class InputTestDelegate extends Ui.BehaviorDelegate { +class BusStopDelegate extends WatchUi.BehaviorDelegate { + var app; + function initialize(a) { + WatchUi.BehaviorDelegate.initialize(); + + app = a; + } + + function onNextPage() { + app.view.offset += 1; + + WatchUi.requestUpdate(); + + return true; + } + + function onPreviousPage() { + if (app.view.offset > 0) { + app.view.offset -= 1; + + WatchUi.requestUpdate(); + } + + return true; + } + function onSelect() { + app.offset = 0; + WatchUi.pushView(new DepartureView(app), new DepartureDelegate(app), WatchUi.SLIDE_LEFT); + + return true; + } } \ No newline at end of file diff --git a/connectiq/source/BusStopView.mc b/connectiq/source/BusStopView.mc index 18accd2..182de96 100644 --- a/connectiq/source/BusStopView.mc +++ b/connectiq/source/BusStopView.mc @@ -1,105 +1,205 @@ -using Toybox.WatchUi as Ui; -using Toybox.Graphics as Gfx; -using Toybox.System as Sys; -using Toybox.Lang as Lang; -using Toybox.Communications as Comm; -using Toybox.System as Sys; -using Toybox.Time as Time; -using Toybox.Timer as Timer; +using Toybox.WatchUi; +using Toybox.Graphics; +using Toybox.System; +using Toybox.Lang; +using Toybox.Communications; +using Toybox.System; -class BusStopView extends Ui.View { - var schedule = null; - var tmr; +class CompassDrawable extends WatchUi.Drawable { + + var bearing = 0; + var aWidth = 2; + var aLength = 6; + var aColor = Graphics.COLOR_RED; + + function initialize(settings) { + WatchUi.Drawable.initialize(settings); + + aWidth = settings[:aWidth]; + aLength = settings[:aLength]; + aColor = settings[:aColor]; + } + + function setBearing(b) { + bearing = Math.PI * (b - 90) / 180; + } + + function draw(dc) { + var rPts = new[7]; + var aPts = [ + [-0.5*aLength, -0.5*aWidth], + [ 0.0, -0.5*aWidth], + [ 0.0, -1.0*aWidth], + [ 0.5*aLength, 0], + [ 0.0, 1.0*aWidth], + [ 0.0, 0.5*aWidth], + [-0.5*aLength, 0.5*aWidth] + ]; + + var s = Math.sin(bearing); + var c = Math.cos(bearing); + + for (var i = 0; i < 7; i++) { + var p = aPts[i]; + rPts[i] = [ + locX + width * (p[0] * c - p[1] * s), + locY + height * (p[0] * s + p[1] * c) + ]; + } + + dc.setColor(aColor, Graphics.COLOR_TRANSPARENT); + dc.fillPolygon(rPts); + } +} + + +class BusStopView extends WatchUi.View { + var stops = null; + var app; + var compass; + + var offset = 0; + var sensors; + var position; - function intialize() { - View.initialize(); - } - - //! Load your resources here - function onLayout(dc) { - } - - //! Called when this View is brought to the foreground. Restore - //! the state of this View and prepare it to be shown. This includes - //! loading resources into memory. - function onShow() { - tmr = new Timer.Timer(); - tmr.start(method(:redraw), 1000, true); - } - - //! Called when this View is removed from the screen. Save the - //! state of this View here. This includes freeing resources from - //! memory. - function onHide() { - tmr.stop(); - } - - //! Update the view - function onUpdate(dc) { - var string; - - // Set background color - dc.setColor( Gfx.COLOR_TRANSPARENT, Gfx.COLOR_BLACK ); - dc.clear(); - dc.setColor( Gfx.COLOR_WHITE, Gfx.COLOR_TRANSPARENT ); - - if( schedule != null ) { - var ts = new Time.Moment(schedule[1][4] / 1000); - var duration = Time.now().subtract(ts); - var ts_greg = Time.Gregorian.info(ts, Time.FORMAT_MEDIUM); - var dur_greg = Time.Gregorian.info(new Time.Moment(duration.value()), Time.FORMAT_SHORT); - - /* Timezone offset */ - dur_greg.hour -= 2; - - var arr = Lang.format("$1$:$2$:$3$", [ - (ts_greg.hour - 2), - (ts_greg.min).format("%02u"), - (ts_greg.sec).format("%02u") - ]); - - var due = ""; - if (dur_greg.hour > 0) { - due += dur_greg.hour + " h "; - } - if (dur_greg.min > 0) { - due += dur_greg.min + " min "; - } - if (dur_greg.sec > 0) { - due += dur_greg.sec + " sec "; - } - - dc.drawText( (dc.getWidth() / 2), (dc.getHeight() / 2) - 80, Gfx.FONT_LARGE, schedule[1][2], Gfx.TEXT_JUSTIFY_CENTER ); - dc.drawText( (dc.getWidth() / 2), (dc.getHeight() / 2) - 40, Gfx.FONT_SMALL, schedule[1][1], Gfx.TEXT_JUSTIFY_CENTER ); - dc.drawText( (dc.getWidth() / 2), (dc.getHeight() / 2) - 20, Gfx.FONT_SMALL, schedule[1][3], Gfx.TEXT_JUSTIFY_CENTER ); - dc.drawText( (dc.getWidth() / 2), (dc.getHeight() / 2) + 10, Gfx.FONT_SMALL, arr, Gfx.TEXT_JUSTIFY_CENTER ); - dc.drawText( (dc.getWidth() / 2), (dc.getHeight() / 2) + 40, Gfx.FONT_SMALL, due, Gfx.TEXT_JUSTIFY_CENTER ); - } - else { - dc.drawText( (dc.getWidth() / 2), (dc.getHeight() / 2), Gfx.FONT_SMALL, "No schedule avail", Gfx.TEXT_JUSTIFY_CENTER ); - } - } - - function setPosition(info) { - var url = "http://web.0l.de:8080/"; - var parameters = { "Circle" => info.position.toDegrees()[0] + "," + - info.position.toDegrees()[1] + ",150", - "ReturnList" => "StopPointName,DestinationName,LineName,EstimatedTime" }; - var options = { :method => Comm.HTTP_REQUEST_METHOD_GET }; + function initialize(a) { + WatchUi.View.initialize(); - Comm.makeJsonRequest(url, parameters, options, method(:requestCompleted)); + app = a; + } + + function onLayout(dc) { + var compassX = dc.getWidth() / 2; + var compassY = dc.getHeight() / 2 - 60; + + compass = new CompassDrawable({ + :locX => compassX, + :locY => compassY, + :width => 11, + :height => 11, + :aWidth => 2, + :aLength => 6, + :aColor => Graphics.COLOR_DK_RED + }); + } + + function onShow() { + Position.enableLocationEvents(Position.LOCATION_CONTINUOUS, method(:onPosition)); + + Sensor.setEnabledSensors([Sensor.SENSOR_HEARTRATE]); + Sensor.enableSensorEvents(method(:onSensor)); + } + + function onHide() { + Position.enableLocationEvents(Position.LOCATION_DISABLE, method(:updateStops)); + } + + function onPosition(positionInfo) { + System.println("Position: " + positionInfo.position.toDegrees()); + + position = positionInfo; + updateStops(); + } + + function onSensor(sensorInfo) { + System.println("Heading: " + 180.0 * Math.PI / sensorInfo.heading); + + sensors = sensorInfo; + requestUpdate(); + } + + function onUpdate(dc) { + // Set background color + dc.setColor(Graphics.COLOR_TRANSPARENT, Graphics.COLOR_BLACK); + dc.clear(); + + var midW = dc.getWidth() / 2; + var midH = dc.getHeight() / 2; + var top = Graphics.getFontAscent(Graphics.FONT_SMALL); + + if (stops != null) { + if (stops.size() > 0) { + if (offset >= stops.size()) { + offset = stops.size() - 1; + } + + var stop = stops[offset]; + + var dist = stop["dist"] < 1000 + ? stop["dist"].format("%.0f") + " m" + : (stop["dist"] / 1000).format("%.1f") + " km"; + + var bearing = stop["bearing"].format("%.0f") + "° (" + stop["bearing_str"] + ")"; + + var y = midH; + + var bDeg = stop["bearing"]; + var hDeg = 180.0 * sensors.heading / Math.PI; + + dc.setColor(Graphics.COLOR_RED, Graphics.COLOR_TRANSPARENT); + dc.setPenWidth(4); + dc.drawArc(midW, midH, midW-2, Graphics.ARC_CLOCKWISE, -bDeg+5+90, -bDeg-5+90); + + dc.setColor(Graphics.COLOR_YELLOW, Graphics.COLOR_TRANSPARENT); + dc.setPenWidth(4); + dc.drawArc(midW, midH, midW-2, Graphics.ARC_CLOCKWISE, -hDeg+5, -hDeg-5); + + compass.setBearing(bDeg); + compass.draw(dc); + + dc.setColor(Graphics.COLOR_WHITE, Graphics.COLOR_TRANSPARENT); + dc.drawText(midW, y, Graphics.FONT_MEDIUM, stop["name"], Graphics.TEXT_JUSTIFY_CENTER + Graphics.TEXT_JUSTIFY_VCENTER); + + y += dc.getFontAscent(Graphics.FONT_SMALL) + dc.getFontDescent(Graphics.FONT_MEDIUM); + + if (stop["indicator"].length() > 0) { + dc.setColor(Graphics.COLOR_WHITE, Graphics.COLOR_TRANSPARENT); + dc.drawText(midW, y, Graphics.FONT_SMALL, stop["indicator"], Graphics.TEXT_JUSTIFY_CENTER + Graphics.TEXT_JUSTIFY_VCENTER); + } + + y += dc.getFontAscent(Graphics.FONT_TINY) + dc.getFontDescent(Graphics.FONT_SMALL); + + dc.setColor(Graphics.COLOR_LT_GRAY, Graphics.COLOR_TRANSPARENT); + dc.drawText(midW, y, Graphics.FONT_TINY, dist, Graphics.TEXT_JUSTIFY_CENTER); + + y += dc.getFontAscent(Graphics.FONT_TINY) + dc.getFontDescent(Graphics.FONT_TINY); + + dc.drawText(midW, y, Graphics.FONT_TINY, bearing, Graphics.TEXT_JUSTIFY_CENTER); + + app.stopId = stop["id"]; + } + else { + dc.drawText(midW, midH, Graphics.FONT_SMALL, "No stops found!", Graphics.TEXT_JUSTIFY_CENTER); + } + } + else { + dc.drawText(midW, midH, Graphics.FONT_SMALL, "Loading...", Graphics.TEXT_JUSTIFY_CENTER); + } + } + + function updateStops() { + var degs = position.position.toDegrees(); + var params = { + "latitude" => degs[0], + "longitude" => degs[1], + "distance" => 10000, + "limit" => 50 + }; + + var options = { + :method => Communications.HTTP_REQUEST_METHOD_GET, + :responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON + }; + + Communications.makeWebRequest(app.api_url + "/stops", params, options, method(:requestCompleted)); } function requestCompleted(responseCode, data) { - Sys.println("Request completed: " + responseCode); + System.println("Request completed: " + responseCode); if (responseCode == 200) { - schedule = data; - redraw(); + stops = data; + WatchUi.requestUpdate(); } } - - function redraw() { - WatchUi.requestUpdate(); - } } diff --git a/connectiq/source/DepartureDelegate.mc b/connectiq/source/DepartureDelegate.mc new file mode 100644 index 0000000..0dbf09a --- /dev/null +++ b/connectiq/source/DepartureDelegate.mc @@ -0,0 +1,36 @@ +using Toybox.WatchUi; + +class DepartureDelegate extends WatchUi.BehaviorDelegate { + var app; + + function initialize(a) { + WatchUi.BehaviorDelegate.initialize(); + + app = a; + } + + function onNextPage() { + app.offset += 1; + + WatchUi.requestUpdate(); + + return true; + } + + function onPreviousPage() { + if (app.offset > 0) { + app.offset -= 1; + + WatchUi.requestUpdate(); + } + + return true; + } + + function onBack() { + app.offset = 0; + WatchUi.popView(WatchUi.SLIDE_RIGHT); + + return true; + } +} \ No newline at end of file diff --git a/connectiq/source/DepartureView.mc b/connectiq/source/DepartureView.mc new file mode 100644 index 0000000..f43cf82 --- /dev/null +++ b/connectiq/source/DepartureView.mc @@ -0,0 +1,84 @@ +using Toybox.WatchUi; +using Toybox.Graphics; +using Toybox.System; +using Toybox.Communications; +using Toybox.Timer; + +class DepartureView extends WatchUi.View { + var departures = null; + var tmr; + var app; + + function initialize(a) { + WatchUi.View.initialize(); + + app = a; + + updateDepartures(); + } + + function onLayout(dc) { + + } + + function onShow() { + tmr = new Timer.Timer(); + tmr.start(method(:updateDepartures), 10000, true); + } + + + function onHide() { + tmr.stop(); + } + + function onUpdate(dc) { + dc.setColor(Graphics.COLOR_TRANSPARENT, Graphics.COLOR_BLACK); + dc.clear(); + dc.setColor(Graphics.COLOR_WHITE, Graphics.COLOR_TRANSPARENT); + + var mid = dc.getWidth() / 2; + var top = Graphics.getFontAscent(Graphics.FONT_SMALL); + + if (departures != null) { + if (departures.size() > 0) { + for (var i = app.offset; i < departures.size(); i++) { + var dep = departures[i]; + + dc.drawText(mid, top, Graphics.FONT_SMALL, dep["line"] + " " + dep["dest"], Graphics.TEXT_JUSTIFY_CENTER); + top += Graphics.getFontAscent(Graphics.FONT_TINY); + dc.drawText(mid, top, Graphics.FONT_XTINY, dep["delta_str"], Graphics.TEXT_JUSTIFY_CENTER); + + top += Graphics.getFontHeight(Graphics.FONT_SMALL); + } + } + else { + dc.drawText( (dc.getWidth() / 2), (dc.getHeight() / 2), Graphics.FONT_SMALL, "No departures!", Graphics.TEXT_JUSTIFY_CENTER ); + } + } + else { + dc.drawText( (dc.getWidth() / 2), (dc.getHeight() / 2), Graphics.FONT_SMALL, "Loading...", Graphics.TEXT_JUSTIFY_CENTER ); + } + } + + function updateDepartures() { + var parameters = { + "id" => app.stopId, + "limit" => 10 + }; + var options = { + :method => Communications.HTTP_REQUEST_METHOD_GET, + :responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON + }; + + Communications.makeWebRequest(app.api_url + "/departures", parameters, options, method(:requestCompleted)); + } + + function requestCompleted(responseCode, data) { + System.println("Request completed: " + responseCode); + + if (responseCode == 200) { + departures = data; + WatchUi.requestUpdate(); + } + } +} diff --git a/rev-eng/script.sh b/rev-eng/script.sh new file mode 100644 index 0000000..54f45ec --- /dev/null +++ b/rev-eng/script.sh @@ -0,0 +1,8 @@ +API_BASE="http://ivu.aseag.de/interfaces/ura" + +LOC="50.7802655,6.0752138,400" +RL="StopPointName,StopID,StopPointState,StopPointIndicator,Latitude,Longitude,VisitNumber,TripID,VehicleID,LineID,LineName,DirectionID,DestinationName,DestinationText,EstimatedTime,BaseVersion" + +# curl "${API_BASE}/location?searchString=*&maxResults=10000" | jq . + +curl "${API_BASE}/instant_V1?Circle=${LOC}&StopPointState=0&ReturnList=${RL}"