1+ #include " SocketInput.h"
2+
3+ #include < I18n.h>
4+ #include < thread>
5+
6+ #include " DasherInterfaceBase.h"
7+ #include " DasherModel.h"
8+
9+ SocketInput::SocketInput (CSettingsUser* Creator, Dasher::CDashIntfSettings* Controller, Dasher::CFrameRate* pFramerate): CScreenCoordInput(0 , _(" Socket Input" )),
10+ CDefaultFilter(Creator, Controller, pFramerate, 2 , " Socket Mode" )
11+ {
12+ xLabel = Controller->GetStringParameter (Dasher::Parameter::SP_SOCKET_INPUT_X_LABEL);
13+ yLabel = Controller->GetStringParameter (Dasher::Parameter::SP_SOCKET_INPUT_Y_LABEL);
14+ }
15+
16+ SocketInput::~SocketInput ()
17+ {
18+ stopListen ();
19+ }
20+
21+ bool SocketInput::GetScreenCoords (Dasher::screenint& iX, Dasher::screenint& iY, Dasher::CDasherView* pView)
22+ {
23+ const Dasher::CDasherView::ScreenRegion screenRegion = pView->VisibleRegion ();
24+
25+ const double vectorLength = std::min (Dasher::CDasherModel::ORIGIN_Y - screenRegion.minY , screenRegion.maxY - Dasher::CDasherModel::ORIGIN_Y);
26+ const double normalization = sqrt (lastRelativeX * lastRelativeX + lastRelativeY * lastRelativeY);
27+
28+ pView->Dasher2Screen (
29+ Dasher::CDasherModel::ORIGIN_X - static_cast <Dasher::myint>(lastRelativeX * (normalization > 1.0 ? vectorLength / normalization : vectorLength)),
30+ Dasher::CDasherModel::ORIGIN_Y - static_cast <Dasher::myint>(lastRelativeY * (normalization > 1.0 ? vectorLength / normalization : vectorLength)),
31+ iX, iY);
32+
33+ return true ;
34+ }
35+
36+ void SocketInput::startListen ()
37+ {
38+ session_acceptor = std::make_unique<asio::ip::tcp::acceptor>(io_service, asio::ip::tcp::endpoint (asio::ip::tcp::v4 (), static_cast <short >(Controller->GetLongParameter (Dasher::LP_SOCKET_PORT))));
39+
40+ receiveThread = std::thread ([this ](){
41+
42+ asio::error_code ec;
43+ keepListenServerAlive = true ;
44+ while (keepListenServerAlive)
45+ {
46+ open_socket = std::make_unique<asio::ip::tcp::socket>(session_acceptor->accept (ec));
47+
48+ if (ec) continue ; // error while accepting occured
49+
50+ keepReadThreadAlive = true ;
51+ size_t bytes_read = 0 ;
52+ while (keepReadThreadAlive)
53+ {
54+ if ((bytes_read = read_until (*open_socket, stream_buffer, ' \n ' , ec)))
55+ {
56+ std::string_view data{
57+ static_cast <const char *>(stream_buffer.data ().data ()),
58+ stream_buffer.size ()
59+ };
60+
61+ try {
62+ std::string_view cmd = data.substr (0 , data.find (' ' ));
63+ const double num = std::stod (data.data () + cmd.size ()); // skip first two characters <cmd><whitespace>
64+
65+ if (cmd == xLabel)
66+ {
67+ lastRelativeX = num;
68+ relativeMode = true ;
69+ }else if (cmd == yLabel)
70+ {
71+ lastRelativeY = num;
72+ relativeMode = true ;
73+ }else if (cmd == startStopLabel)
74+ {
75+ if (num >= 0.5 )
76+ {
77+ run (0 );
78+ }else
79+ {
80+ stop ();
81+ }
82+ }
83+ } catch (std::exception& e)
84+ {
85+ std::cout << " Wrong format for socket input" << std::endl;
86+ }
87+
88+ stream_buffer.consume (bytes_read);
89+ } else if (ec) break ;
90+ }
91+ open_socket->close ();
92+ }
93+ });
94+ }
95+
96+ void SocketInput::stopListen ()
97+ {
98+ keepListenServerAlive = false ;
99+ keepReadThreadAlive = false ;
100+ session_acceptor->close ();
101+ open_socket->close ();
102+ receiveThread.join ();
103+ }
0 commit comments