mirror of
https://github.com/DCC-EX/CommandStation-EX.git
synced 2025-01-30 14:13:07 +01:00
websockets broadcast
This commit is contained in:
parent
2591d100ca
commit
c4e2146bd1
@ -45,6 +45,7 @@ template<typename... Targs> void CommandDistributor::broadcastReply(clientType t
|
||||
broadcastBufferWriter->flush();
|
||||
StringFormatter::send(broadcastBufferWriter, msg...);
|
||||
broadcastToClients(type);
|
||||
if (type==COMMAND_TYPE) broadcastToClients(WEBSOCKET_TYPE);
|
||||
}
|
||||
#else
|
||||
// on a single USB connection config, write direct to Serial and ignore flush/shove
|
||||
@ -76,6 +77,7 @@ void CommandDistributor::parse(byte clientId,byte * buffer, RingStream * stream
|
||||
auto websock=Websockets::checkConnectionString(clientId,buffer,stream);
|
||||
if (websock) {
|
||||
clients[clientId]=WEBSOCK_CONNECTING_TYPE;
|
||||
// websockets will have replied already
|
||||
return;
|
||||
}
|
||||
if (buffer[0] == '<')
|
||||
@ -149,7 +151,7 @@ void CommandDistributor::broadcastToClients(clientType type) {
|
||||
for (byte clientId=0; clientId<sizeof(clients); clientId++) {
|
||||
if (clients[clientId]==type) {
|
||||
//DIAG(F("CD mark client %d"), clientId);
|
||||
ring->mark(clientId);
|
||||
ring->mark(clientId | (type==WEBSOCKET_TYPE? Websockets::WEBSOCK_CLIENT_MARKER : 0));
|
||||
ring->print(broadcastBufferWriter->getString());
|
||||
//DIAG(F("CD commit client %d"), clientId);
|
||||
ring->commit();
|
||||
|
41
Release_Notes/websocketTester.html
Normal file
41
Release_Notes/websocketTester.html
Normal file
@ -0,0 +1,41 @@
|
||||
<html>
|
||||
<!-- Minimalist test page for the DCCEX websocket API.-->
|
||||
<head>
|
||||
<script>
|
||||
let socket = new WebSocket("ws://192.168.1.242:2560","DCCEX");
|
||||
|
||||
// send message from the form
|
||||
var sender = function() {
|
||||
var msg=document.getElementById('message').value;
|
||||
socket.send(msg);
|
||||
}
|
||||
// message received - show the message in div#messages
|
||||
socket.onmessage = function(event) {
|
||||
let message = event.data;
|
||||
|
||||
let messageElem = document.createElement('div');
|
||||
messageElem.textContent = message;
|
||||
document.getElementById('messages').prepend(messageElem);
|
||||
}
|
||||
socket.onerror = function(event) {
|
||||
let message = event.data;
|
||||
let messageElem = document.createElement('div');
|
||||
messageElem.textContent = message;
|
||||
document.getElementById('messages').prepend(messageElem);
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
This is a minimalist test page for the DCCEX websocket API.
|
||||
It demonstrates the Websocket connection and how to send
|
||||
or receive websocket traffic.
|
||||
The connection string must be edited to address your command station
|
||||
correctly.<p>
|
||||
<!-- message form -->
|
||||
|
||||
<input type="text" id="message">
|
||||
<input type="button" value="Send" onclick="sender();">
|
||||
<!-- div with messages -->
|
||||
<div id="messages"></div>
|
||||
</body>
|
||||
</html>
|
@ -28,6 +28,9 @@
|
||||
CommandDistributor pass it to this code
|
||||
checkConnectionString() to check for an HTTP
|
||||
protocol GET requesting a change to websocket protocol.
|
||||
[Note that the WifiInboundHandler has a shortcut to detecting this so that
|
||||
it does not need to use up 500+ bytes of RAM just to get at the one parameter that
|
||||
actually means something.]
|
||||
If that is found, the relevant answer is generated and queued and
|
||||
the CommandDistributor marks this client as a websocket client awaiting connection.
|
||||
Once the outbound handshake has completed, the CommandDistributor promotes the client
|
||||
|
Loading…
Reference in New Issue
Block a user