Advanced Distributed Systems module at HSLU
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

181 lines
7.5 KiB

using NLog.LayoutRenderers;
using RobotLib.Status;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
namespace RaspiControl {
internal class Application {
private ChallengeFactory? challenge;
private StateMachine sm;
private readonly NLog.Logger log;
private Stopwatch stopwatch;
private uint PresentCounter;
public Application() {
this.log = NLog.LogManager.GetCurrentClassLogger();
this.sm = new StateMachine();
this.challenge = new ChallengeFactory();
this.challenge.PublisherSubscriber.ConnectionStateChanged += this.PublisherSubscriber_ConnectionStateChanged;
this.challenge.PublisherSubscriber.Connect("localhost", "ADIS", "TEST");
this.challenge.RobotMobile.Status.StatusChanged += Status_StatusChanged;
this.challenge.RobotMobile.Status.PresentChanged += Status_PresentChanged;
Joystick joystick = new Joystick();
joystick.JoystickChanged += Joystick_JoystickChanged;
this.stopwatch = new Stopwatch();
this.PresentCounter = 0;
}
public void Status_StatusChanged(object? sender, StatusEventArgs e) {
try {
if(e.Status == RoboStatus.Manual) {
this.sm.MoveNext(Command.manualMode);
this.smHandler();
}
if (e.Status == RoboStatus.Auto) {
this.sm.MoveNext(Command.autoMode);
this.smHandler();
}
if(e.Status == RoboStatus.Final) {
this.sm.MoveNext(Command.finished);
this.smHandler();
}
if(e.Status == RoboStatus.Failure) {
this.sm.MoveNext(Command.failure);
this.smHandler();
}
} catch (Exception ex) {
this.log.Error(ex.Message);
}
}
public void Status_PresentChanged(object? sender, PresentEventArgs e) {
if(this.sm.CurrentState == ProcessState.Auto) {
this.PresentCounter++;
this.challenge.RobotStationary.SplitFlap.Display(this.PresentCounter.ToString().PadLeft(4,'0'));
}
}
public void Run() {
bool success = this.challenge.PublisherSubscriber.Connect("localhost", "ADIS", "TEST");
if (!success) {
throw new Exception("Could not connect to broker on localhost");
} else {
try {
this.sm.MoveNext(Command.Connected);
this.log.Info($"Current State: {this.sm.CurrentState}");
} catch (Exception ex) {
this.log.Error(ex.Message);
}
}
}
private void PublisherSubscriber_ConnectionStateChanged(object? sender, bool e) {
if (e == false) {
this.log.Error("Connection to MQTT broker lost");
} else {
this.log.Info("Connected to MQTT broker");
}
}
private void smHandler() {
this.log.Info($"Current State: {this.sm.CurrentState}");
switch (this.sm.CurrentState) {
case ProcessState.Startup:
break;
case ProcessState.Init:
break;
case ProcessState.Ready:
// show sf redy
this.challenge.RobotStationary.SplitFlap.Display("REDY");
break;
case ProcessState.StartMoveManual:
// mode automatic:false
if (this.stopwatch.IsRunning) {
this.stopwatch.Stop();
}
this.stopwatch.Start();
this.challenge.RobotStationary.SplitFlap.Display("WALD");
this.challenge.RobotMobile.Movement.SetMobilityMode(false);
this.challenge.RobotMobile.Movement.AddSpeed(NavigationConstants.SPEED_FORWARD);
this.sm.MoveNext(Command.none);
break;
case ProcessState.ResumeMoveManual:
this.challenge.RobotMobile.Movement.SetMobilityMode(false);
this.challenge.RobotMobile.Movement.AddSpeed(NavigationConstants.SPEED_FORWARD);
this.sm.MoveNext(Command.none);
break;
case ProcessState.MoveManual:
break;
case ProcessState.MoveManualF:
// move + 100
this.challenge.RobotMobile.Movement.AddSpeed(NavigationConstants.SPEED_FORWARD);
this.sm.MoveNext(Command.none);
break;
case ProcessState.MoveManualB:
// move -100
this.challenge.RobotMobile.Movement.AddSpeed(NavigationConstants.SPEED_BACKWARD);
this.sm.MoveNext(Command.none);
break;
case ProcessState.MoveManualL:
this.challenge.RobotMobile.Movement.Turn(NavigationConstants.TURN_ANGLE_LEFT);
this.sm.MoveNext(Command.none);
break;
case ProcessState.MoveManualR:
// turn right 30
this.challenge.RobotMobile.Movement.Turn(NavigationConstants.TURN_ANGLE_RIGHT);
this.sm.MoveNext(Command.none);
break;
case ProcessState.StopManual:
// stop
this.challenge.RobotMobile.Movement.Stop();
break;
case ProcessState.Auto:
this.challenge.RobotStationary.SplitFlap.Display("AUTO");
break;
case ProcessState.Final:
this.PresentCounter = 0;
this.stopwatch.Stop();
long elapsedTime = stopwatch.ElapsedMilliseconds / 1000;
this.challenge.RobotStationary.SplitFlap.Display(elapsedTime.ToString().PadLeft(4,'0'));
break;
case ProcessState.Error:
//this.PresentCounter = 0;
break;
}
}
private void Joystick_JoystickChanged(object sender, JoystickEventArgs e) {
try {
switch (e.Button) {
case JoystickButton.None:
break;
case JoystickButton.Left:
this.sm.MoveNext(Command.JoystickLeft);
break;
case JoystickButton.Right:
this.sm.MoveNext(Command.JoystickRight);
break;
case JoystickButton.Up:
this.sm.MoveNext(Command.JoystickUp);
break;
case JoystickButton.Down:
this.sm.MoveNext(Command.JoystickDown);
break;
case JoystickButton.Center:
this.sm.MoveNext(Command.JoystickCenter);
break;
}
if(e.Button != JoystickButton.None) {
this.smHandler();
}
} catch (Exception ex) {
this.log.Error(ex.Message);
}
}
}
}