15
15
16
16
#include < iostream>
17
17
18
+ #define DEBUG_LOGGING true
19
+
18
20
CHEOS::CHEOS (const int ID, const std::string &IPAddress, const int Port, const std::string &User, const std::string &Pwd, const int PollIntervalsec, const int PingTimeoutms) :
19
21
m_IP(IPAddress),
20
22
m_User(User),
@@ -91,9 +93,10 @@ void CHEOS::handleMessage(std::string& pMessage)
91
93
if (root.isMember (" payload" ))
92
94
{
93
95
for ( Json::ValueIterator itr = root[" payload" ].begin () ; itr != root[" payload" ].end () ; itr++ ) {
94
- if (root[" payload" ][itr].isMember (" name" ) && root[" payload" ][itr].isMember (" pid" ))
96
+ std::string key = itr.key ().asString ();
97
+ if (root[" payload" ][key].isMember (" name" ) && root[" payload" ][key].isMember (" pid" ))
95
98
{
96
- AddNode (root[" payload" ][itr ][" name" ], root[" payload" ][itr ][" pid" ]);
99
+ AddNode (root[" payload" ][key ][" name" ]. asString () , root[" payload" ][key ][" pid" ]. asString () );
97
100
}
98
101
else
99
102
{
@@ -121,11 +124,13 @@ void CHEOS::handleMessage(std::string& pMessage)
121
124
std::string pid = SplitMessagePlayer[1 ];
122
125
std::string state = SplitMessageState[1 ];
123
126
124
- if (sMode == " play" )
127
+ _eMediaStatus nStatus = MSTAT_UNKNOWN;
128
+
129
+ if (state == " play" )
125
130
nStatus = MSTAT_PLAYING;
126
- else if (sMode == " pause" )
131
+ else if (state == " pause" )
127
132
nStatus = MSTAT_PAUSED;
128
- else if (sMode == " stop" )
133
+ else if (state == " stop" )
129
134
nStatus = MSTAT_STOPPED;
130
135
else
131
136
nStatus = MSTAT_ON;
@@ -135,7 +140,7 @@ void CHEOS::handleMessage(std::string& pMessage)
135
140
UpdateNodeStatus (pid, nStatus, sStatus );
136
141
137
142
/* If playing request now playing information */
138
- if (sMode == " play" ) {
143
+ if (state == " play" ) {
139
144
int PlayerID = atoi (pid.c_str ());
140
145
SendCommand (" player/get_now_playing_media" , PlayerID);
141
146
}
@@ -150,16 +155,17 @@ void CHEOS::handleMessage(std::string& pMessage)
150
155
StringSplit (root[" heos" ][" message" ].asString (), " =" , SplitMessage);
151
156
if (SplitMessage.size () > 0 )
152
157
{
158
+ std::string sLabel = " " ;
159
+ std::string sStatus = " " ;
160
+ std::string pid = SplitMessage[1 ];
161
+
153
162
if (root[" heos" ].isMember (" payload" ))
154
163
{
155
- std::string pid = SplitMessage[1 ];
156
- std::string sStatus = " " ;
157
-
164
+
158
165
std::string sTitle = " " ;
159
166
std::string sAlbum = " " ;
160
167
std::string sArtist = " " ;
161
168
std::string sStation = " " ;
162
- std::string sLabel = " " ;
163
169
164
170
sTitle = root[" payload" ][" song" ].asString ();
165
171
sAlbum = root[" payload" ][" album" ].asString ();
@@ -218,17 +224,18 @@ void CHEOS::handleConnect()
218
224
if (!m_stoprequested && !m_Socket)
219
225
{
220
226
m_iMissedPongs = 0 ;
227
+ std::string sPort = std::to_string (m_Port);
221
228
boost::system::error_code ec;
222
229
boost::asio::ip::tcp::resolver resolver (*m_Ios);
223
- boost::asio::ip::tcp::resolver::query query (m_IP, (m_Port[ 0 ] != ' - ' ? m_Port : m_Port. substr ( 1 )) );
230
+ boost::asio::ip::tcp::resolver::query query (m_IP, sPort );
224
231
boost::asio::ip::tcp::resolver::iterator iter = resolver.resolve (query);
225
232
boost::asio::ip::tcp::endpoint endpoint = *iter;
226
233
m_Socket = new boost::asio::ip::tcp::socket (*m_Ios);
227
234
m_Socket->connect (endpoint, ec);
228
235
if (!ec)
229
236
{
230
- _log.Log (LOG_NORM, " HEOS by DENON: Connected to '%s:%s'." , m_IP.c_str (), (m_Port[ 0 ] != ' - ' ? m_Port. c_str () : m_Port. substr ( 1 ). c_str ()) );
231
- m_Socket->async_read_some (boost::asio::buffer (m_Buffer, sizeof m_Buffer), boost::bind (&CHEOS::handleRead, shared_from_this () , boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
237
+ _log.Log (LOG_NORM, " HEOS by DENON: Connected to '%s:%s'." , m_IP.c_str (), sPort );
238
+ m_Socket->async_read_some (boost::asio::buffer (m_Buffer, sizeof m_Buffer), boost::bind (&CHEOS::handleRead, this , boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
232
239
// Disable registration for change events following HEOS Controller advise
233
240
handleWrite (std::string (" heos://system/register_for_change_events?enable=off" ));
234
241
}
@@ -244,7 +251,7 @@ void CHEOS::handleConnect()
244
251
)
245
252
) // Connection failed due to no response, no route or active refusal
246
253
{
247
- _log.Log (LOG_NORM, " HEOS by DENON: Connect to '%s:%s' failed: (%d) %s" , m_IP.c_str (), (m_Port[ 0 ] != ' - ' ? m_Port. c_str () : m_Port. substr ( 1 ). c_str ()) , ec.value (), ec.message ().c_str ());
254
+ _log.Log (LOG_NORM, " HEOS by DENON: Connect to '%s:%s' failed: (%d) %s" , m_IP.c_str (), sPort , ec.value (), ec.message ().c_str ());
248
255
}
249
256
delete m_Socket;
250
257
m_Socket = NULL ;
@@ -289,7 +296,7 @@ void CHEOS::handleRead(const boost::system::error_code& e, std::size_t bytes_tra
289
296
if (!m_stoprequested && m_Socket)
290
297
m_Socket->async_read_some ( boost::asio::buffer (m_Buffer, sizeof m_Buffer),
291
298
boost::bind (&CHEOS::handleRead,
292
- shared_from_this () ,
299
+ this ,
293
300
boost::asio::placeholders::error,
294
301
boost::asio::placeholders::bytes_transferred));
295
302
}
@@ -715,7 +722,8 @@ void CHEOS::UpdateNodesStatus(const std::string &DevID, const std::string &sStat
715
722
716
723
void CHEOS::AddNode (const std::string &Name, const std::string &PlayerID)
717
724
{
718
- // Check if exists
725
+ std::vector<std::vector<std::string> > result;
726
+
719
727
result = m_sql.safe_query (" SELECT ID FROM DeviceStatus WHERE (HardwareID==%d) AND (DeviceID=='%q')" , m_HwdID, PlayerID.c_str ());
720
728
if (result.size ()>0 ) {
721
729
int ID = atoi (result[0 ][0 ].c_str ());
@@ -756,6 +764,51 @@ void CHEOS::Restart()
756
764
StartHardware ();
757
765
}
758
766
767
+ bool CHEOS::WriteToHardware (const char *pdata, const unsigned char length)
768
+ {
769
+ const tRBUF *pSen = reinterpret_cast <const tRBUF*>(pdata);
770
+
771
+ unsigned char packettype = pSen->ICMND .packettype ;
772
+
773
+ if (packettype != pTypeLighting2)
774
+ return false ;
775
+
776
+ long DevID = (pSen->LIGHTING2 .id3 << 8 ) | pSen->LIGHTING2 .id4 ;
777
+ std::vector<HEOSNode>::const_iterator itt;
778
+ for (itt = m_nodes.begin (); itt != m_nodes.end (); ++itt)
779
+ {
780
+ if (itt->DevID == DevID)
781
+ {
782
+ int iParam = pSen->LIGHTING2 .level ;
783
+ std::string sParam ;
784
+ switch (pSen->LIGHTING2 .cmnd )
785
+ {
786
+ case light2_sOn:
787
+ case light2_sGroupOn:
788
+ case light2_sOff:
789
+ case light2_sGroupOff:
790
+ case gswitch_sPlay:
791
+ SendCommand (" getNowPlaying" , itt->DevID );
792
+ SendCommand (" setPlayStatePlay" , itt->DevID );
793
+ return true ;
794
+ case gswitch_sPlayPlaylist:
795
+ case gswitch_sPlayFavorites:
796
+ case gswitch_sStop:
797
+ SendCommand (" setPlayStateStop" , itt->DevID );
798
+ return true ;
799
+ case gswitch_sPause:
800
+ SendCommand (" setPlayStatePause" , itt->DevID );
801
+ return true ;
802
+ case gswitch_sSetVolume:
803
+ default :
804
+ return true ;
805
+ }
806
+ }
807
+ }
808
+
809
+ return false ;
810
+ }
811
+
759
812
void CHEOS::ReloadNodes ()
760
813
{
761
814
m_nodes.clear ();
@@ -840,7 +893,7 @@ namespace http {
840
893
if (result.size () == 1 )
841
894
{
842
895
_eSwitchType sType = (_eSwitchType)atoi (result[0 ][0 ].c_str ());
843
- int PlayerID = atoi (result[0 ][1 ].. c_str ());
896
+ int PlayerID = atoi (result[0 ][1 ].c_str ());
844
897
_eHardwareTypes hType = (_eHardwareTypes)atoi (result[0 ][2 ].c_str ());
845
898
int HwID = atoi (result[0 ][3 ].c_str ());
846
899
// Is the device a media Player?
@@ -849,7 +902,7 @@ namespace http {
849
902
switch (hType) {
850
903
case HTYPE_HEOS:
851
904
CHEOS HEOS (HwID);
852
- HEOS.SendCommand (sAction , PlayerId );
905
+ HEOS.SendCommand (sAction , PlayerID );
853
906
break ;
854
907
// put other players here ...
855
908
}
0 commit comments