Skip to content

Commit

Permalink
Merge branch 'api-v3.0.0-cxx-dev' into development
Browse files Browse the repository at this point in the history
  • Loading branch information
AJIOB committed Sep 4, 2017
2 parents f4b8461 + 9315e22 commit c1343c5
Show file tree
Hide file tree
Showing 15 changed files with 220 additions and 6 deletions.
41 changes: 41 additions & 0 deletions code/c++/cxx-api/AutoConnector.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
#include "AutoConnector.h"

AutoConnector::AutoConnector(std::function<void()> c, uint32_t f) : pConnectingThread(nullptr), callback(c),
frequency(f)
{
isRepeat.store(false);
}

AutoConnector::~AutoConnector() {
stop();
}

void AutoConnector::start() {
if (!isRepeat.load() && !pConnectingThread)
{
Data d;
d.callback = callback;
d.pIsRepeat = &isRepeat;
d.frequency = frequency;
isRepeat.store(true);
pConnectingThread = new std::thread([d]() {
while (d.pIsRepeat->load())
{
d.callback();
std::this_thread::sleep_for(std::chrono::milliseconds(d.frequency));
}
});
}
}

void AutoConnector::stop() {
if (isRepeat.load() && pConnectingThread) {
isRepeat.store(false);
pConnectingThread->join();
delete pConnectingThread;
}
}

bool AutoConnector::isConnecting() {
return isRepeat.load();
}
26 changes: 26 additions & 0 deletions code/c++/cxx-api/AutoConnector.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#pragma once
#include <iostream>
#include <atomic>
#include <thread>
#include <chrono>

struct Data {
std::function<void()> callback;
std::atomic_bool* pIsRepeat;
uint32_t frequency;
};

class AutoConnector {
private:
std::thread* pConnectingThread;
std::function<void()> callback;
std::atomic_bool isRepeat;
uint32_t frequency;

public:
AutoConnector(std::function<void()> c, uint32_t f = 500);
~AutoConnector();
void start();
void stop();
bool isConnecting();
};
4 changes: 3 additions & 1 deletion code/c++/cxx-api/CommandsEnum.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ enum ServoCommands {
enum CommunicationCommands {
startCommunicationCommand = 1, //starting communication command
stopCommunicationCommand = 2, //stopping communication command
refreshConnectionCommunicationCommand = 3, //refreshing connection timer communication command (since API v3)
};

/**
Expand All @@ -56,7 +57,8 @@ enum CommunicationCommands {
*/
enum StartCommands {
startBasicAPI = 1, //default API v1
APIWithAnswer = 2 //API v2
APIWithAnswer = 2, //API v2
APIWithAutoDiconnect = 3 //API v3
};

#endif /* _COMMANDS_ENUM_H_ */
2 changes: 1 addition & 1 deletion code/c++/cxx-api/TrackPlatform_BasicConnector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ const std::string TrackPlatform_BasicConnector::correctAnswer = "OK";

void TrackPlatform_BasicConnector::sendStartCommand()
{
std::string command = std::string() + static_cast<char>(communicationControllerID) + static_cast<char>(startCommunicationCommand) + static_cast<char>(APIWithAnswer);
std::string command = std::string() + static_cast<char>(communicationControllerID) + static_cast<char>(startCommunicationCommand) + static_cast<char>(APIWithAutoDiconnect);
isConnectedToArduino = true;
sendOneCommand(command);
}
Expand Down
11 changes: 11 additions & 0 deletions code/c++/cxx-api/TrackPlatform_BasicManagement.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,12 @@ void TrackPlatform_BasicManagement::sendServo(const std::string& additionalInfo)
readWriteAtomicMutex.unlock();
}

void TrackPlatform_BasicManagement::sendCommunication(const std::string& additionalInfo) {
readWriteAtomicMutex.lock();
connector->sendOneCommand(static_cast<char>(communicationControllerID) + additionalInfo);
readWriteAtomicMutex.unlock();
}

std::vector<uint32_t> TrackPlatform_BasicManagement::parseStringToArray(std::string s)
{
std::vector<uint32_t> distancies;
Expand Down Expand Up @@ -218,3 +224,8 @@ std::vector<uint32_t> TrackPlatform_BasicManagement::servoGetAngles()
readWriteAtomicMutex.unlock();
return parseStringToArray(answer);
}

void TrackPlatform_BasicManagement::refreshConnection() {
std::string toSend(1, refreshConnectionCommunicationCommand);
sendCommunication(toSend);
}
7 changes: 6 additions & 1 deletion code/c++/cxx-api/TrackPlatform_BasicManagement.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,16 @@ class TrackPlatform_BasicManagement
{
TrackPlatform_BasicConnector* connector;

protected:
static const uint8_t minSpeed = 0;
static const uint8_t maxSpeed = 255;
static const uint32_t reconnectTime = 500;
static const char delimiter = ';';

protected:
void sendMove(const std::string& additionalInfo);
void sendSensors(const std::string& additionalInfo);
void sendServo(const std::string& additionalInfo);
void sendCommunication(const std::string& additionalInfo);

static std::vector<uint32_t> parseStringToArray(std::string s);

Expand Down Expand Up @@ -59,6 +61,9 @@ class TrackPlatform_BasicManagement
void servoSetVerticalAngle(uint16_t angle);
void servoSetHorizontalVerticalAngle(uint16_t horizontalAngle, uint16_t verticalAngle);
std::vector<uint32_t> servoGetAngles();

/* connection */
void refreshConnection();
};

#endif /* _TRACKPLATFORM_BASICMANAGEMENT_H_ */
13 changes: 12 additions & 1 deletion code/c++/cxx-api/TrackPlatform_Manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,27 @@ TrackPlatform_BasicConnector* TrackPlatform_Manager::createConnectorByMode(Conne
return res;
}

TrackPlatform_Manager::TrackPlatform_Manager(ConnectionModes mode, const CommunicationInfoStruct& info) :
TrackPlatform_Manager::TrackPlatform_Manager(ConnectionModes mode, const CommunicationInfoStruct& info) :
TrackPlatform_BasicManagement(createConnectorByMode(mode, info))
{
std::function<void()> callback = [this]() { this->refreshConnection(); };
pAutoConnector = new AutoConnector(callback, reconnectTime);
pAutoConnector->start();
}

TrackPlatform_Manager::~TrackPlatform_Manager()
{
if (pAutoConnector) delete pAutoConnector;
TrackPlatform_BasicConnector* connector = getConnector();
if (connector)
{
delete connector;
}
}

void TrackPlatform_Manager::startAutoConnection() {
pAutoConnector->start();
}
void TrackPlatform_Manager::stopAutoConnection() {
pAutoConnector->stop();
}
5 changes: 5 additions & 0 deletions code/c++/cxx-api/TrackPlatform_Manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,19 @@
#include "TrackPlatform_BasicManagement.h"
#include "ConnectionModes.h"
#include "CommunicationInfoStruct.h"
#include "AutoConnector.h"

class TrackPlatform_Manager : public TrackPlatform_BasicManagement
{
static TrackPlatform_BasicConnector* createConnectorByMode(ConnectionModes mode, const CommunicationInfoStruct& info);
AutoConnector* pAutoConnector = nullptr;

public:
TrackPlatform_Manager(ConnectionModes mode, const CommunicationInfoStruct& info);
~TrackPlatform_Manager();

void startAutoConnection();
void stopAutoConnection();
};

#endif /* _TRACKPLATFORM_MANAGER_H_ */
2 changes: 2 additions & 0 deletions code/c++/cxx-api/cxx-api.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="AutoConnector.h" />
<ClInclude Include="BadAddressOrPortException.h" />
<ClInclude Include="CannotConnectToArduinoException.h" />
<ClInclude Include="CommunicationInfoStruct.h" />
Expand All @@ -171,6 +172,7 @@
<ClInclude Include="WSAStartupException.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="AutoConnector.cpp" />
<ClCompile Include="Logger.cpp" />
<ClCompile Include="SerialConnector.cpp" />
<ClCompile Include="serial_support\src\impl\list_ports\list_ports_win.cc" />
Expand Down
6 changes: 6 additions & 0 deletions code/c++/cxx-api/cxx-api.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,9 @@
<ClInclude Include="NoConnectionException.h">
<Filter>exceptions\header</Filter>
</ClInclude>
<ClInclude Include="AutoConnector.h">
<Filter>Communication\header</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="TrackPlatform_BasicManagement.cpp">
Expand Down Expand Up @@ -143,5 +146,8 @@
<ClCompile Include="Logger.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="AutoConnector.cpp">
<Filter>Communication\source</Filter>
</ClCompile>
</ItemGroup>
</Project>
53 changes: 53 additions & 0 deletions code/c++/cxx-app/SensorsViewer.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
#include "SensorsViewer.h"

void SensorsViewer::setData(const std::vector<uint32_t>& d, SensorType t) {
if (t == LINE_SENSORS) {
lineSensors = d;
}
else {
distanceSensors = d;
}
}

void SensorsViewer::show() {
if (system("clear")) system("cls");
if (!distanceSensors.empty()) {
if (system("clear")) system("cls");
std::cout << "Distance sensors:" << std::endl;
if (distanceSensors.size() >= 1) std::cout << " " << std::setw(4) << distanceSensors[0] << std::endl;
if (distanceSensors.size() >= 2) std::cout << " " << std::setw(4) << distanceSensors[1] << (distanceSensors.size() == 2 ? "\n" : "");
if (distanceSensors.size() >= 3) std::cout << " " << std::setw(4) << distanceSensors[2] << std::endl;
if (distanceSensors.size() >= 4) std::cout << " " << std::setw(4) << distanceSensors[3] << (distanceSensors.size() == 4 ? "\n" : "");
if (distanceSensors.size() >= 5) std::cout << " " << std::setw(4) << distanceSensors[4] << std::endl;
}
if (!lineSensors.empty()) {
std::cout << "Line sensors:" << std::endl;
std::cout << "|";
for (int i = 0; i < lineSensors.size(); i++) {
std::cout << (lineSensors[i] ? "@@@" : " ");
}
std::cout << "|";
}
}
void SensorsViewer::show(SensorType type) {
if (type == LINE_SENSORS) {
if (!lineSensors.empty()) {
std::cout << "\r" << "|";
for (int i = 0; i < lineSensors.size(); i++) {
std::cout << (lineSensors[i] ? "@@@" : " ");
}
std::cout << "|";
}
}
else {
if (!distanceSensors.empty()) {
if (system("clear")) system("cls");
std::cout << "Distance sensors:" << std::endl;
if (distanceSensors.size() >= 1) std::cout << " " << std::setw(4) << distanceSensors[0] << std::endl;
if (distanceSensors.size() >= 2) std::cout << " " << std::setw(4) << distanceSensors[1] << (distanceSensors.size() == 2 ? "\n" : "");
if (distanceSensors.size() >= 3) std::cout << " " << std::setw(4) << distanceSensors[2] << std::endl;
if (distanceSensors.size() >= 4) std::cout << " " << std::setw(4) << distanceSensors[3] << (distanceSensors.size() == 4 ? "\n" : "");
if (distanceSensors.size() >= 5) std::cout << " " << std::setw(4) << distanceSensors[4] << std::endl;
}
}
}
19 changes: 19 additions & 0 deletions code/c++/cxx-app/SensorsViewer.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#pragma once
#include <iostream>
#include <vector>
#include <stdlib.h>
#include <iomanip>

enum SensorType {
LINE_SENSORS, DISTANCE_SENSORS
};

class SensorsViewer {
std::vector<uint32_t> lineSensors;
std::vector<uint32_t> distanceSensors;

public:
void setData(const std::vector<uint32_t>& d, SensorType t);
void show();
void show(SensorType type);
};
4 changes: 4 additions & 0 deletions code/c++/cxx-app/cxx-app.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,10 @@
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="main.cpp" />
<ClCompile Include="SensorsViewer.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="SensorsViewer.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
Expand Down
8 changes: 8 additions & 0 deletions code/c++/cxx-app/cxx-app.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,13 @@
<ClCompile Include="main.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="SensorsViewer.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="SensorsViewer.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>
Loading

0 comments on commit c1343c5

Please sign in to comment.