Nicolas Borla
/
BBR_1Ebene
BBR 1 Ebene
SerialCom.cpp
- Committer:
- borlanic
- Date:
- 2018-05-14
- Revision:
- 0:fbdae7e6d805
File content as of revision 0:fbdae7e6d805:
/* * SerialServer.cpp * Copyright (c) 2017, ZHAW * All rights reserved. * * Created on: 05.06.2017 * Author: Marcel Honegger */ #include <mbed.h> #include <iostream> #include <string> #include <sstream> #include <vector> #include "SerialCom.h" using namespace std; const float SerialCom::PERIOD = 0.0001f; // the period of the timer interrupt, given in [s] const char SerialCom::DELIM = ','; /** * Create a serial server object. SerialServer::SerialServer(RawSerial& serial, StateMachine& stateMachine) : serial(serial), stateMachine(stateMachine), thread(osPriorityRealtime, STACK_SIZE) { */ SerialCom::SerialCom(RawSerial& serial) : serial(serial), thread(osPriorityRealtime, STACK_SIZE) { // initialize local values input.clear(); // start thread and ticker timer interrupt service routine dataRecived = false; gainG = 1.1f; gain_dG = 1.1f; thread.start(callback(this, &SerialCom::run)); ticker.attach(callback(this, &SerialCom::sendSignal), PERIOD); } /** * Delete the serial server object and release all allocated resources. */ SerialCom::~SerialCom() { ticker.detach(); } /** * This method is called by the ticker timer interrupt service routine. * It sends a signal to the thread to make it run again. */ void SerialCom::sendSignal() { thread.signal_set(signal); } /** * This <code>run()</code> method contains an infinite loop with the run logic. */ void SerialCom::run() { //Serial pc(PA_2, PA_3); // tx, rx //pc.baud(9600); Serial pc1(USBTX, USBRX); // tx, rx pc1.baud(100000); while (true) { // wait for the periodic signal thread.signal_wait(signal); // read received characters while buffer is full while (serial.readable()) { int32_t c = serial.getc(); //if (input.size() >= MESSAGE_SIZE) input.erase(0, 1); input += static_cast<uint8_t>(c); } // try to decode a message if (input[input.size()-1] != '&') { // message is too short, keep reading... } else { //pc.printf("command: %s\r\n", input); splitString(); if (tokens[0] == "M") { if (tokens.size() == 45+2) { float newK[3][15]; int y = 0; int x = 0; float checksum = 0; for (int i=1; i < tokens.size()-1; i++) { newK[y][x] = strtof((tokens[i]).c_str(), 0); //pc.printf("Element %d , %d: %.10f\r\n", y, x, newK[y][x]); x++; checksum += newK[y][x]; if (x == 15){ x = 0; y++; } } } else{ //pc.printf("Data to short od long\r\n"); } } else if (tokens[0] == "G") { //pc.printf("Send data to pc\r\n"); if(sendData == false) { sendData = true; runCount = 0; } else{ sendData = false; } } else if (tokens[0] == "N") { //pc.printf("\r\nN\r\n"); float data[4] = {}; for (int i=1; i < tokens.size(); i++) { data[i-1] = strtof((tokens[i]).c_str(), 0); //pc.printf("Element %d %.2f\r\n", i,data[i-1]); } this->gainG = data[0]; this->gain_dG = data[1]; this->offsetX = data[2]; this->offsetY = data[3]; this->dataRecived = true; //pc1.printf("\r\ %d %.2f %.2f\r\n",dataRecived,gainG,gain_dG); } else{ //pc.printf("Command not understood\r\n"); } tokens.clear(); input.clear(); } if(sendData == true) { if (output.size() == 0 && runCount >= 1000){ output += "Hello nicolas\n"; runCount = 0; } } runCount++; while (serial.writeable() && (output.size() > 0)) { serial.putc(output[0]); output.erase(0, 1); } } } void SerialCom::splitString() { stringstream ss(input); string item; while (getline(ss, item, DELIM)) { tokens.push_back(item); } return; }