diff options
Diffstat (limited to 'lib/osc.moon')
| -rw-r--r-- | lib/osc.moon | 76 |
1 files changed, 51 insertions, 25 deletions
diff --git a/lib/osc.moon b/lib/osc.moon index bced72f..e73a982 100644 --- a/lib/osc.moon +++ b/lib/osc.moon @@ -1,41 +1,67 @@ -import Op from require 'core' -import pack, unpack from require 'osc' +import Op, ValueInput, EventInput, ColdInput, match from require 'core' +import pack from require 'osc' import dns, udp from require 'socket' -class addr extends Op - @doc: "(remote host port) - UDP remote definition" +unpack or= table.unpack - new: => - super 'udp/remote' - @@udp or= udp! +class connect extends Op + @doc: "(osc/connect host port) - UDP remote definition" - setup: (params) => - super params - @assert_types 'str', 'num' + new: => super 'udp/socket' + + setup: (inputs) => + { host, port } = match 'str num', inputs + super + host: ValueInput host + port: ValueInput port tick: => - host, port = @unwrap_inputs! + { :host, :port } = @unwrap_all! ip = dns.toip host - @out\set { :ip, :port } -class out extends Op - @doc: "(out remote path val) - send a value via OSC" + @out\set with sock = udp! + \setpeername ip, port + +class send extends Op + @doc: "(osc/send socket path val) - send a value via OSC + +sends a message only when val is dirty." + + setup: (inputs) => + { socket, path, value } = match 'udp/socket str any', inputs + super + socket: ColdInput socket + path: ColdInput path + value: EventInput value + + tick: => + if @inputs.value\dirty! + { :socket, :path, :value } = @unwrap_all! + msg = if 'table' == type value + pack path, unpack value + else + pack path, value + socket\send msg + +class send_state extends Op + @doc: "(osc/send! socket path val) - synchronize a value via OSC - new: (...) => - @@udp or= udp! +sends a whenever any parameter changes." - setup: (params) => - super params - assert @inputs[3], "need a value" - @assert_types 'udp/remote', 'str', @inputs[3].type + setup: (inputs) => + { socket, path, value } = match 'udp/socket str any', inputs + super + socket: ValueInput socket + path: ValueInput path + value: ValueInput value tick: => - remote, path, value = @unwrap_inputs! - { :ip, :port } = remote + { :socket, :path, :value } = @unwrap_all! msg = pack path, value - @@udp\sendto msg, ip, port + socket\send msg { - :addr - :out + :connect + :send + 'send!': send_state } |
