initial commit
This commit is contained in:
commit
b70cbfbad8
231
hosted.lua
Normal file
231
hosted.lua
Normal file
|
@ -0,0 +1,231 @@
|
|||
--[[
|
||||
|
||||
Part of info-beamer hosted. You can find the latest version
|
||||
of this file at:
|
||||
|
||||
https://github.com/info-beamer/package-sdk
|
||||
|
||||
Copyright (c) 2014,2015,2016,2017 Florian Wesch <fw@dividuum.de>
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
]]--
|
||||
|
||||
local resource_types = {
|
||||
["image"] = function(value)
|
||||
local surface
|
||||
local image = {
|
||||
asset_name = value.asset_name,
|
||||
filename = value.filename,
|
||||
type = value.type,
|
||||
}
|
||||
|
||||
function image.ensure_loaded()
|
||||
if not surface then
|
||||
surface = resource.load_image(value.asset_name)
|
||||
end
|
||||
return surface
|
||||
end
|
||||
function image.load()
|
||||
image.ensure_loaded()
|
||||
local state = surface:state()
|
||||
return state ~= "loading"
|
||||
end
|
||||
function image.get_surface()
|
||||
return image.ensure_loaded()
|
||||
end
|
||||
function image.draw(...)
|
||||
image.ensure_loaded():draw(...)
|
||||
end
|
||||
function image.unload()
|
||||
if surface then
|
||||
surface:dispose()
|
||||
surface = nil
|
||||
end
|
||||
end
|
||||
function image.get_config()
|
||||
return image
|
||||
end
|
||||
return image
|
||||
end;
|
||||
["video"] = function(value)
|
||||
local surface
|
||||
local video = {
|
||||
asset_name = value.asset_name,
|
||||
filename = value.filename,
|
||||
type = value.type,
|
||||
}
|
||||
function video.ensure_loaded(opt)
|
||||
if not surface then
|
||||
surface = util.videoplayer(value.asset_name, opt)
|
||||
end
|
||||
return surface
|
||||
end
|
||||
function video.load(opt)
|
||||
video.ensure_loaded(opt)
|
||||
local state = surface:state()
|
||||
return state ~= "loading"
|
||||
end
|
||||
function video.get_surface(opt)
|
||||
return video.ensure_loaded(opt)
|
||||
end
|
||||
function video.draw(...)
|
||||
video.ensure_loaded():draw(...)
|
||||
end
|
||||
function video.unload()
|
||||
if surface then
|
||||
surface:dispose()
|
||||
surface = nil
|
||||
end
|
||||
end
|
||||
function video.get_config()
|
||||
return video
|
||||
end
|
||||
return video
|
||||
end;
|
||||
["child"] = function(value)
|
||||
local surface
|
||||
local child = {
|
||||
asset_name = value.asset_name,
|
||||
filename = value.filename,
|
||||
type = value.type,
|
||||
}
|
||||
function child.ensure_loaded()
|
||||
if surface then
|
||||
surface:dispose()
|
||||
end
|
||||
surface = resource.render_child(value.asset_name)
|
||||
return surface
|
||||
end
|
||||
function child.load()
|
||||
return true
|
||||
end
|
||||
function child.get_surface()
|
||||
return child.ensure_loaded()
|
||||
end
|
||||
function child.draw(...)
|
||||
child.ensure_loaded():draw(...)
|
||||
end
|
||||
function child.unload()
|
||||
if surface then
|
||||
surface:dispose()
|
||||
surface = nil
|
||||
end
|
||||
end
|
||||
function child.get_config()
|
||||
return child
|
||||
end
|
||||
return child
|
||||
end;
|
||||
["json"] = function(value)
|
||||
return require("json").decode(value)
|
||||
end;
|
||||
}
|
||||
|
||||
local types = {
|
||||
["date"] = function(value)
|
||||
return value
|
||||
end;
|
||||
["json"] = function(value)
|
||||
return value
|
||||
end;
|
||||
["text"] = function(value)
|
||||
return value
|
||||
end;
|
||||
["string"] = function(value)
|
||||
return value
|
||||
end;
|
||||
["integer"] = function(value)
|
||||
return value
|
||||
end;
|
||||
["select"] = function(value)
|
||||
return value
|
||||
end;
|
||||
["device"] = function(value)
|
||||
return value
|
||||
end;
|
||||
["boolean"] = function(value)
|
||||
return value
|
||||
end;
|
||||
["duration"] = function(value)
|
||||
return value
|
||||
end;
|
||||
["custom"] = function(value)
|
||||
return value
|
||||
end;
|
||||
["color"] = function(value)
|
||||
local color = {}
|
||||
color.r = value.r
|
||||
color.g = value.g
|
||||
color.b = value.b
|
||||
color.a = value.a
|
||||
color.rgba_table = {color.r, color.g, color.b, color.a}
|
||||
color.rgba = function()
|
||||
return color.r, color.g, color.b, color.a
|
||||
end
|
||||
color.rgb_with_a = function(a)
|
||||
return color.r, color.g, color.b, a
|
||||
end
|
||||
color.clear = function()
|
||||
gl.clear(color.r, color.g, color.b, color.a)
|
||||
end
|
||||
return color
|
||||
end;
|
||||
["resource"] = function(value)
|
||||
return resource_types[value.type](value)
|
||||
end;
|
||||
["font"] = function(value)
|
||||
return resource.load_font(value.asset_name)
|
||||
end;
|
||||
}
|
||||
|
||||
local function parse_config(options, config)
|
||||
local function parse_recursive(options, config, target)
|
||||
for _, option in ipairs(options) do
|
||||
local name = option.name
|
||||
if name then
|
||||
if option.type == "list" then
|
||||
local list = {}
|
||||
for _, child_config in ipairs(config[name]) do
|
||||
local child = {}
|
||||
parse_recursive(option.items, child_config, child)
|
||||
list[#list + 1] = child
|
||||
end
|
||||
target[name] = list
|
||||
else
|
||||
target[name] = types[option.type](config[name])
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
local current_config = {}
|
||||
parse_recursive(options, config, current_config)
|
||||
return current_config
|
||||
end
|
||||
|
||||
return {
|
||||
parse_config = parse_config;
|
||||
}
|
38
node.lua
Normal file
38
node.lua
Normal file
|
@ -0,0 +1,38 @@
|
|||
util.init_hosted()
|
||||
|
||||
local json = require "json"
|
||||
|
||||
local serial = sys.get_env "SERIAL"
|
||||
local location = "<please wait>"
|
||||
local description = "<please wait>"
|
||||
|
||||
util.data_mapper{
|
||||
["device_info"] = function(info)
|
||||
info = json.decode(info)
|
||||
location = info.location
|
||||
description = info.description
|
||||
end
|
||||
}
|
||||
|
||||
gl.setup(NATIVE_WIDTH, NATIVE_HEIGHT)
|
||||
|
||||
card = resource.load_image("testcard.png")
|
||||
font = resource.load_font("vera.ttf")
|
||||
|
||||
function node.render()
|
||||
gl.clear(0,0,0,1)
|
||||
|
||||
card:draw(0, 0, 1920, 1080)
|
||||
|
||||
-- upper: 623
|
||||
-- lower: 707
|
||||
|
||||
upper_text = "C3VOC: " .. description
|
||||
lower_text = location .. " - Serial " .. serial
|
||||
|
||||
upper_width = font:width(upper_text, 40)
|
||||
font:write(1920-(upper_width/2), 631, upper_text, 40, 1,1,1,1)
|
||||
|
||||
lower_width = font:width(lower_text, 20)
|
||||
font:write(1920-(lower_width/2), 679, lower_text, 20, 1,1,1,1)
|
||||
end
|
20
package.json
Normal file
20
package.json
Normal file
|
@ -0,0 +1,20 @@
|
|||
{
|
||||
"name": "c3voc testcard",
|
||||
"author": "Kunsi <kunsi@c3voc.de>",
|
||||
"desc": "testcard",
|
||||
"repository": "https://git.kunsmann.eu/kunsi/icinga2beamer",
|
||||
"nesting": {
|
||||
"parents": [
|
||||
"top-level"
|
||||
],
|
||||
"childs": "any"
|
||||
},
|
||||
"platforms": [
|
||||
"pi/epoch-1",
|
||||
"pi/epoch-2"
|
||||
],
|
||||
"offline": {
|
||||
"support": "no",
|
||||
"info": "Needs to fetch information about itself from info-beamer api"
|
||||
}
|
||||
}
|
BIN
package.png
Normal file
BIN
package.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.7 KiB |
27
service
Normal file
27
service
Normal file
|
@ -0,0 +1,27 @@
|
|||
#!/usr/bin/python
|
||||
|
||||
import time
|
||||
import traceback
|
||||
|
||||
from hosted import api, node
|
||||
|
||||
|
||||
def fetch_info():
|
||||
info = api.device_info.get()
|
||||
print >> sys.stderr, info
|
||||
node["/device_info"](
|
||||
dict(
|
||||
description=info["description"],
|
||||
location=info["location"],
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
while 1:
|
||||
try:
|
||||
fetch_info()
|
||||
except:
|
||||
traceback.print_exc()
|
||||
finally:
|
||||
time.sleep(15)
|
BIN
testcard.png
Normal file
BIN
testcard.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 61 KiB |
47
vera.txt
Normal file
47
vera.txt
Normal file
|
@ -0,0 +1,47 @@
|
|||
Bitstream Vera Fonts Copyright
|
||||
|
||||
Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream
|
||||
Vera is a trademark of Bitstream, Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the fonts accompanying this license ("Fonts") and associated
|
||||
documentation files (the "Font Software"), to reproduce and distribute
|
||||
the Font Software, including without limitation the rights to use,
|
||||
copy, merge, publish, distribute, and/or sell copies of the Font
|
||||
Software, and to permit persons to whom the Font Software is furnished
|
||||
to do so, subject to the following conditions:
|
||||
|
||||
The above copyright and trademark notices and this permission notice
|
||||
shall be included in all copies of one or more of the Font Software
|
||||
typefaces.
|
||||
|
||||
The Font Software may be modified, altered, or added to, and in
|
||||
particular the designs of glyphs or characters in the Fonts may be
|
||||
modified and additional glyphs or characters may be added to the
|
||||
Fonts, only if the fonts are renamed to names not containing either
|
||||
the words "Bitstream" or the word "Vera".
|
||||
|
||||
This License becomes null and void to the extent applicable to Fonts
|
||||
or Font Software that has been modified and is distributed under the
|
||||
"Bitstream Vera" names.
|
||||
|
||||
The Font Software may be sold as part of a larger software package but
|
||||
no copy of one or more of the Font Software typefaces may be sold by
|
||||
itself.
|
||||
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL
|
||||
BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL,
|
||||
OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT
|
||||
SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the names of Gnome, the Gnome
|
||||
Foundation, and Bitstream Inc., shall not be used in advertising or
|
||||
otherwise to promote the sale, use or other dealings in this Font
|
||||
Software without prior written authorization from the Gnome Foundation
|
||||
or Bitstream Inc., respectively. For further information, contact:
|
||||
fonts at gnome dot org.
|
Loading…
Reference in a new issue