diff options
-rw-r--r-- | README.md | 10 | ||||
-rw-r--r-- | package.json | 5 | ||||
-rw-r--r-- | src/config.json | 20 | ||||
-rw-r--r-- | src/index.html | 42 | ||||
-rw-r--r-- | src/index.js | 10 | ||||
-rw-r--r-- | src/js/AFB.js | 215 | ||||
-rw-r--r-- | src/js/apps.js | 44 | ||||
-rw-r--r-- | src/js/buttons.js | 38 | ||||
-rw-r--r-- | src/js/chair.js | 33 | ||||
-rw-r--r-- | src/js/fan_speed.js | 29 | ||||
-rw-r--r-- | src/js/main.js | 5 | ||||
-rw-r--r-- | src/js/temperature.js | 89 | ||||
-rw-r--r-- | webpack.config.js | 6 |
13 files changed, 100 insertions, 446 deletions
@@ -0,0 +1,10 @@ +su agl-driver + +afm-util kill homescreen@0.1 +afm-util kill launcher@0.1 + +afm-util remove homescreen@0.1 +afm-util remove launcher@0.1 + +afm-util run webapps-html5-homescreen@1.0 + diff --git a/package.json b/package.json index 4d5a563..ede4d0d 100644 --- a/package.json +++ b/package.json @@ -35,5 +35,8 @@ "webpack-dev-server": "^3.7.2", "zip-webpack-plugin": "^3.0.0" }, - "dependencies": {} + "dependencies": { + "agl-js-api": "git@bitbucket.org:smarsol/agl-js-api.git#master", + "mustache": "^3.1.0" + } } diff --git a/src/config.json b/src/config.json new file mode 100644 index 0000000..6a68312 --- /dev/null +++ b/src/config.json @@ -0,0 +1,20 @@ +{ + "apps": [ + { + "id": "launcher", + "icon": "icon icon-home" + }, + { + "id": "mediaplayer", + "icon": "icon icon-music" + }, + { + "id": "hvac", + "icon": "icon icon-thermometer" + }, + { + "id": "navigation", + "icon": "icon icon-location" + } + ] +}
\ No newline at end of file diff --git a/src/index.html b/src/index.html index f4e3a38..3a6d612 100644 --- a/src/index.html +++ b/src/index.html @@ -22,38 +22,16 @@ </head> <body> <div class="top"> - <a href="#" class="button"> - <div class="icon icon-home"> - - </div> - <div class="label"> - LAUNCHER - </div> - </a> - <a href="#" class="button"> - <div class="icon icon-music"> - - </div> - <div class="label"> - MEDIAPLAYER - </div> - </a> - <a href="#" class="button"> - <div class="icon icon-thermometer"> - - </div> - <div class="label"> - HVAC - </div> - </a> - <a href="#" class="button"> - <div class="icon icon-location"> - - </div> - <div class="label"> - NAVIGATION - </div> - </a> + <script id="app-template" type="x-tmpl-mustache"> + <a href="#" class="button" id="app-{{id}}" app-id="{{ id }}" onclick="window.start(this);"> + <div class="{{ icon }}"> + + </div> + <div class="label"> + {{ name }} + </div> + </a> + </script> <div class="infoContainer"> <div class="infoItem day"> TUESDAY diff --git a/src/index.js b/src/index.js index 962b5a6..7b6f84c 100644 --- a/src/index.js +++ b/src/index.js @@ -14,8 +14,10 @@ * limitations under the License. */ -/* JS */ -import './js/AFB.js'; - /* CSS */ -import './styles/app.scss';
\ No newline at end of file +import './styles/app.scss'; +import { init } from './js/main'; +import { start } from './js/apps'; + +window.start = start; +init();
\ No newline at end of file diff --git a/src/js/AFB.js b/src/js/AFB.js deleted file mode 100644 index d6e6bfa..0000000 --- a/src/js/AFB.js +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright (C) 2017, 2018 "IoT.bzh" - * Author: José Bollo <jose.bollo@iot.bzh> - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -AFB = function(base, initialtoken){ - -if (typeof base != "object") - base = { base: base, token: initialtoken }; - -var initial = { - base: base.base || "api", - token: base.token || initialtoken || "HELLO", - host: base.host || window.location.host, - url: base.url || undefined -}; - -var urlws = initial.url || "ws://"+initial.host+"/"+initial.base; - -/*********************************************/ -/**** ****/ -/**** AFB_context ****/ -/**** ****/ -/*********************************************/ -var AFB_context; -{ - var UUID = undefined; - var TOKEN = initial.token; - - var context = function(token, uuid) { - this.token = token; - this.uuid = uuid; - } - - context.prototype = { - get token() {return TOKEN;}, - set token(tok) {if(tok) TOKEN=tok;}, - get uuid() {return UUID;}, - set uuid(id) {if(id) UUID=id;} - }; - - AFB_context = new context(); -} -/*********************************************/ -/**** ****/ -/**** AFB_websocket ****/ -/**** ****/ -/*********************************************/ -var AFB_websocket; -{ - var CALL = 2; - var RETOK = 3; - var RETERR = 4; - var EVENT = 5; - - var PROTO1 = "x-afb-ws-json1"; - - AFB_websocket = function(on_open, on_abort) { - var u = urlws, p = '?'; - if (AFB_context.token) { - u = u + '?x-afb-token=' + AFB_context.token; - p = '&'; - } - if (AFB_context.uuid) - u = u + p + 'x-afb-uuid=' + AFB_context.uuid; - this.ws = new WebSocket(u, [ PROTO1 ]); - this.url = u; - this.pendings = {}; - this.awaitens = {}; - this.counter = 0; - this.ws.onopen = onopen.bind(this); - this.ws.onerror = onerror.bind(this); - this.ws.onclose = onclose.bind(this); - this.ws.onmessage = onmessage.bind(this); - this.onopen = on_open; - this.onabort = on_abort; - } - - function onerror(event) { - var f = this.onabort; - if (f) { - delete this.onopen; - delete this.onabort; - f && f(this); - } - this.onerror && this.onerror(this); - } - - function onopen(event) { - var f = this.onopen; - delete this.onopen; - delete this.onabort; - f && f(this); - } - - function onclose(event) { - var err = { - jtype: 'afb-reply', - request: { - status: 'disconnected', - info: 'server hung up' - } - }; - for (var id in this.pendings) { - try { this.pendings[id][1](err); } catch (x) {/*NOTHING*/} - } - this.pendings = {}; - this.onclose && this.onclose(); - } - - function fire(awaitens, name, data) { - var a = awaitens[name]; - if (a) - a.forEach(function(handler){handler(data);}); - var i = name.indexOf("/"); - if (i >= 0) { - a = awaitens[name.substring(0,i)]; - if (a) - a.forEach(function(handler){handler(data);}); - } - a = awaitens["*"]; - if (a) - a.forEach(function(handler){handler(data);}); - } - - function reply(pendings, id, ans, offset) { - if (id in pendings) { - var p = pendings[id]; - delete pendings[id]; - try { p[offset](ans); } catch (x) {/*TODO?*/} - } - } - - function onmessage(event) { - var obj = JSON.parse(event.data); - var code = obj[0]; - var id = obj[1]; - var ans = obj[2]; - AFB_context.token = obj[3]; - switch (code) { - case RETOK: - reply(this.pendings, id, ans, 0); - break; - case RETERR: - reply(this.pendings, id, ans, 1); - break; - case EVENT: - default: - fire(this.awaitens, id, ans); - break; - } - } - - function close() { - this.ws.close(); - this.ws.onopen = - this.ws.onerror = - this.ws.onclose = - this.ws.onmessage = - this.onopen = - this.onabort = function(){}; - } - - function call(method, request, callid) { - return new Promise((function(resolve, reject){ - var id, arr; - if (callid) { - id = String(callid); - if (id in this.pendings) - throw new Error("pending callid("+id+") exists"); - } else { - do { - id = String(this.counter = 4095 & (this.counter + 1)); - } while (id in this.pendings); - } - this.pendings[id] = [ resolve, reject ]; - arr = [CALL, id, method, request ]; - if (AFB_context.token) arr.push(AFB_context.token); - this.ws.send(JSON.stringify(arr)); - }).bind(this)); - } - - function onevent(name, handler) { - var id = name; - var list = this.awaitens[id] || (this.awaitens[id] = []); - list.push(handler); - } - - AFB_websocket.prototype = { - close: close, - call: call, - onevent: onevent - }; -} -/*********************************************/ -/**** ****/ -/**** ****/ -/**** ****/ -/*********************************************/ -return { - context: AFB_context, - ws: AFB_websocket -}; -}; diff --git a/src/js/apps.js b/src/js/apps.js new file mode 100644 index 0000000..73d926e --- /dev/null +++ b/src/js/apps.js @@ -0,0 +1,44 @@ +import { afmMain } from 'agl-js-api'; +import Mustache from 'mustache'; + +var configjson = require('../config.json'); +var template; +var parent; + +function renderApp(app) { + parent.innerHTML = Mustache.render(template, app) + parent.innerHTML; +} + +function locateApp(appId, appList) { + return appList.find(function(app){ + return app.id.split('@')[0] === appId + }); +} + +function load_application_list() { + afmMain.runnables().then(function(result) { + configjson.apps.forEach(function(app) { + var internalApp = locateApp(app.id, result); + + renderApp({ + id: internalApp.id, + name: internalApp.name, + icon: app.icon + }); + }); + }); +} + +export function start(node) { + var appId = node.getAttribute('app-id'); + afmMain.start(appId).then(function(result) { + console.log("success: " + result); + }); +} + +export function init() { + template = document.getElementById('app-template').innerHTML; + parent = document.getElementById('app-template').parentNode + Mustache.parse(template); + load_application_list(); +}
\ No newline at end of file diff --git a/src/js/buttons.js b/src/js/buttons.js deleted file mode 100644 index 5fcb521..0000000 --- a/src/js/buttons.js +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2019 Igalia, S.L. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var buttons = { - ac: false, - auto: false, - circulation: false, - down: false, - up: false, - right: false, - rear: false, - front: false -}; - -function update(node, value) { - node.setAttribute('value', value); -} - -module.exports = { - toggle: function(node) { - var key = node.getAttribute('key'); - buttons[key] = !buttons[key]; - update(node, buttons[key]); - } -}
\ No newline at end of file diff --git a/src/js/chair.js b/src/js/chair.js deleted file mode 100644 index 5cd26e8..0000000 --- a/src/js/chair.js +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2019 Igalia, S.L. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var left = 0; -var right = 0; - -function update(node, value){ - node.setAttribute('value', value); -} - -module.exports = { - left: function(node) { - left = (left + 1) % 3; - update(node, left); - }, - right: function(node) { - right = (right + 1) % 3; - update(node, right); - }, -}
\ No newline at end of file diff --git a/src/js/fan_speed.js b/src/js/fan_speed.js deleted file mode 100644 index 8b131b5..0000000 --- a/src/js/fan_speed.js +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2019 Igalia, S.L. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var value = 0; - -function update(node, value) { - node.value = value; - node.parentNode.getElementsByTagName('progress')[0].value = value; -} - -module.exports = { - set: function(node) { - value = node.value; - update(node, value); - } -}
\ No newline at end of file diff --git a/src/js/main.js b/src/js/main.js new file mode 100644 index 0000000..c68f572 --- /dev/null +++ b/src/js/main.js @@ -0,0 +1,5 @@ +import { init as init_apps } from './apps'; + +export function init() { + init_apps(); +}
\ No newline at end of file diff --git a/src/js/temperature.js b/src/js/temperature.js deleted file mode 100644 index 3a394a1..0000000 --- a/src/js/temperature.js +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2019 Igalia, S.L. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var left = 22; -var right = 22; - -var lowTemperature = 15; -var hiTemperature = 30; -var temperatures = []; - -var isScrolling; -var elementHeight; - -function createTemperatureElement() { - var element = document.createElement('div'); - element.classList = ['temperature']; - element.style.height = elementHeight+'px'; - element.style.lineHeight = elementHeight+'px'; - return element; -} - -function update(node, index) { - node.scrollTop = index*elementHeight; - - for( var i=0; i<node.children.length; i++) { - node.children[i].setAttribute('enabled',false); - } - node.children[index].setAttribute('enabled', true); -} - -module.exports = { - left: function(node) { - clearTimeout(isScrolling); - - isScrolling = setTimeout(function(){ - var index = Math.round(node.scrollTop/elementHeight); - left = temperatures[index]; - update(node, index); - console.log('LEFT', left); - }, 100); - }, - right: function(node) { - clearTimeout(isScrolling); - - isScrolling = setTimeout(function(){ - var index = Math.round(node.scrollTop/elementHeight); - right = temperatures[index]; - update(node, index); - console.log('RIGHT', right); - }, 100); - }, - init: function() { - var leftTemperature = document.getElementById('lefttemperature'); - var rightTemperature = document.getElementById('righttemperature'); - elementHeight = leftTemperature.offsetHeight/2; - - for( var i=lowTemperature; i<=hiTemperature; i++) { - var element = createTemperatureElement(); - if( i === lowTemperature) { - element.innerHTML = 'LO'; - } else if( i === hiTemperature ) { - element.innerHTML = 'HI'; - } else { - element.innerHTML = i+'º'; - } - leftTemperature.appendChild(element); - rightTemperature.appendChild(element.cloneNode(true)); - temperatures[temperatures.length] = i; - } - leftTemperature.appendChild(createTemperatureElement()); - rightTemperature.appendChild(createTemperatureElement()); - - update(leftTemperature, temperatures.indexOf(left)); - update(rightTemperature, temperatures.indexOf(right)); - } -}
\ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js index c84169f..81d3966 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -10,11 +10,7 @@ const ZipPlugin = require('zip-webpack-plugin'); module.exports = { mode: 'production', entry: { - index: './src/index.js', - FANSPEED: './src/js/fan_speed.js', - CHAIR: './src/js/chair.js', - BUTTON: './src/js/buttons.js', - TEMPERATURE: './src/js/temperature.js' + index: './src/index.js' }, output: { path: __dirname + '/dist', |