30.11.2013 - New PICollection namespace, Android support, my own PIVector implementation

This commit is contained in:
peri4
2013-11-30 19:34:53 +04:00
parent ec5530053a
commit f50891b376
64 changed files with 5466 additions and 3392 deletions

View File

@@ -21,6 +21,31 @@
#include "pipeer.h"
/** \class PIConsole
* \brief Console output class
* \details
* \section PIConsole_sec0 Synopsis
* This class provides output to console with automatic alignment and update.
* It supports tabs, keyboard listening, formats and colors.
*
* \section PIConsole_sec1 Layout
* %PIConsole works with variable pointers. You should add your variables with
* functions \a addVariable() which receives label name, pointer to variable
* and optional column and format. Columns count is dynamically increased if
* new column used. E.g. if you add variable to empty tab to column 3, columns
* count will be increased to 3, but two firsts columns will be empty. Each column
* filled from top to bottom, but you can add just string with function
* \a addString() or add empty line with function \a addEmptyLine(). Layout scheme:
* \image html piconsole_layout.png
*
* \section PIConsole_sec2 Keyboard usage
* %PIConsole should to be single in application. %PIConsole aggregate PIKbdListener
* which grab keyboard and automatic switch tabs by theirs bind keys. If there is no
* tab binded to pressed key external function "slot" will be called
*
**/
extern PIMutex __PICout_mutex__;
@@ -173,6 +198,7 @@ void PIConsole::key_event(char key, void * t) {
}
}
if (p->ret_func != 0) p->ret_func(key, t);
p->keyPressed(key, t);
}
@@ -352,13 +378,12 @@ void PIConsole::run() {
continue;
}
moveRight(tv.offset);
PIString rstr;
const void * ptr = 0;
if (tv.remote) {
if (tv.type == 0) {
rstr.clear();
PIByteArray tba(tv.rdata);
tba >> rstr;
rba = tv.rdata;
rba >> rstr;
rstr.trim();
ptr = &rstr;
} else
@@ -580,6 +605,24 @@ void PIConsole::addVariable(const PIString & name, const llong * ptr, int col, P
ADD_VAR_BODY tv.type = 12; tv.size = sizeof(*ptr); tv.ptr = ptr; column(col).push_back(tv);}
void PIConsole::addVariable(const PIString & name, const ullong * ptr, int col, PIFlags<PIConsole::Format> format) {
ADD_VAR_BODY tv.type = 13; tv.size = sizeof(*ptr); tv.ptr = ptr; column(col).push_back(tv);}
/** \brief Add to current tab to column "column" variable with label "name", pointer "ptr" and format "format"
* \details This function add to column "column" next lines:
* * "protocol <name>"
* * "Rec - receiverDeviceName": \a PIProtocol::receiverDeviceState
* * "Send - senderDeviceName": \a PIProtocol::senderDeviceState
* * "Received count": \a PIProtocol::receiveCount
* * "Invalid count": \a PIProtocol::wrongCount
* * "Missed count": \a PIProtocol::missedCount
* * "Sended count": \a PIProtocol::sendCount
* * "Immediate Frequency, Hz": \a PIProtocol::immediateFrequency
* * "Integral Frequency, Hz": \a PIProtocol::integralFrequency
* * "Receive speed": \a PIProtocol::receiveSpeed
* * "Send speed": \a PIProtocol::sendSpeed
* * "Receiver history size": \a PIProtocol::receiverHistorySize
* * "Sender history size": \a PIProtocol::senderHistorySize
* * "Disconnect Timeout, s": \a PIProtocol::disconnectTimeout
* * "Quality": \a PIProtocol::quality
* */
void PIConsole::addVariable(const PIString & name, const PIProtocol * ptr, int col, PIFlags<PIConsole::Format> format) {
addString("protocol " + name, col, format | PIConsole::Bold);
addVariable("Rec - " + ptr->receiverDeviceName(), ptr->receiverDeviceState_ptr(), col, format);
@@ -597,6 +640,18 @@ void PIConsole::addVariable(const PIString & name, const PIProtocol * ptr, int c
addVariable("Disconnect Timeout, s", ptr->disconnectTimeout_ptr(), col, format);
addVariable("Quality", ptr->quality_ptr(), col, format);
}
/** \brief Add to current tab to column "column" variable with label "name", pointer "ptr" and format "format"
* \details This function add to column "column" next lines:
* * "<name> diagnostics"
* * "Received count": \a PIDiagnostics::receiveCount
* * "Invalid count": \a PIDiagnostics::wrongCount
* * "Sended count": \a PIDiagnostics::sendCount
* * "Immediate Frequency, Hz": \a PIDiagnostics::immediateFrequency
* * "Integral Frequency, Hz": \a PIDiagnostics::integralFrequency
* * "Receive speed": \a PIDiagnostics::receiveSpeed
* * "Send speed": \a PIDiagnostics::sendSpeed
* * "Quality": \a PIDiagnostics::quality
* */
void PIConsole::addVariable(const PIString & name, const PIDiagnostics * ptr, int col, PIFlags<PIConsole::Format> format) {
addString(name + " diagnostics", col, format | PIConsole::Bold);
addVariable("Received count", ptr->receiveCount_ptr(), col, format);
@@ -704,6 +759,7 @@ void PIConsole::startServer(const PIString & name) {
server_mode = true;
peer = new PIPeer("_rcs_:" + name);
CONNECT2(void, const PIString & , const PIByteArray &, peer, dataReceivedEvent, this, peerReceived);
CONNECT1(void, const PIString & , peer, peerDisconnectedEvent, this, peerDisconnectedEvent);
peer_timer.start(50.);
serverSendInfo();
}
@@ -795,6 +851,7 @@ void PIConsole::serverSendData() {
break;
case Connected:
ba << int(0xEE) << content;
//piCout << "send data" << ba.size();
break;
default: break;
}
@@ -920,3 +977,12 @@ void PIConsole::peerTimer(void * data, int delim) {
};
}
}
void PIConsole::peerDisconnectedEvent(const PIString & name) {
for (int i = 0; i < remote_clients.size_s(); ++i)
if (remote_clients[i].name == name) {
remote_clients.remove(i);
--i;
}
}