antosdk-apps/RemoteCamera/coffees/main.coffee

177 lines
5.2 KiB
CoffeeScript
Raw Normal View History

2020-12-28 21:25:42 +01:00
class RemoteCamera extends this.OS.application.BaseApplication
constructor: ( args ) ->
super "RemoteCamera", args
main: () ->
@mute = false
@player = @find "player"
@qctl = @find "qctl"
@fpsctl = @find "fpsctl"
@cam_setting = {
w: 640,
h: 480,
fps: 10,
quality: 60
}
fps = []
for i in [5..30] by 5
fps.push {
text: "#{i}",
value: i
}
@fpsctl.data = fps
@fpsctl.selected = @cam_setting.fps/5 -1
@fpsctl.onlistselect = (e) =>
return if @mute
@cam_setting.fps = e.data.item.data.value
@setCameraSetting()
@qctl.value = @cam_setting.quality
@resoctl = @find "resoctl"
@resoctl.data = [
{
text: __("320x240"),
mode: "qvga"
},
{
text: __("640x480"),
selected: true,
mode: "vga"
},
{
text: __("800x600"),
mode: "svga"
},
{
text: __("1024x760"),
mode: "hd"
},
{
text: __("1920×1080"),
mode: "fhd"
}
]
@resoctl.onlistselect = (e) =>
return if @mute
switch e.data.item.data.mode
when "qvga"
@cam_setting.w = 320
@cam_setting.h = 240
when "vga"
@cam_setting.w = 640
@cam_setting.h = 480
when "svga"
@cam_setting.w = 800
@cam_setting.h = 600
when "hd"
@cam_setting.w = 1024
@cam_setting.h = 768
when "fhd"
@cam_setting.w = 1920
@cam_setting.h = 1080
@setCameraSetting()
@qctl.onvaluechange = (e) =>
return if @mute
@cam_setting.quality = e.data
@setCameraSetting()
return @notify __("Antunnel service is not available") unless Antunnel.tunnel
if not @setting.channel
@requestChannel()
else
@openSession()
requestChannel: () ->
@openDialog "PromptDialog", {
title: __("Enter camera channel"),
label: __("Please enter camera channel name")
}
.then (v) =>
@setting.channel = v
@openSession()
menu: () ->
{
text: "__(Option)",
nodes: [
{ text: "__(Camera channel)" }
],
onchildselect: (e) => @requestChannel()
}
openSession: () ->
return unless Antunnel
return unless @setting.channel
@tunnel = Antunnel.tunnel
@sub = new Antunnel.Subscriber(@setting.channel)
@sub.onopen = () =>
console.log("Subscribed to camera channel")
@sub.onerror = (e) =>
@error __("Error: {0}", new TextDecoder("utf-8").decode(e.data)), e
#@sub = undefined
@sub.onctrl = (e) =>
@cam_setting.w = Antunnel.Msg.int_from(e.data,0)
@cam_setting.h = Antunnel.Msg.int_from(e.data,2)
@cam_setting.fps = e.data[4]
@cam_setting.quality = e.data[5]
@mute = true
@qctl.value = @cam_setting.quality
res = "#{@cam_setting.w}x#{@cam_setting.h}"
switch res
when "320x240"
@resoctl.selected = 0
when "640x480"
@resoctl.selected = 1
when "800x600"
@resoctl.selected = 2
when "1024x768"
@resoctl.selected = 3
when "1920x1080"
@resoctl.selected = 4
@fpsctl.selected = @cam_setting.fps/5 -1
@mute = false
@sub.onmessage = (e) =>
jpeg = new JpegImage()
jpeg.parse e.data
context = @player.getContext("2d")
@player.width = jpeg.width
@player.height = jpeg.height
#jpeg.copyToImageData(d)
imgData = context.getImageData(0,0,jpeg.width,jpeg.height)
jpeg.copyToImageData imgData
context.putImageData(imgData, 0, 0)
@sub.onclose = () =>
@sub = undefined
@notify __("Unsubscribed to the camera service")
@quit()
Antunnel.tunnel.subscribe @sub
cleanup: () ->
@sub.close() if @sub
setCameraSetting: () ->
return unless @sub
arr = new Uint8Array(6)
arr.set Antunnel.Msg.bytes_of(@cam_setting.w), 0
arr.set Antunnel.Msg.bytes_of(@cam_setting.h), 2
arr[4] = @cam_setting.fps
arr[5] = @cam_setting.quality
@sub.send Antunnel.Msg.CTRL, arr
RemoteCamera.singleton = true
RemoteCamera.dependencies = [
"pkg://libjpeg/jpg.js"
]
this.OS.register "RemoteCamera", RemoteCamera