|
|
@@ -5,15 +5,20 @@ using System.Linq;
|
|
|
using System.Text;
|
|
|
using System.Threading.Tasks;
|
|
|
using System.Threading;
|
|
|
+using System.Timers;
|
|
|
+using System.Diagnostics;
|
|
|
|
|
|
namespace FietsSimulator
|
|
|
{
|
|
|
class FietsSimulator
|
|
|
{
|
|
|
private SerialPort comport;
|
|
|
- private Mode curmode;
|
|
|
- private int curvalue;
|
|
|
- private int _power;
|
|
|
+ private Mode curmode;
|
|
|
+ private int _power, _heartbeat, rpm, speed, distance, energy;
|
|
|
+ private long maxtime;
|
|
|
+ private Stopwatch stopwatch;
|
|
|
+ private Random r = new Random();
|
|
|
+
|
|
|
public int Power
|
|
|
{
|
|
|
get { return _power; }
|
|
|
@@ -28,6 +33,12 @@ namespace FietsSimulator
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ public int Heartbeat
|
|
|
+ {
|
|
|
+ get { return r.Next(60, 160); }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
private enum Mode
|
|
|
{
|
|
|
NONE,
|
|
|
@@ -41,6 +52,12 @@ namespace FietsSimulator
|
|
|
this.comport = new SerialPort(addr, 9600);
|
|
|
comport.DataReceived += new SerialDataReceivedEventHandler(ReceiveData);
|
|
|
comport.Open();
|
|
|
+ stopwatch= new Stopwatch();
|
|
|
+ stopwatch.Stop();
|
|
|
+ System.Timers.Timer aTimer = new System.Timers.Timer();
|
|
|
+ aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
|
|
|
+ aTimer.Interval = 1000;
|
|
|
+ aTimer.Enabled = true;
|
|
|
}
|
|
|
|
|
|
private void ReceiveData(object sender, SerialDataReceivedEventArgs e)
|
|
|
@@ -50,14 +67,47 @@ namespace FietsSimulator
|
|
|
if (message == "RS")
|
|
|
{
|
|
|
curmode = Mode.NONE;
|
|
|
- curvalue = 0;
|
|
|
+ rpm = speed = distance = energy = 0;
|
|
|
Power = 25;
|
|
|
+ stopwatch.Stop();
|
|
|
SendData("ACK");
|
|
|
}
|
|
|
else if (message == "CU")
|
|
|
{
|
|
|
curmode = Mode.CONSOLE;
|
|
|
SendData("ACK");
|
|
|
+ }else if (message.Contains("PD"))
|
|
|
+ {
|
|
|
+ if (curmode == Mode.CONSOLE && message.Split().Length == 2)
|
|
|
+ {
|
|
|
+ distance = Int32.Parse(message.Split(' ')[1]);
|
|
|
+ curmode = Mode.DISTANCE;
|
|
|
+ stopwatch.Reset();
|
|
|
+ stopwatch.Start();
|
|
|
+ rpm = 100;
|
|
|
+ speed = 10;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ SendData("ERROR");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (message.Contains("PT"))
|
|
|
+ {
|
|
|
+ if (curmode == Mode.CONSOLE && message.Split().Length == 2)
|
|
|
+ {
|
|
|
+ string[] time = message.Split(' ')[1].Split(':');
|
|
|
+ maxtime = Int32.Parse(time[0]) * 60000 + Int32.Parse(time[1]) * 1000;
|
|
|
+ curmode = Mode.TIME;
|
|
|
+ stopwatch.Reset();
|
|
|
+ stopwatch.Start();
|
|
|
+ rpm = 100;
|
|
|
+ speed = 10;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ SendData("ERROR");
|
|
|
+ }
|
|
|
}
|
|
|
else if (message.Contains("PW"))
|
|
|
{
|
|
|
@@ -70,19 +120,54 @@ namespace FietsSimulator
|
|
|
SendData("ERROR");
|
|
|
}
|
|
|
}
|
|
|
- else if (message == "ST")
|
|
|
+ else if (message == "ST" && curmode != Mode.NONE)
|
|
|
{
|
|
|
- SendData("0\t100\t10\t20\t" + Power.ToString() + "\t600\t0504\t200\r");
|
|
|
- // pulse rpm speed * 10 distance requested_power energy mm:ss actual_power
|
|
|
+ SendStatus();
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
SendData("ERROR");
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
private void SendData(string message)
|
|
|
{
|
|
|
+ Console.WriteLine("RETURN:" + message);
|
|
|
this.comport.WriteLine(message);
|
|
|
}
|
|
|
+ private void SendStatus()
|
|
|
+ {
|
|
|
+ SendData(Heartbeat.ToString() + "\t"+rpm +"\t"+speed*10+"\t"+distance+"\t" + Power.ToString() + "\t600\t"+getTimeElapsed()+"\t200\r");
|
|
|
+ }
|
|
|
+
|
|
|
+ private string getTimeElapsed()
|
|
|
+ {
|
|
|
+ if(curmode == Mode.DISTANCE)
|
|
|
+ {
|
|
|
+ long seconds = (stopwatch.ElapsedMilliseconds / 1000) % 60;
|
|
|
+ long minutes = ((stopwatch.ElapsedMilliseconds - seconds) / 1000) / 60;
|
|
|
+ return minutes + ":" + seconds;
|
|
|
+ }else if(curmode == Mode.TIME)
|
|
|
+ {
|
|
|
+ long seconds = ((maxtime - stopwatch.ElapsedMilliseconds) / 1000) % 60;
|
|
|
+ long minutes = (((maxtime -stopwatch.ElapsedMilliseconds) - seconds) / 1000) / 60;
|
|
|
+ return minutes + ":" + seconds;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return "00:00";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ private void OnTimedEvent(object source, ElapsedEventArgs e)
|
|
|
+ {
|
|
|
+ if(curmode == Mode.DISTANCE)
|
|
|
+ {
|
|
|
+ distance -= 1;
|
|
|
+ }
|
|
|
+ else if (curmode == Mode.TIME)
|
|
|
+ {
|
|
|
+ distance += 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|