private void HandleBikeData(Measurement data)
        {
            if (doctorform.InvokeRequired)
            {
                doctorform.Invoke((new Action(() => HandleBikeData(data))));
            }
            else
            {
                //fill fields
                doctorform.summaryUserControl.pulseBox.Text        = data.pulse.ToString();
                doctorform.summaryUserControl.rpmInfoBox.Text      = data.rpm.ToString();
                doctorform.summaryUserControl.speedInfoBox.Text    = data.speed.ToString();
                doctorform.summaryUserControl.distanceInfoBox.Text = data.distance.ToString();
                doctorform.summaryUserControl.requestedBox.Text    = data.requestedPower.ToString();
                doctorform.summaryUserControl.energyInfoBox.Text   = data.energy.ToString();
                doctorform.summaryUserControl.timeBox.Text         = data.time.ToString();
                doctorform.summaryUserControl.actualBox.Text       = data.actualPower.ToString();

                //fill graph speed
                speedPoints.Add(new DataPoint(Convert.ToDateTime(data.time.ToString()).ToOADate(), Convert.ToDouble(data.speed.ToString())));
                doctorform.summaryUserControl.speedChart.Series[0].Points.Clear();
                for (int i = 0; i < speedPoints.Count; i++)
                {
                    doctorform.summaryUserControl.speedChart.Series[0].Points.Add(speedPoints[i]);
                }
                if (speedPoints.Count > 25)
                {
                    speedPoints.RemoveAt(0);
                }
                doctorform.summaryUserControl.speedChart.Update();

                //fill graph pulse
                bpmPoints.Add(new DataPoint(Convert.ToDateTime(data.time.ToString()).ToOADate(), Convert.ToDouble(data.pulse.ToString())));
                doctorform.summaryUserControl.bpmChart.Series[0].Points.Clear();
                for (int i = 0; i < bpmPoints.Count; i++)
                {
                    doctorform.summaryUserControl.bpmChart.Series[0].Points.Add(bpmPoints[i]);
                }
                if (bpmPoints.Count > 25)
                {
                    bpmPoints.RemoveAt(0);
                }
                doctorform.summaryUserControl.speedChart.Update();

                //fill graph rpm
                rpmPoints.Add(new DataPoint(Convert.ToDateTime(data.time.ToString()).ToOADate(), Convert.ToDouble(data.rpm.ToString())));
                doctorform.summaryUserControl.rpmChart.Series[0].Points.Clear();
                for (int i = 0; i < rpmPoints.Count; i++)
                {
                    doctorform.summaryUserControl.rpmChart.Series[0].Points.Add(rpmPoints[i]);
                }
                if (rpmPoints.Count > 25)
                {
                    rpmPoints.RemoveAt(0);
                }
                doctorform.summaryUserControl.rpmChart.Update();
            }
        }
        public void HandleSessionBikeData(Measurement data)
        {

            if (InvokeRequired)
            {
                Invoke((new Action(() => HandleSessionBikeData(data))));
            }
            else
            {
                int actualMinutes = (int)(data.time / 60.0);
                string actualTime = actualMinutes + ":" + (data.time - actualMinutes * 60).ToString();
                //fill fields
                pulseBox.Text = data.pulse.ToString();
                rpmInfoBox.Text = data.rpm.ToString();
                speedInfoBox.Text = data.speed.ToString();
                distanceInfoBox.Text = data.distance.ToString();
                requestedBox.Text = data.requestedPower.ToString();
                energyInfoBox.Text = data.energy.ToString();
                timeBox.Text = data.time.ToString();
                actualBox.Text = data.actualPower.ToString();

                //fill graph speed
                speedPoints.Add(new DataPoint(Convert.ToDateTime(actualTime).ToOADate(), Convert.ToDouble(data.speed)));
                speedChart.Series[0].Points.Clear();
                for (int i = 0; i < speedPoints.Count; i++)
                    speedChart.Series[0].Points.Add(speedPoints[i]);
                if (speedPoints.Count > 25)
                    speedPoints.RemoveAt(0);
                speedChart.Update();

                //fill graph pulse
                bpmPoints.Add(new DataPoint(Convert.ToDateTime(actualTime).ToOADate(), Convert.ToDouble(data.pulse)));
                bpmChart.Series[0].Points.Clear();
                for (int i = 0; i < bpmPoints.Count; i++)
                    bpmChart.Series[0].Points.Add(bpmPoints[i]);
                if (bpmPoints.Count > 25)
                    bpmPoints.RemoveAt(0);
                speedChart.Update();

                //fill graph rpm
                rpmPoints.Add(new DataPoint(Convert.ToDateTime(actualTime).ToOADate(), Convert.ToDouble(data.rpm)));
                rpmChart.Series[0].Points.Clear();
                for (int i = 0; i < rpmPoints.Count; i++)
                    rpmChart.Series[0].Points.Add(rpmPoints[i]);
                if (rpmPoints.Count > 25)
                    rpmPoints.RemoveAt(0);
                rpmChart.Update();
            }
        }
	public static string SerializeLastMeasurement(Measurement measurement)
        {
            return JsonConvert.SerializeObject(measurement);
        }
        private void receive(object obj)
        {
            TcpClient client = obj as TcpClient;
            User currentUser;

            SslStream sslStream = InitialiseConnection(client);

            while (!(client.Client.Poll(0, SelectMode.SelectRead) && client.Client.Available == 0))
            {

                byte[] bytesFrom = new byte[(int)client.ReceiveBufferSize];
                try
                {
                    sslStream.Read(bytesFrom, 0, (int)client.ReceiveBufferSize);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Exception occured while trying to get data from client. Disconnecting...");
                    Console.WriteLine(e.StackTrace);
                    //Stop();
                }

                string[] response = Encoding.ASCII.GetString(bytesFrom).Split('|');

                switch (response[0])
                {
                    case "0":
                        if (response.Length == 4)
                        {
                            int admin, id = 0;
                            //check username and password
                            foreach (User u in users)
                            {
                                if (u.id == response[1] && u.password == response[2])
                                {
                                    admin = u.isDoctor ? 1 : 0;
                                    id = users.IndexOf(u);
                                }
                            }

                            if (id > -1)
                            {
                                var user = users.FirstOrDefault(item => item.id == response[1]);
                                if (user == null)
                                {
                                    Console.WriteLine("received incorrect username or password");
                                    Communication.Send("0|0|0|", sslStream); // Does not exist
                                }
                                else if (user.isDoctor)
                                {
                                    Console.WriteLine("received login from docter username: "******"0|1|1|", sslStream);   // Doctor
                                }
                                else if (!user.isDoctor)
                                {
                                    Console.WriteLine("received login from patient username: "******"0|1|0|", sslStream);   //Patient
                                }
                                clients.Add(new Client(client, sslStream, response[1]));
                            }
                            else
                            {
                                Console.WriteLine("IOException");
                                Communication.Send("0|0|0|", sslStream); // Does not exist
                            }
                        }
                        break;
                    case "1":   //meetsessies ophalen
                        currentUser = users.First(item => item.id == response[1]);
                        Communication.Send("1|" + FietsLibrary.JsonConverter.GetUserSessions(currentUser), sslStream);
                        break;
                    case "2":   //Livedata OPVRAGEN
                        currentUser = users.First(item => item.id == response[1]);
                        string lastMeasurement = FietsLibrary.JsonConverter.GetLastMeasurement(currentUser.sessions.Last());
                        Communication.Send("2|" + lastMeasurement + "|", sslStream);
                        break;
                    case "3":   //Nieuwe meetsessie aanmaken
                        if (true)
                        {
                            foreach (User u in users)
                            {
                                if (u.id == response[1])
                                {
                                    if (u.GetSessions().Count != 0)
                                    {
                                        int sessionID = u.GetSessions().LastOrDefault().id;
                                        u.AddSession(new Session(sessionID));
                                    }
                                    else
                                    {
                                        u.AddSession(new Session(1));
                                    }
                                }
                            }
                        } 
                        break;
                    case "4":  // Nieuwe patient
                        users.Add(new User(response[1], response[2], Int32.Parse(response[3]), Boolean.Parse(response[4]), Int32.Parse(response[5])));
                        saveData2Json();
                        readDataFromJson();
                        break;
                    case "5":   //data pushen naar meetsessie (opslaan)
                        // uitleg response[]:
                        // response[1] = idPatient
                        // response[2] = idCurrentDoctor
                        // response[3] = measurement
                        // opslaan van measurement
                        currentUser = users.FirstOrDefault(item => item.id == response[1]);
                        Measurement outputMeasurement = null;
                        if (currentUser != null && currentUser.sessions.LastOrDefault() != null)
                        {
                            dynamic DynMeasurement = JsonConvert.DeserializeObject<dynamic>(response[3]);
                            outputMeasurement = new Measurement((int)DynMeasurement.pulse, (int)DynMeasurement.rpm, (int)DynMeasurement.speed, (int)DynMeasurement.distance, (int)DynMeasurement.requestedPower, (int)DynMeasurement.energy, (int)DynMeasurement.actualPower, (int)DynMeasurement.time);
                            currentUser.sessions.Last().AddMeasurement(outputMeasurement);
                        }
                        // einde opslaan measurement

                        // nu sturen we het naar de doctor
                        if (outputMeasurement != null && response[2] != "")
                        {
                            Client Case5Client = clients.FirstOrDefault(item => item.username == response[2]);
                            string Case5String = "2|" + response[1] + "|" + JsonConvert.SerializeObject(outputMeasurement) + "|";
                            Communication.Send(Case5String, Case5Client.sslStream);
                        }

                        break;
                    case "6": //chatberichten ontvangen van gebruikers
                        //controleren of het bericht wel tekens bevat
                        if (response[3] != null)
                        {
                            string message = response[3].TrimEnd('\0');
                            string receiver = response[2];
                            string sender = response[1];

                            string case6str = "7|" + sender + "|" + receiver + "|" + message;
                            Console.WriteLine(case6str);
                            Communication.Send(case6str, sslStream);
                            for (int i = 0; i < clients.Count; i++)
                            {
                                if (clients[i].username == receiver)
                                    Communication.Send("7|" + sender + "|" + receiver + "|" + message, clients[i].sslStream);
                            }
                        }
                        break;
                    case "8": //alle online Patients sturen naar Doctorclient
                        if (response[1] != null)
                        {
                            if (response[1] == "doctor" || true) //TODO: doctor check
                            {
                                List<string> patients = new List<string>();
                                foreach (Client c in clients)
                                {
                                    User user = users.FirstOrDefault(item => item.id == c.username);
                                    if (user != null)
                                        if (!user.isDoctor)
                                            patients.Add(user.id);
                                }

                                string strToSend = "8|";
                                if (!(patients.Count > 0))
                                    strToSend += "-1";
                                else
                                    foreach (string patient in patients)
                                    {
                                        strToSend += (patient + '\t');
                                    }
                                Communication.Send(strToSend.TrimEnd('\t'), sslStream);
                            }
                        }
                        break;
                    case "9": //alles doorsturen voor de dokter

                        // BUG: er wordt teveel data verstuurd!!!!
                        //Console.WriteLine("send users");
                        string file = "9|" + FietsLibrary.JsonConverter.GetUsers(users);
                        Communication.Send(file, sslStream);
                        break;
                    case "10":
                        if (response[1] == "1" || response[1] == "0") //start of stop sesie (met check)
                        {
                            Client Case10Client = clients.FirstOrDefault(item => item.username == response[2].TrimEnd('\0'));
                            string Case10String = "10|" + response[1] + "|" + response[2] + "|" + response[3].TrimEnd('\0') + "|";
                            Communication.Send(Case10String, Case10Client.sslStream);
                            if (response[1] == "1")
                            {
                                Communication.Send("10|" + "1" + "|" + response[2] + "|" + response[3].TrimEnd('\0') + "|", sslStream);
                            }
                        }
                        
                        break;
                    case "11":
                        saveData2Json();
                        break;
                    case "20":
                        Client Case20Client = clients.FirstOrDefault(item => item.username == response[1]);
                        if (Case20Client != null)
                        {
                            string Case20String = "20|" + response[2] + "|";
                            Communication.Send(Case20String, Case20Client.sslStream);
                        }
                        break;
                    case "21":
                        Client Case21Client = clients.FirstOrDefault(item => item.username == response[1]);
                        if (Case21Client != null)
                        {
                            string Case20String = "21|" + response[2] + "|" + response[3] + "|";
                            Communication.Send(Case20String, Case21Client.sslStream);
                        }
                        break;
                    case "22":
                        Client Case22Client = clients.FirstOrDefault(item => item.username == response[1]);
                        if (Case22Client != null)
                        {
                            string Case22String = "22|" + response[2] + "|";
                            Communication.Send(Case22String, Case22Client.sslStream);
                        }
                        break;

                    default:
                        break;
                }
                

            }
        }
        private void readDataFromJson()
        {
            //Read UserDate file
            string s = File.ReadAllText(@"JSON Files\UserData.Json");
            dynamic results = JsonConvert.DeserializeObject<dynamic>(s);
            //Clear list
            users = new List<User>();

            foreach (dynamic r in results)
            {
                
                users.Add(new User(r.id.ToString(), r.password.ToString(), Int32.Parse(r.age.ToString()),
                    Boolean.Parse(r.gender.ToString()), Int32.Parse(r.weight.ToString()),
                    Boolean.Parse(r.isDoctor.ToString())));

                int i = 1;

                foreach (dynamic ses in r.sessions)
                {
                    Session tempSession = new Session(i);
                    i++;

                    foreach (dynamic m in ses.measurements)
                    {
                        Measurement measurement = new Measurement(Int32.Parse(m.pulse.ToString()), Int32.Parse(m.rpm.ToString()), Int32.Parse(m.speed.ToString()), Int32.Parse(m.distance.ToString()), Int32.Parse(m.requestedPower.ToString()), Int32.Parse(m.energy.ToString()), Int32.Parse(m.actualPower.ToString()), Int32.Parse(m.time.ToString()));
                        tempSession.AddMeasurement(measurement);
                    }

                    users.Last().AddSession(tempSession);
                }

            }
        }
        private void HandleBikeData(Measurement data)
        {

            if (doctorform.InvokeRequired)
            {
                doctorform.Invoke((new Action(() => HandleBikeData(data))));
            }
            else
            {
                //fill fields
                doctorform.summaryUserControl.pulseBox.Text = data.pulse.ToString();
                doctorform.summaryUserControl.rpmInfoBox.Text = data.rpm.ToString();
                doctorform.summaryUserControl.speedInfoBox.Text = data.speed.ToString();
                doctorform.summaryUserControl.distanceInfoBox.Text = data.distance.ToString();
                doctorform.summaryUserControl.requestedBox.Text = data.requestedPower.ToString();
                doctorform.summaryUserControl.energyInfoBox.Text = data.energy.ToString();
                doctorform.summaryUserControl.timeBox.Text = data.time.ToString();
                doctorform.summaryUserControl.actualBox.Text = data.actualPower.ToString();

                //fill graph speed
                speedPoints.Add(new DataPoint(Convert.ToDateTime(data.time.ToString()).ToOADate(), Convert.ToDouble(data.speed.ToString())));
                doctorform.summaryUserControl.speedChart.Series[0].Points.Clear();
                for (int i = 0; i < speedPoints.Count; i++)
                    doctorform.summaryUserControl.speedChart.Series[0].Points.Add(speedPoints[i]);
                if (speedPoints.Count > 25)
                    speedPoints.RemoveAt(0);
                doctorform.summaryUserControl.speedChart.Update();

                //fill graph pulse
                bpmPoints.Add(new DataPoint(Convert.ToDateTime(data.time.ToString()).ToOADate(), Convert.ToDouble(data.pulse.ToString())));
                doctorform.summaryUserControl.bpmChart.Series[0].Points.Clear();
                for (int i = 0; i < bpmPoints.Count; i++)
                    doctorform.summaryUserControl.bpmChart.Series[0].Points.Add(bpmPoints[i]);
                if (bpmPoints.Count > 25)
                    bpmPoints.RemoveAt(0);
                doctorform.summaryUserControl.speedChart.Update();

                //fill graph rpm
                rpmPoints.Add(new DataPoint(Convert.ToDateTime(data.time.ToString()).ToOADate(), Convert.ToDouble(data.rpm.ToString())));
                doctorform.summaryUserControl.rpmChart.Series[0].Points.Clear();
                for (int i = 0; i < rpmPoints.Count; i++)
                    doctorform.summaryUserControl.rpmChart.Series[0].Points.Add(rpmPoints[i]);
                if (rpmPoints.Count > 25)
                    rpmPoints.RemoveAt(0);
                doctorform.summaryUserControl.rpmChart.Update();
            }

        }
 public void AddMeasurement(Measurement m)
 {
     measurements.Add(m);
 }