HttpStatusServer.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. using BsWidgetShareCodes;
  2. using Newtonsoft.Json;
  3. using System;
  4. using System.Text;
  5. using WebSocketSharp;
  6. using WebSocketSharp.Server;
  7. using YUR.Fit.Core.Models;
  8. namespace BsYurHttpStatus
  9. {
  10. internal class HttpStatusServer
  11. {
  12. private int ServerPort = 6558;
  13. internal YurStatus Status { get; } = new YurStatus();
  14. internal event EventHandler StatusChanged;
  15. private HttpServer _server;
  16. public void Start()
  17. {
  18. _server = new HttpServer(ServerPort);
  19. _server.OnGet += (sender, e) =>
  20. {
  21. OnHTTPGet(e);
  22. };
  23. _server.AddWebSocketService<StatusBroadcastBehavior>("/socket", () =>
  24. {
  25. var statusBroadcastBehavior = new StatusBroadcastBehavior();
  26. statusBroadcastBehavior.SetParent(this);
  27. return statusBroadcastBehavior;
  28. });
  29. Plugin.Log("Starting HTTP server on port " + ServerPort);
  30. _server.Start();
  31. }
  32. public void Stop() => _server.Stop();
  33. public void Update(OverlayStatusUpdate input)
  34. {
  35. Status.HeartRate = input.HeartRate ?? input.SuckFloatProperty("EstHeartRate");
  36. Status.KcalPerMin = input.SuckFloatProperty("BurnRate");
  37. StatusChanged?.Invoke(this, EventArgs.Empty);
  38. }
  39. private void OnHTTPGet(HttpRequestEventArgs e)
  40. {
  41. var res = e.Response;
  42. res.StatusCode = 200;
  43. res.ContentType = "application/json";
  44. res.ContentEncoding = Encoding.UTF8;
  45. var json = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(Status));
  46. res.ContentLength64 = json.Length;
  47. res.Close(json, false);
  48. }
  49. private class StatusBroadcastBehavior : WebSocketBehavior
  50. {
  51. private HttpStatusServer _parent;
  52. public void SetParent(HttpStatusServer httpStatusServer)
  53. {
  54. _parent = httpStatusServer;
  55. _parent.StatusChanged += StatusChanged;
  56. }
  57. protected override void OnOpen()
  58. {
  59. base.OnOpen();
  60. Send(JsonConvert.SerializeObject(_parent.Status));
  61. }
  62. protected override void OnClose(CloseEventArgs e)
  63. {
  64. base.OnClose(e);
  65. _parent.StatusChanged -= StatusChanged;
  66. }
  67. private void StatusChanged(object sender, EventArgs e)
  68. {
  69. Send(JsonConvert.SerializeObject(_parent.Status));
  70. }
  71. }
  72. }
  73. }