Browse Source

further implementation of comport

Bart Reedijk 10 years ago
parent
commit
434c4dc9e9

+ 14 - 4
Proftaak Remote Healthcare/Fietsclient/AppGlobal.cs

@@ -14,11 +14,14 @@ namespace Fietsclient
             get { return _instance ?? (_instance = new AppGlobal()); }
         }
 
+
         private KettlerBikeComm _bikeComm;
 
+
         private AppGlobal()
         {
-            
+            _bikeComm = new KettlerBikeComm();
+            _bikeComm.IncomingDataEvent += HandleBikeData; //initialize event
         }
 
         public void startComPort()
@@ -28,10 +31,17 @@ namespace Fietsclient
 
         public void startComPort(string portname)
         {
-            _bikeComm = new KettlerBikeComm(portname);
-            _bikeComm.initComm();
+            _bikeComm.initComm(portname);
+        }
+
+        //event handler
+        public void HandleBikeData(string[] data) 
+        {
+            //doe iets ermee...
         }
 
-        
+
+
+
     }
 }

+ 111 - 8
Proftaak Remote Healthcare/Fietsclient/KettlerBikeComm.cs

@@ -10,24 +10,53 @@ namespace Fietsclient
 {
     class KettlerBikeComm
     {
+
+        // vaste waarden
+        private readonly string COMMAND = "CM";
+        private readonly string CMD_TIME = "PT";
+        private readonly string CMD_DISTANCE = "PD";
+        private readonly string CMD_POWER = "PW";
+        private readonly string CMD_ENERGY = "PE";
+        private readonly string RESET = "RS";
+        private readonly string STATUS = "ST";
+
+        // private fields
         private string _portname;
         private int baudrate = 9600;
         private string _bufferOut;
         private string[] _bufferIn;
 
+        // public fields
+        public enum State { notConnected, connected, reset, command }
+        public enum ReturnData { ERROR, ACK, RUN, STATUS }
+
+        public State state = State.notConnected;
+        public ReturnData returnData;
 
         private SerialPort ComPort;
-        public KettlerBikeComm(string port)
+
+        // custom events
+        public delegate void DataDelegate(string[] data);
+        public event DataDelegate IncomingDataEvent;
+
+        public KettlerBikeComm()
+        {
+            
+        }
+
+        private void OnIncomingDataEvent(string[] data)
         {
-            this._portname = port;
+            DataDelegate handler = IncomingDataEvent;
+            if (handler != null) handler(data);
         }
 
-        public void initComm()
+        public void initComm(string portname)
         {
+            _portname = portname;
             ComPort = new SerialPort(_portname, this.baudrate);
             ComPort.Open();
             Console.WriteLine("test");
-            ComPort.WriteLine("RS");
+            ComPort.WriteLine(RESET);
             Console.Write(ComPort.ReadLine());
             Console.WriteLine("end of message");
             ComPort.DataReceived += new SerialDataReceivedEventHandler(ComPort_DataReceived);
@@ -51,17 +80,91 @@ namespace Fietsclient
             switch(buffer) //kijk wat er binnenkomt
             {
                 case "ERROR": //wanneer "Error"
-                    if (_bufferOut == "RS") sendData("RS"); //gewoon nog een keer proberen...
-                    return;
+                    //if (_bufferOut == "RS") sendData("RS"); //gewoon nog een keer proberen...
+                    returnData = ReturnData.ERROR;
+                    break;
                 case "ACK": // ACK betekent acknowledged.
-                    return;
+                    returnData = ReturnData.ACK;
+                    break;
+                case "RUN":
+                    returnData = ReturnData.RUN;
+                    break;
                 default:    // alle andere waarden.
-                    return;
+                    returnData = ReturnData.STATUS;
+                    handleBikeValues(buffer);
+                    break;
             }
+        }
 
+        private void handleBikeValues(string buffer)
+        {
             buffer = buffer.TrimEnd('\r');
             Console.WriteLine(buffer);
             _bufferIn = buffer.Split('\t');
+            OnIncomingDataEvent(_bufferIn);
+        }
+
+        private bool checkBikeState()
+        {
+            bool success = false;
+            switch(state)
+            {
+                case State.reset:
+                    setCommandMode();
+                    
+                    if(returnData != ReturnData.ERROR)
+                    {
+                        success = true;
+                    }
+                    break;
+                case State.connected:
+                    setCommandMode();                   
+                    success = true;
+                    break;
+                case State.command:
+                    success = true;
+                    break;
+                case State.notConnected:
+                    Console.WriteLine("ERROR: not connected to bike.");
+                    success = false;
+                    break;
+            }
+            return success;
+        }
+
+        public void setCommandMode()
+        {
+            sendData(COMMAND);
+        }
+
+        public void setTime()
+        {
+            if (!checkBikeState())
+                return;
+            sendData(CMD_TIME);
+        }
+
+        public void setDistance()
+        {
+            if (!checkBikeState())
+                return;
+            sendData(CMD_DISTANCE);
+        }
+
+        public void setPower()
+        {
+            if (!checkBikeState())
+                return;
+            sendData(CMD_POWER);
+        }
+
+        public void setEnergy()
+        {
+            if (!checkBikeState())
+                return;
+            sendData(CMD_ENERGY);
         }
     }
 }
+
+