VehicleActor.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. namespace TrafficControlService.Actors;
  2. public class VehicleActor : Actor, IVehicleActor, IRemindable
  3. {
  4. public readonly ISpeedingViolationCalculator _speedingViolationCalculator;
  5. private readonly string _roadId;
  6. private readonly DaprClient _daprClient;
  7. public VehicleActor(ActorHost host, DaprClient daprClient, ISpeedingViolationCalculator speedingViolationCalculator) : base(host)
  8. {
  9. _daprClient = daprClient;
  10. _speedingViolationCalculator = speedingViolationCalculator;
  11. _roadId = _speedingViolationCalculator.GetRoadId();
  12. }
  13. public async Task RegisterEntryAsync(VehicleRegistered msg)
  14. {
  15. try
  16. {
  17. Logger.LogInformation($"ENTRY detected in lane {msg.Lane} at " +
  18. $"{msg.Timestamp.ToString("hh:mm:ss")} " +
  19. $"of vehicle with license-number {msg.LicenseNumber}.");
  20. // store vehicle state
  21. var vehicleState = new VehicleState(msg.LicenseNumber, msg.Timestamp);
  22. await this.StateManager.SetStateAsync("VehicleState", vehicleState);
  23. // register a reminder for cars that enter but don't exit within 20 seconds
  24. // (they might have broken down and need road assistence)
  25. await RegisterReminderAsync("VehicleLost", null,
  26. TimeSpan.FromSeconds(20), TimeSpan.FromSeconds(20));
  27. }
  28. catch (Exception ex)
  29. {
  30. Logger.LogError(ex, "Error in RegisterEntry");
  31. }
  32. }
  33. public async Task RegisterExitAsync(VehicleRegistered msg)
  34. {
  35. try
  36. {
  37. Logger.LogInformation($"EXIT detected in lane {msg.Lane} at " +
  38. $"{msg.Timestamp.ToString("hh:mm:ss")} " +
  39. $"of vehicle with license-number {msg.LicenseNumber}.");
  40. // remove lost vehicle timer
  41. await UnregisterReminderAsync("VehicleLost");
  42. // get vehicle state
  43. var vehicleState = await this.StateManager.GetStateAsync<VehicleState>("VehicleState");
  44. vehicleState = vehicleState with { ExitTimestamp = msg.Timestamp };
  45. await this.StateManager.SetStateAsync("VehicleState", vehicleState);
  46. // handle possible speeding violation
  47. int violation = _speedingViolationCalculator.DetermineSpeedingViolationInKmh(
  48. vehicleState.EntryTimestamp, vehicleState.ExitTimestamp.Value);
  49. if (violation > 0)
  50. {
  51. Logger.LogInformation($"Speeding violation detected ({violation} KMh) of vehicle " +
  52. $"with license-number {vehicleState.LicenseNumber}.");
  53. var speedingViolation = new SpeedingViolation
  54. {
  55. VehicleId = msg.LicenseNumber,
  56. RoadId = _roadId,
  57. ViolationInKmh = violation,
  58. Timestamp = msg.Timestamp
  59. };
  60. // publish speedingviolation (Dapr publish / subscribe)
  61. await _daprClient.PublishEventAsync("pubsub", "speedingviolations", speedingViolation);
  62. }
  63. }
  64. catch (Exception ex)
  65. {
  66. Logger.LogError(ex, "Error in RegisterExit");
  67. }
  68. }
  69. public async Task ReceiveReminderAsync(string reminderName, byte[] state, TimeSpan dueTime, TimeSpan period)
  70. {
  71. if (reminderName == "VehicleLost")
  72. {
  73. // remove lost vehicle timer
  74. await UnregisterReminderAsync("VehicleLost");
  75. var vehicleState = await this.StateManager.GetStateAsync<VehicleState>("VehicleState");
  76. Logger.LogInformation($"Lost track of vehicle with license-number {vehicleState.LicenseNumber}. " +
  77. "Sending road-assistence.");
  78. // send road assistence ...
  79. }
  80. }
  81. }