antosdk-apps/RemoteCamera/coffees/main.coffee
2020-12-28 20:25:42 +00:00

177 lines
5.2 KiB
CoffeeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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