2015-01-31 18:12:20 +00:00
/*************************************************************************
* Copyright ( C ) 2015 by Andrius Š tikonas < andrius @ stikonas . eu > *
* *
* This program is free software ; you can redistribute it and / or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation ; either version 3 of the License , or *
* ( at your option ) any later version . *
* *
* This program is distributed in the hope that it will be useful , *
* but WITHOUT ANY WARRANTY ; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the *
* GNU General Public License for more details . *
* *
* You should have received a copy of the GNU General Public License *
* along with this program . If not , see < http : //www.gnu.org/licenses/>.*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# include <iostream>
# include "consolereader.h"
2015-02-22 23:20:20 +00:00
# include "server.h"
2015-01-31 18:12:20 +00:00
2015-08-18 15:29:09 +01:00
ConsoleReader : : ConsoleReader ( std : : vector < Socket * > * sockets_vector )
2015-01-31 18:12:20 +00:00
{
sockets = sockets_vector ;
2015-02-01 01:42:45 +00:00
start ( ) ;
2015-01-31 18:12:20 +00:00
}
void ConsoleReader : : run ( )
{
2017-03-13 02:04:56 +00:00
std : : cout < < " Copyright (C) 2015 Andrius Štikonas. \n License: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> \n This is free software: you are free to change and redistribute it. \n There is NO WARRANTY, to the extent permitted by law. " < < std : : endl ;
2015-02-28 23:30:00 +00:00
connectSignals ( ) ;
2015-02-03 01:24:47 +00:00
listSockets ( ) ;
std : : string command ;
2015-11-15 15:36:22 +00:00
activeSocket = 0 ;
2015-01-31 18:12:20 +00:00
bool cont = true ;
2015-08-18 15:29:09 +01:00
while ( cont ) {
2015-01-31 18:12:20 +00:00
std : : cin > > command ;
2015-08-18 15:29:09 +01:00
switch ( command [ 0 ] ) {
case ' a ' : {
2015-02-28 23:30:00 +00:00
std : : cout < < " Please set your Orvibo socket to pair mode (rapidly blinking blue light) and wait until new wifi network (WiWo-S20) appears " < < std : : endl ;
2015-05-26 00:02:19 +01:00
std : : string ssid , password ;
std : : cout < < " Wireless name ( \" c \" for current wifi): " ;
std : : cin > > ssid ;
2015-02-22 23:20:20 +00:00
std : : cout < < " Password: " ;
std : : cin > > password ;
2015-05-26 00:02:19 +01:00
Server * server = new Server ( 48899 , QByteArray : : fromStdString ( ssid ) , QByteArray : : fromStdString ( password ) ) ; // HF-LPB100 chip can be controlled over port 48899
2015-03-11 12:34:56 +00:00
break ;
}
2015-08-18 15:29:09 +01:00
case ' A ' : {
2015-03-11 12:34:56 +00:00
std : : cout < < " Please set your Orvibo socket to factory reset mode (rapidly blinking red light) " < < std : : endl ;
std : : string password ;
std : : cout < < " Password: " ;
std : : cin > > password ;
broadcastPassword ( QString : : fromStdString ( password ) ) ; // HF-LPB100 chip can be controlled over port 49999
2015-02-22 23:20:20 +00:00
break ;
}
2015-02-01 01:42:45 +00:00
case ' d ' :
2015-11-15 15:36:22 +00:00
( * sockets ) [ activeSocket ] - > tableData ( ) ;
2015-02-01 01:42:45 +00:00
break ;
2015-04-02 22:10:06 +01:00
case ' D ' :
2015-11-15 15:36:22 +00:00
( * sockets ) [ activeSocket ] - > discover ( ) ;
2015-04-02 22:10:06 +01:00
break ;
2015-08-18 15:29:09 +01:00
case ' n ' : {
2015-02-09 21:09:50 +00:00
std : : string name ;
std : : cout < < " Please enter a new name: " ;
std : : cin > > name ;
2015-11-15 15:36:22 +00:00
( * sockets ) [ activeSocket ] - > changeSocketName ( QString : : fromStdString ( name ) ) ;
2015-02-01 01:42:45 +00:00
break ;
2015-02-03 01:24:47 +00:00
}
2015-02-01 01:42:45 +00:00
case ' p ' :
2015-11-15 15:36:22 +00:00
( * sockets ) [ activeSocket ] - > toggle ( ) ;
2015-02-01 01:42:45 +00:00
break ;
2015-05-26 00:02:19 +01:00
case ' o ' :
if ( command = = " off " )
2015-11-15 15:36:22 +00:00
( * sockets ) [ activeSocket ] - > powerOff ( ) ;
2015-05-26 00:02:19 +01:00
else if ( command = = " on " )
2015-11-15 15:36:22 +00:00
( * sockets ) [ activeSocket ] - > powerOn ( ) ;
2015-11-16 01:10:27 +00:00
else {
uint16_t offTime ;
std : : cout < < " Off time in seconds: " ;
std : : cin > > offTime ;
( * sockets ) [ activeSocket ] - > setOffTimer ( offTime ) ;
}
break ;
case ' O ' :
( * sockets ) [ activeSocket ] - > toggleOffTimer ( ) ;
2015-05-26 00:02:19 +01:00
break ;
2015-08-18 15:29:09 +01:00
case ' P ' : {
2015-02-15 12:31:21 +00:00
std : : string password ;
std : : cout < < " Please enter a new password: " ;
std : : cin > > password ;
2015-11-15 15:36:22 +00:00
( * sockets ) [ activeSocket ] - > changeSocketPassword ( QString : : fromStdString ( password ) ) ;
2015-02-15 12:31:21 +00:00
break ;
}
2015-02-01 01:42:45 +00:00
case ' q ' :
cont = false ;
2015-08-18 15:29:09 +01:00
emit ( QCoreApplication : : quit ( ) ) ;
2015-02-01 01:42:45 +00:00
break ;
case ' s ' :
2015-11-15 15:36:22 +00:00
std : : cin > > activeSocket ;
- - activeSocket ; // count from 0
2015-02-01 01:42:45 +00:00
listSockets ( ) ;
break ;
2015-08-18 15:29:09 +01:00
case ' t ' : {
2015-02-15 12:31:21 +00:00
int timezone ;
std : : cout < < " Please enter a new timezone (integer from -11 to 12): " ;
std : : cin > > timezone ;
2015-11-15 03:09:37 +00:00
if ( timezone > = - 11 & & timezone < = 12 )
2015-11-15 15:36:22 +00:00
( * sockets ) [ activeSocket ] - > changeTimezone ( timezone ) ;
2015-11-15 03:09:37 +00:00
else
std : : cout < < " Invalid timezone " ;
2015-02-15 12:31:21 +00:00
break ;
}
2015-02-01 01:42:45 +00:00
default :
std : : cout < < " Invalid command: try again " < < std : : endl ;
2015-01-31 18:12:20 +00:00
}
}
}
void ConsoleReader : : listSockets ( )
{
2016-09-02 22:33:26 +01:00
for ( const auto & socket : * sockets ) {
2015-02-15 12:31:21 +00:00
std : : cout < < " _____________________________________________________________________________ \n " < < std : : endl ;
2016-09-02 22:33:26 +01:00
std : : cout < < " IP Address: " < < socket - > ip . toString ( ) . remove ( " ::ffff: " ) . toStdString ( ) < < " \t MAC Address: " < < socket - > mac . toHex ( ) . toStdString ( ) < < " \t Power: " < < ( socket - > powered ? " On " : " Off " ) < < std : : endl ;
std : : cout < < " Socket Name: " < < socket - > socketName . toStdString ( ) < < " \t Remote Password: " < < socket - > remotePassword . toStdString ( ) < < " \t Timezone: " < < + socket - > timezone < < ( socket - > dst ? " (DST) " : " " ) < < std : : endl ;
std : : cout < < " Off timer: " < < socket - > offTime < < " " < < ( socket - > offTimerEnabled ? " (enabled) " : " (disabled) " ) < < " \t \t Time: " < < socket - > socketDateTime . toString ( ) . toStdString ( ) < < std : : endl ;
2015-01-31 18:12:20 +00:00
}
2015-02-15 12:31:21 +00:00
std : : cout < < " _____________________________________________________________________________ \n " < < std : : endl ;
2015-11-15 15:36:22 +00:00
if ( sockets - > size ( ) > 0 ) {
std : : cout < < " Active socket: " < < ( * sockets ) [ activeSocket ] - > socketName . toStdString ( ) < < std : : endl ;
}
2015-04-02 22:10:06 +01:00
std : : cout < < " a - add unpaired socket (WiFi needed) \n " ;
std : : cout < < " A - add unpaired socket (no WiFi needed) \n " ;
2018-01-25 00:11:52 +00:00
if ( sockets - > size ( ) > 0 ) {
std : : cout < < " d - update table data \n " ;
std : : cout < < " D - resend discovery packet to the current socket \n " ;
std : : cout < < " n - change socket name (max 16 characters) \n " ;
std : : cout < < " o - set switch off timer \n " ;
std : : cout < < " O - enable/disable switch off timer \n " ;
std : : cout < < " p - toggle power state (there are also \" on \" and \" off \" commands) \n " ;
std : : cout < < " P - change remote password (max 12 characters) \n " ;
}
std : : cout < < " q - quit \n " ;
if ( sockets - > size ( ) > 0 ) {
std : : cout < < " s - select another socket (default is 1) \n " ;
std : : cout < < " t - change timezone " < < std : : endl ;
}
std : : cout < < " Enter command: " < < std : : endl ;
2015-01-31 18:12:20 +00:00
}
2015-02-28 23:30:00 +00:00
void ConsoleReader : : connectSignals ( )
{
2017-03-13 02:04:56 +00:00
for ( const auto & socket : * sockets ) {
connect ( socket , & Socket : : stateChanged , this , & ConsoleReader : : listSockets ) ;
2015-02-28 23:30:00 +00:00
}
}