9 changed files with 63 additions and 26 deletions
+4 -1
View File
@@ -43,7 +43,7 @@ namespace ClientApp.Utils
/// </summary> /// </summary>
private void initEngine() private void initEngine()
{ {
Debug.WriteLine("init engine"); Debug.WriteLine("[CLIENT] init engine");
engineConnection = EngineConnection.INSTANCE; engineConnection = EngineConnection.INSTANCE;
engineConnection.OnNoTunnelId = RetryEngineConnection; engineConnection.OnNoTunnelId = RetryEngineConnection;
engineConnection.OnSuccessFullConnection = engineConnected; engineConnection.OnSuccessFullConnection = engineConnected;
@@ -190,6 +190,9 @@ namespace ClientApp.Utils
expectedMessageLength = BitConverter.ToInt32(totalBuffer, 0); expectedMessageLength = BitConverter.ToInt32(totalBuffer, 0);
} }
if (ar == null || (!ar.IsCompleted) || (!this.stream.CanRead) || !this.client.Connected)
return;
ar.AsyncWaitHandle.WaitOne();
this.stream.BeginRead(this.buffer, 0, this.buffer.Length, new AsyncCallback(OnRead), null); this.stream.BeginRead(this.buffer, 0, this.buffer.Length, new AsyncCallback(OnRead), null);
} }
+5 -4
View File
@@ -27,7 +27,7 @@ namespace ClientApp.Utils
//new PC("DESKTOP-M2CIH87", "Fabian"), //new PC("DESKTOP-M2CIH87", "Fabian"),
//new PC("T470S", "Shinichi"), //new PC("T470S", "Shinichi"),
//new PC("DESKTOP-DHS478C", "semme"), //new PC("DESKTOP-DHS478C", "semme"),
//new PC("HP-ZBOOK-SEM", "Sem") new PC("HP-ZBOOK-SEM", "Sem")
//new PC("DESKTOP-TV73FKO", "Wouter"), //new PC("DESKTOP-TV73FKO", "Wouter"),
//new PC("DESKTOP-SINMKT1", "Ralf van Aert"), //new PC("DESKTOP-SINMKT1", "Ralf van Aert"),
//new PC("NA", "Bart") //new PC("NA", "Bart")
@@ -71,7 +71,7 @@ namespace ClientApp.Utils
updateTimer.AutoReset = true; updateTimer.AutoReset = true;
updateTimer.Enabled = false; updateTimer.Enabled = false;
noVRResponseTimer = new System.Timers.Timer(15000); noVRResponseTimer = new System.Timers.Timer(30000);
noVRResponseTimer.Elapsed += noVRResponseTimeout; noVRResponseTimer.Elapsed += noVRResponseTimeout;
noVRResponseTimer.AutoReset = false; noVRResponseTimer.AutoReset = false;
noVRResponseTimer.Enabled = false; noVRResponseTimer.Enabled = false;
@@ -236,14 +236,14 @@ namespace ClientApp.Utils
Write("Starting route follow..."); Write("Starting route follow...");
FollowingRoute = true; FollowingRoute = true;
SendMessageAndOnResponse(mainCommand.AddBikeModelAnim("bikeID", 0.01f), "bikeID", SendMessageAndOnResponse(mainCommand.AddBikeModel("bikeID"), "bikeID",
(message) => (message) =>
{ {
bikeId = JSONParser.GetResponseUuid(message); bikeId = JSONParser.GetResponseUuid(message);
SendMessageAndOnResponse(mainCommand.addPanel("panelAdd", bikeId), "panelAdd", SendMessageAndOnResponse(mainCommand.addPanel("panelAdd", bikeId), "panelAdd",
(message) => (message) =>
{ {
Write("got panel id");
panelId = JSONParser.getPanelID(message); panelId = JSONParser.getPanelID(message);
WriteTextMessage(mainCommand.ColorPanel(panelId)); WriteTextMessage(mainCommand.ColorPanel(panelId));
@@ -295,6 +295,7 @@ namespace ClientApp.Utils
public void UpdateInfoPanel() public void UpdateInfoPanel()
{ {
Write("updating info panel");
ShowPanel(BikeSpeed, (int)BikeBPM, (int)BikePower, (int)BikeResistance); ShowPanel(BikeSpeed, (int)BikeBPM, (int)BikePower, (int)BikeResistance);
WriteTextMessage(mainCommand.RouteSpeed(BikeSpeed, bikeId)); WriteTextMessage(mainCommand.RouteSpeed(BikeSpeed, bikeId));
WriteTextMessage(mainCommand.RouteSpeed(BikeSpeed, cameraId)); WriteTextMessage(mainCommand.RouteSpeed(BikeSpeed, cameraId));
+1 -1
View File
@@ -129,7 +129,7 @@ namespace DoctorApp.Utils
{ {
MainViewModel.TransferDataToClientBPM(payloadbytes); MainViewModel.TransferDataToClientBPM(payloadbytes);
} }
Array.Copy(totalBuffer, expectedMessageLength, totalBuffer, 0, (totalBufferReceived - expectedMessageLength)); //maybe unsafe idk
totalBufferReceived -= expectedMessageLength; totalBufferReceived -= expectedMessageLength;
expectedMessageLength = BitConverter.ToInt32(totalBuffer, 0); expectedMessageLength = BitConverter.ToInt32(totalBuffer, 0);
} }
+16 -3
View File
@@ -43,12 +43,14 @@ namespace DoctorApp.ViewModels
public MainWindowViewModel MainWindowViewModel { get; set; } public MainWindowViewModel MainWindowViewModel { get; set; }
private Client client; private Client client;
private MainViewModel parent;
public Chart Chart { get; set; } public Chart Chart { get; set; }
public ClientInfoViewModel(MainWindowViewModel mainWindowViewModel, string username) public ClientInfoViewModel(MainViewModel parent,MainWindowViewModel mainWindowViewModel, string username)
{ {
MainWindowViewModel = mainWindowViewModel; MainWindowViewModel = mainWindowViewModel;
this.parent = parent;
this.PatientInfo = new PatientInfo() { Username = username, Status = "Waiting to start" }; this.PatientInfo = new PatientInfo() { Username = username, Status = "Waiting to start" };
this.Chart = new Chart(this.PatientInfo); this.Chart = new Chart(this.PatientInfo);
PatientInfo.ChatLog = new ObservableCollection<string>(); PatientInfo.ChatLog = new ObservableCollection<string>();
@@ -68,12 +70,17 @@ namespace DoctorApp.ViewModels
Chat = new RelayCommand<object>((parameter) => Chat = new RelayCommand<object>((parameter) =>
{ {
client.sendMessage(DataParser.getChatJson(PatientInfo.Username, ((TextBox)parameter).Text)); SendMessageToClient(PatientInfo.Username, ((TextBox)parameter).Text);
PatientInfo.ChatLog.Add(DateTime.Now + ": " + ((TextBox)parameter).Text);
}); });
//TODO RelayCommand ChatToAll //TODO RelayCommand ChatToAll
ChatToAll = new RelayCommand<object>((parameter) =>
{
Debug.WriteLine("[CLIENTINFOVIEWMODEL] sending message to all clients");
this.parent?.SendToAllClients(((TextBox)parameter).Text);
});
SetResistance = new RelayCommand<object>((parameter) => SetResistance = new RelayCommand<object>((parameter) =>
{ {
Debug.WriteLine("resistance"); Debug.WriteLine("resistance");
@@ -83,6 +90,12 @@ namespace DoctorApp.ViewModels
} }
public void SendMessageToClient(string username, string text)
{
client.sendMessage(DataParser.getChatJson(username, text));
PatientInfo.ChatLog.Add(DateTime.Now + ": " + text);
}
public void BPMData(byte [] bytes) public void BPMData(byte [] bytes)
{ {
//TODO //TODO
+10 -1
View File
@@ -30,7 +30,7 @@ namespace DoctorApp.ViewModels
Debug.WriteLine("new tab with name " + username); Debug.WriteLine("new tab with name " + username);
App.Current.Dispatcher.Invoke((Action)delegate App.Current.Dispatcher.Invoke((Action)delegate
{ {
Tabs.Add(new ClientInfoViewModel(MainWindowViewModel, username)); Tabs.Add(new ClientInfoViewModel(this,MainWindowViewModel, username));
}); });
} }
@@ -72,6 +72,15 @@ namespace DoctorApp.ViewModels
} }
} }
} }
internal void SendToAllClients(string text)
{
Debug.WriteLine("[MAINVIEWMODEL] Sending message to all clients: " + text);
foreach (ClientInfoViewModel item in Tabs)
{
item.SendMessageToClient(item.PatientInfo.Username, text);
}
}
} }
@@ -6,6 +6,7 @@ using System.Windows.Input;
using DoctorApp.Models; using DoctorApp.Models;
using DoctorApp.Utils; using DoctorApp.Utils;
using Util.MagicCode; using Util.MagicCode;
using System;
namespace DoctorApp.ViewModels namespace DoctorApp.ViewModels
{ {
+1
View File
@@ -57,6 +57,7 @@
<ListBox Name="ChatBox" ItemsSource="{Binding PatientInfo.ChatLog}" Grid.Column="1" Margin="59,41,0,0" Grid.RowSpan="3"/> <ListBox Name="ChatBox" ItemsSource="{Binding PatientInfo.ChatLog}" Grid.Column="1" Margin="59,41,0,0" Grid.RowSpan="3"/>
<TextBox Name="textBox_Chat" Grid.Column="1" HorizontalAlignment="Left" Margin="59,10,0,0" Grid.Row="3" Text="" TextWrapping="Wrap" VerticalAlignment="Top" Width="235"/> <TextBox Name="textBox_Chat" Grid.Column="1" HorizontalAlignment="Left" Margin="59,10,0,0" Grid.Row="3" Text="" TextWrapping="Wrap" VerticalAlignment="Top" Width="235"/>
<Button x:Name="Send" Content="Send" Grid.Column="1" HorizontalAlignment="Left" Margin="59,33,0,0" Grid.Row="3" VerticalAlignment="Top" Command="{Binding Chat}" CommandParameter="{Binding ElementName=textBox_Chat}"/> <Button x:Name="Send" Content="Send" Grid.Column="1" HorizontalAlignment="Left" Margin="59,33,0,0" Grid.Row="3" VerticalAlignment="Top" Command="{Binding Chat}" CommandParameter="{Binding ElementName=textBox_Chat}"/>
<Button x:Name="SendToAll" Content="Send to all clients" Grid.Column="1" HorizontalAlignment="Left" Margin="107,33,0,0" Grid.Row="3" VerticalAlignment="Top" Command="{Binding ChatToAll}" CommandParameter="{Binding ElementName=textBox_Chat}"/>
<Button Content="Start Session" Grid.Column="1" HorizontalAlignment="Left" Margin="69,86,0,0" Grid.Row="3" VerticalAlignment="Top" Width="97" Command="{Binding StartSession}" CommandParameter=""/> <Button Content="Start Session" Grid.Column="1" HorizontalAlignment="Left" Margin="69,86,0,0" Grid.Row="3" VerticalAlignment="Top" Width="97" Command="{Binding StartSession}" CommandParameter=""/>
<Button Content="Stop Session" Grid.Column="1" HorizontalAlignment="Left" Margin="187,86,0,0" Grid.Row="3" VerticalAlignment="Top" Width="97" Command="{Binding StopSession}" CommandParameter=""/> <Button Content="Stop Session" Grid.Column="1" HorizontalAlignment="Left" Margin="187,86,0,0" Grid.Row="3" VerticalAlignment="Top" Width="97" Command="{Binding StopSession}" CommandParameter=""/>
<TextBox x:Name="textBox_SetResistance" Grid.Column="1" HorizontalAlignment="Left" Margin="69,128,0,0" Grid.Row="3" TextWrapping="Wrap" VerticalAlignment="Top" Width="97"/> <TextBox x:Name="textBox_SetResistance" Grid.Column="1" HorizontalAlignment="Left" Margin="69,128,0,0" Grid.Row="3" TextWrapping="Wrap" VerticalAlignment="Top" Width="97"/>
+2
View File
@@ -124,11 +124,13 @@ namespace RH_Engine
position = new float[] position = new float[]
{ {
-1.5f, 1f, 0f -1.5f, 1f, 0f
//0f,0f,0f
}, },
scale = 1, scale = 1,
rotation = new int[] rotation = new int[]
{ {
-30, 90,0 -30, 90,0
//0,0,0
} }
}, },
panel = new panel = new
+22 -15
View File
@@ -19,9 +19,9 @@ namespace RH_Engine
//new PC("DESKTOP-M2CIH87", "Fabian"), //new PC("DESKTOP-M2CIH87", "Fabian"),
//new PC("T470S", "Shinichi"), //new PC("T470S", "Shinichi"),
//new PC("DESKTOP-DHS478C", "semme"), //new PC("DESKTOP-DHS478C", "semme"),
//new PC("HP-ZBOOK-SEM", "Sem"), new PC("HP-ZBOOK-SEM", "Sem"),
//new PC("DESKTOP-TV73FKO", "Wouter"), //new PC("DESKTOP-TV73FKO", "Wouter"),
new PC("DESKTOP-SINMKT1", "Ralf van Aert"), //new PC("DESKTOP-SINMKT1", "Ralf van Aert"),
//new PC("NA", "Bart") //new PC("NA", "Bart")
}; };
@@ -94,7 +94,7 @@ namespace RH_Engine
if (serialResponses.ContainsKey(serial)) if (serialResponses.ContainsKey(serial))
{ {
serialResponses[serial].Invoke(message); serialResponses[serial].Invoke(message);
serialResponses.Remove(serial); //serialResponses.Remove(serial);
} }
} }
} }
@@ -181,39 +181,41 @@ namespace RH_Engine
//Force(stream, mainCommand.DeleteNode(handRightId, "deleteHandR"), "deleteHandR", (message) => Console.WriteLine("Right hand deleted")); //Force(stream, mainCommand.DeleteNode(handRightId, "deleteHandR"), "deleteHandR", (message) => Console.WriteLine("Right hand deleted"));
}); });
CreateTerrain(stream, mainCommand); //CreateTerrain(stream, mainCommand);
//Add route, bike and put camera and bike to follow route at same speed. //Add route, bike and put camera and bike to follow route at same speed.
SendMessageAndOnResponse(stream, mainCommand.RouteCommand("routeID"), "routeID", (message) => routeId = JSONParser.GetResponseUuid(message)); //SendMessageAndOnResponse(stream, mainCommand.RouteCommand("routeID"), "routeID", (message) => routeId = JSONParser.GetResponseUuid(message));
SendMessageAndOnResponse(stream, mainCommand.AddBikeModelAnim("bikeID",0.01f), "bikeID", SendMessageAndOnResponse(stream, mainCommand.AddBikeModelAnim("bikeID",0.01f), "bikeID",
(message) => (message) =>
{ {
bikeId = JSONParser.GetResponseUuid(message); bikeId = JSONParser.GetResponseUuid(message);
Console.WriteLine("got bike id " + bikeId);
SendMessageAndOnResponse(stream, mainCommand.addPanel("panelAdd", bikeId), "panelAdd", SendMessageAndOnResponse(stream, mainCommand.addPanel("panelAdd", bikeId), "panelAdd",
(message) => (message) =>
{ {
bool speedReplied = false; bool speedReplied = false;
bool moveReplied = true; bool moveReplied = true;
Console.WriteLine(message);
panelId = JSONParser.getPanelID(message); panelId = JSONParser.getPanelID(message);
Console.WriteLine("got panel id " + panelId);
showPanel(stream, mainCommand); showPanel(stream, mainCommand);
//while (!(speedReplied && moveReplied)) { } //while (!(speedReplied && moveReplied)) { }
while (cameraId == string.Empty) { } //while (cameraId == string.Empty) { }
SetFollowSpeed(5.0f, stream, mainCommand); //SetFollowSpeed(5.0f, stream, mainCommand);
WriteTextMessage(stream, mainCommand.RoadCommand(routeId, "road")); //WriteTextMessage(stream, mainCommand.RoadCommand(routeId, "road"));
WriteTextMessage(stream, mainCommand.ShowRoute("showRouteFalse", false)); //WriteTextMessage(stream, mainCommand.ShowRoute("showRouteFalse", false));
}); });
}); });
string groundplaneId = GetId("GroundPlane", stream, mainCommand); //string groundplaneId = GetId("GroundPlane", stream, mainCommand);
WriteTextMessage(stream, mainCommand.DeleteNode(groundplaneId, "none")); //WriteTextMessage(stream, mainCommand.DeleteNode(groundplaneId, "none"));
PlaceHouses(stream, mainCommand); //PlaceHouses(stream, mainCommand);
WriteTextMessage(stream, mainCommand.SkyboxCommand(DateTime.Now.Hour)); //WriteTextMessage(stream, mainCommand.SkyboxCommand(DateTime.Now.Hour));
} }
@@ -343,31 +345,36 @@ namespace RH_Engine
private static void showPanel(NetworkStream stream, Command mainCommand) private static void showPanel(NetworkStream stream, Command mainCommand)
{ {
WriteTextMessage(stream, mainCommand.ColorPanel(panelId)); //WriteTextMessage(stream, mainCommand.ColorPanel(panelId));
WriteTextMessage(stream, mainCommand.ClearPanel(panelId)); WriteTextMessage(stream, mainCommand.ClearPanel(panelId));
SendMessageAndOnResponse(stream, mainCommand.showBikespeed(panelId, "bikeSpeed", bikeSpeed), "bikeSpeed", SendMessageAndOnResponse(stream, mainCommand.showBikespeed(panelId, "bikeSpeed", bikeSpeed), "bikeSpeed",
(message) => (message) =>
{ {
Console.WriteLine(message);
// TODO check if is drawn // TODO check if is drawn
}); });
SendMessageAndOnResponse(stream, mainCommand.showHeartrate(panelId, "bpm", bpm), "bpm", SendMessageAndOnResponse(stream, mainCommand.showHeartrate(panelId, "bpm", bpm), "bpm",
(message) => (message) =>
{ {
Console.WriteLine(message);
// TODO check if is drawn // TODO check if is drawn
}); });
SendMessageAndOnResponse(stream, mainCommand.showPower(panelId, "power", power), "power", SendMessageAndOnResponse(stream, mainCommand.showPower(panelId, "power", power), "power",
(message) => (message) =>
{ {
Console.WriteLine(message);
// TODO check if is drawn // TODO check if is drawn
}); });
SendMessageAndOnResponse(stream, mainCommand.showResistance(panelId, "resistance", resistance), "resistance", SendMessageAndOnResponse(stream, mainCommand.showResistance(panelId, "resistance", resistance), "resistance",
(message) => (message) =>
{ {
Console.WriteLine(message);
// TODO check if is drawn // TODO check if is drawn
}); });
SendMessageAndOnResponse(stream, mainCommand.showMessage(panelId, "message", lastMessage), "message", SendMessageAndOnResponse(stream, mainCommand.showMessage(panelId, "message", lastMessage), "message",
(message) => (message) =>
{ {
Console.WriteLine(message);
// TODO check if is drawn // TODO check if is drawn
}); });