@@ -43,6 +43,13 @@ class ATEM
4343 Program : 0x01
4444 Preview : 0x02
4545
46+ @PacketFlag =
47+ Sync : 0x01
48+ Connect : 0x02
49+ Repeat : 0x04
50+ Unknown : 0x08
51+ Ack : 0x10
52+
4653 state :
4754 tallys : []
4855 channels : {}
@@ -57,27 +64,30 @@ class ATEM
5764
5865 connected : false
5966 localPackedId : 1
67+ sessionId : []
6068
61- constructor : (local_port = 0 ) ->
62- local_port ||= 1024 + Math .floor (Math .random () * 64511 ) # 1024-65535
63-
64- @socket = dgram .createSocket ' udp4'
65- @socket .on ' message' , @_receivePacket
66- @socket .bind local_port
67- @sessionId = []
69+ constructor : ->
6870 @event = new EventEmitter
6971 @event .on ' ping' , (err ) =>
70- @lastPingedAt = new Date ().getTime ()
72+ @lastConnectAt = new Date ().getTime ()
7173
7274 setInterval ( =>
73- if @lastPingedAt + RECONNECT_INTERVAL < new Date ().getTime ()
74- if @connected
75- @connected = false
76- @event .emit ' disconnect' , null , null
77- @ connect (@address , @port ) if @lastPingedAt + RECONNECT_INTERVAL < new Date ().getTime ()
75+ return if @lastConnectAt + RECONNECT_INTERVAL > new Date ().getTime ()
76+ if @connected
77+ @connected = false
78+ @event .emit ' disconnect' , null , null
79+ @localPackedId = 1
80+ @sessionId = []
81+ @ connect (@address , @port )
7882 , RECONNECT_INTERVAL)
7983
80- connect : (@address , @port = DEFAULT_PORT ) ->
84+ connect : (@address , @port = DEFAULT_PORT , local_port = 0 ) ->
85+ local_port ||= 1024 + Math .floor (Math .random () * 64511 ) # 1024-65535
86+
87+ @socket = dgram .createSocket ' udp4'
88+ @socket .on ' message' , @_receivePacket
89+ @socket .bind local_port
90+
8191 @ _sendPacket COMMAND_CONNECT_HELLO
8292
8393 on : (name , callback ) ->
@@ -114,19 +124,16 @@ class ATEM
114124
115125 _receivePacket : (message , remote ) =>
116126 length = ((message[0 ] & 0x07 ) << 8 ) | message[1 ]
117- flags = message[0 ] >> 3
118127 return if length != remote .size
119-
128+ flags = message[ 0 ] >> 3
120129 @sessionId = [message[2 ], message[3 ]]
121- # if flags != 0x00
122- # console.log "non zero flag", flags, message
123- # @remotePacketId = message[10] << 8 | message[11]
124- if remote .size == 20 # Bad
130+
131+ if flags & ATEM .PacketFlag .Connect
125132 @ _sendPacket COMMAND_CONNECT_HELLO_ANSWER
126- @event . once ' ping ' , ( err ) => # Bad
133+ unless @connected
127134 @connected = true
128135 @event .emit ' connect' , null , null
129- else if flags & 0x01 || flags & 0x02
136+ else if flags & ATEM . PacketFlag . Sync
130137 @ _sendPacket [
131138 0x80 , 0x0C , @sessionId [0 ], @sessionId [1 ],
132139 message[10 ], message[11 ], 0x00 , 0x00 ,
0 commit comments