git-svn-id: svn://db.shs.com.ru/pip@267 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5
This commit is contained in:
276
main.cpp
276
main.cpp
@@ -1,106 +1,178 @@
|
|||||||
#include "pikbdlistener.h"
|
#include "pip.h"
|
||||||
#include "piconnection.h"
|
|
||||||
#include "piconfig.h"
|
|
||||||
#include "piscreentiles.h"
|
|
||||||
#include "piscreen.h"
|
|
||||||
#include "piethernet.h"
|
|
||||||
#include "piintrospection.h"
|
|
||||||
#include "pifile.h"
|
|
||||||
#include "piterminal.h"
|
|
||||||
#include "piserial.h"
|
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
PIConnection conn;
|
sleep(30);
|
||||||
TilePICout cout_tile;
|
|
||||||
|
|
||||||
|
|
||||||
const char conn_config[] =
|
|
||||||
"[connection]\n\
|
|
||||||
device.test = ser://COM54:115200 #s\n\
|
|
||||||
device.test.disconnectTimeout = 3.00000000 #f\n\
|
|
||||||
[]\n";
|
|
||||||
class TileTerminal: public PIScreenTile {
|
|
||||||
public:
|
|
||||||
TileTerminal(PITerminal * t) {
|
|
||||||
focus_flags = PIScreenTypes::CanHasFocus;
|
|
||||||
term = t;
|
|
||||||
}
|
|
||||||
private:
|
|
||||||
void drawEvent(PIScreenDrawer * d) {
|
|
||||||
//piCout << "draw" << visible;
|
|
||||||
if (!term) return;
|
|
||||||
PIVector<PIVector<PIScreenTypes::Cell> > c = term->content();
|
|
||||||
d->fillRect(x_, y_, x_ + width_, y_ + height_, c);
|
|
||||||
}
|
|
||||||
bool keyEvent(PIKbdListener::KeyEvent key) {
|
|
||||||
//return false;
|
|
||||||
if (key.key == '~') {
|
|
||||||
cout_tile.content.clear();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (!term) return false;
|
|
||||||
term->write(key);
|
|
||||||
}
|
|
||||||
void resizeEvent(int w, int h) {
|
|
||||||
if (!term) return;
|
|
||||||
term->resize(w, h);
|
|
||||||
}
|
|
||||||
PITerminal * term;
|
|
||||||
};
|
|
||||||
|
|
||||||
int main (int argc, char * argv[]) {
|
|
||||||
/*const char cs[] = "this is text\e";
|
|
||||||
PIByteArray ba(cs, sizeof(cs) - 1);
|
|
||||||
PIString s(ba);
|
|
||||||
piCout << ba;
|
|
||||||
piCout << s;
|
|
||||||
piCout << s.toByteArray();
|
|
||||||
return 0;*/
|
|
||||||
PIScreen * screen = 0;
|
|
||||||
if (argc > 1) screen = new PIScreen();
|
|
||||||
PITerminal term;
|
|
||||||
TileTerminal tt(&term);
|
|
||||||
TileScrollBar * s = new TileScrollBar();
|
|
||||||
if (screen) {
|
|
||||||
screen->rootTile()->addTile(&tt);
|
|
||||||
screen->rootTile()->addTile(&cout_tile);
|
|
||||||
screen->enableExitCapture();
|
|
||||||
}
|
|
||||||
tt.setFocus();
|
|
||||||
term.initialize();
|
|
||||||
piMSleep(100);
|
|
||||||
//term.write(PIString("ls -l /etc/\n").toByteArray());
|
|
||||||
//term.write(PIString("mc\n").toByteArray());
|
|
||||||
//term.write(PIString("aptitude\n").toByteArray());
|
|
||||||
if (screen) {
|
|
||||||
screen->start();
|
|
||||||
piMSleep(100);
|
|
||||||
|
|
||||||
piMSleep(200);
|
|
||||||
s->setValue(20);
|
|
||||||
piMSleep(200);
|
|
||||||
s->setValue(50);
|
|
||||||
piMSleep(200);
|
|
||||||
s->setValue(100);
|
|
||||||
|
|
||||||
//piCout << tt.width() << tt.height();
|
|
||||||
term.resize(tt.width(), tt.height());
|
|
||||||
screen->waitForFinish();
|
|
||||||
} else {
|
|
||||||
piMSleep(4000);
|
|
||||||
term.write(PIKbdListener::KeyEvent(PIKbdListener::Tab));
|
|
||||||
piMSleep(1000);
|
|
||||||
term.write(PIKbdListener::KeyEvent(PIKbdListener::Tab));
|
|
||||||
//term.write(PIKbdListener::KeyEvent(PIKbdListener::Space));
|
|
||||||
//term.write(PIString("exit\n").toByteArray());
|
|
||||||
term.write(PIString("Q\n").toByteArray());
|
|
||||||
piMSleep(1000);
|
|
||||||
}
|
|
||||||
if (screen) {
|
|
||||||
screen->rootTile()->takeTile(&tt);
|
|
||||||
screen->rootTile()->takeTile(&cout_tile);
|
|
||||||
delete screen;
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
using namespace PIScreenTypes;
|
||||||
|
|
||||||
|
PIScreen screen;
|
||||||
|
PIConnection conn;
|
||||||
|
TileSimple statustile;
|
||||||
|
TileSimple odbtile;
|
||||||
|
|
||||||
|
void update();
|
||||||
|
void updateODB();
|
||||||
|
|
||||||
|
struct ODBdata {
|
||||||
|
float speed;
|
||||||
|
float temp_engine_coolant;
|
||||||
|
float temp_intake_air;
|
||||||
|
float voltage;
|
||||||
|
float fluel;
|
||||||
|
float pedal_accelerator;
|
||||||
|
float throttle;
|
||||||
|
float engine_load;
|
||||||
|
float engine_RPM;
|
||||||
|
};
|
||||||
|
|
||||||
|
ODBdata odb;
|
||||||
|
|
||||||
|
const char conn_config[] =
|
||||||
|
"[connection]\n\
|
||||||
|
device.test = ser://COM61:9600 #s\n\
|
||||||
|
device.test.disconnectTimeout = 3.00000000 #f\n\
|
||||||
|
filter.raw.device = test\n\
|
||||||
|
filter.raw.splitMode = header & footer\n\
|
||||||
|
filter.raw.header = 0x34 0x31\n\
|
||||||
|
filter.raw.footer = 0x0D\n\
|
||||||
|
[]\n";
|
||||||
|
|
||||||
|
class Obj : public PIObject {
|
||||||
|
PIOBJECT(Obj)
|
||||||
|
public:
|
||||||
|
Obj() {
|
||||||
|
quering = false;
|
||||||
|
CONNECTU(&conn, dataReceivedEvent, this, recv);
|
||||||
|
CONNECTU(&conn, packetReceivedEvent, this, recv2);
|
||||||
|
CONNECTU(&timer, tickEvent, this, tick);
|
||||||
|
st = PISystemTime::current();
|
||||||
|
timer.start(5);
|
||||||
|
}
|
||||||
|
EVENT_HANDLER1(void, keyEv, PIKbdListener::KeyEvent, k) {
|
||||||
|
//piCoutObj << k.key;
|
||||||
|
if (k.key == -20) {
|
||||||
|
piCout << "exiting...";
|
||||||
|
PIKbdListener::exiting = true;
|
||||||
|
}
|
||||||
|
if (k.key == 's') {
|
||||||
|
quering = !quering;
|
||||||
|
}
|
||||||
|
if (k.key == 'a') {
|
||||||
|
quering = true;
|
||||||
|
queryODB();
|
||||||
|
}
|
||||||
|
if (k.key == 'i') {
|
||||||
|
initODB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EVENT_HANDLER2(void, recv, const PIString &, from, const PIByteArray &, data) {
|
||||||
|
PIString s(data);
|
||||||
|
if (s.isEmpty()) return;
|
||||||
|
piCoutObj << from << PIString(data) << PICoutManipulators::Hex << data;
|
||||||
|
}
|
||||||
|
|
||||||
|
EVENT_HANDLER2(void, recv2, const PIString &, from, const PIByteArray &, data) {
|
||||||
|
PIString s(data);
|
||||||
|
s.cutRight(1);
|
||||||
|
if (s.isEmpty()) return;
|
||||||
|
piCoutObj << from << PICoutManipulators::Hex << data << s;
|
||||||
|
PIByteArray ba = PIByteArray::fromHex(s);
|
||||||
|
piCoutObj << s << ba;
|
||||||
|
if (ba.size() < 3) return;
|
||||||
|
int mode = ba[0] - 0x40;
|
||||||
|
int pid = ba[1];
|
||||||
|
if (mode != 1) return;
|
||||||
|
switch(pid) {
|
||||||
|
case 0x0D:
|
||||||
|
odb.speed = ba[2];
|
||||||
|
break;
|
||||||
|
case 0x0C:
|
||||||
|
odb.engine_RPM = (float(ba[2])*256. + float(ba[3]))/4.;
|
||||||
|
break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EVENT_HANDLER(void, tick) {
|
||||||
|
PISystemTime t = PISystemTime::current() - st;
|
||||||
|
if (t.toSeconds() > 100. || t.toSeconds() < -100.) piCout << "time error! " << st << PISystemTime::current(true) << t;
|
||||||
|
st = PISystemTime::current();
|
||||||
|
if (!inited) initODB();
|
||||||
|
queryODB();
|
||||||
|
update();
|
||||||
|
updateODB();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void initODB() {
|
||||||
|
conn.writeByName("test", PIString("ATZ\r\n").toByteArray());
|
||||||
|
piMSleep(1000);
|
||||||
|
inited = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void queryODB() {
|
||||||
|
if (!quering) return;
|
||||||
|
conn.writeByName("test", PIString("01 0D\r").toByteArray());
|
||||||
|
//piMSleep(10);
|
||||||
|
//conn.writeByName("test", PIString("01 0C\r").toByteArray());
|
||||||
|
}
|
||||||
|
bool inited;
|
||||||
|
bool quering;
|
||||||
|
PITimer timer;
|
||||||
|
PISystemTime st;
|
||||||
|
};
|
||||||
|
|
||||||
|
int main (int argc, char * argv[]) {
|
||||||
|
PIScreenTile * tl = new PIScreenTile();
|
||||||
|
tl->direction = Horizontal;
|
||||||
|
statustile.size_policy = Expanding;
|
||||||
|
statustile.maximumWidth = 40;
|
||||||
|
odbtile.size_policy = Expanding;
|
||||||
|
tl->addTile(&statustile);
|
||||||
|
tl->addTile(&odbtile);
|
||||||
|
screen.rootTile()->addTile(tl);
|
||||||
|
screen.rootTile()->addTile(new TilePICout());
|
||||||
|
screen.enableExitCapture();
|
||||||
|
screen.rootTile()->children().front()->setFocus();
|
||||||
|
Obj * o = new Obj();
|
||||||
|
CONNECTU(&screen, keyPressed, o, keyEv)
|
||||||
|
PIString s = conn_config;
|
||||||
|
conn.configureFromString(&s);
|
||||||
|
conn.start();
|
||||||
|
screen.waitForFinish();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void update() {
|
||||||
|
screen.lock();
|
||||||
|
statustile.content.clear();
|
||||||
|
PISerial * ser = (PISerial *)conn.deviceByName("test");
|
||||||
|
PIDiagnostics * diag = conn.diagnostic(ser);
|
||||||
|
if (ser && diag) {
|
||||||
|
statustile.content << TileSimple::Row(ser->constructFullPath() + " - " + PIString::fromBool(ser->isOpened()), CellFormat(PIScreenTypes::Default, PIScreenTypes::Default, PIScreenTypes::Bold));
|
||||||
|
statustile.content << TileSimple::Row(diag->name() + " diagnostics", CellFormat(PIScreenTypes::Default, PIScreenTypes::Default, PIScreenTypes::Bold));
|
||||||
|
statustile.content << TileSimple::Row("Received count: " + PIString::fromNumber(diag->receiveCount()), CellFormat());
|
||||||
|
statustile.content << TileSimple::Row("Invalid count: " + PIString::fromNumber(diag->wrongCount()), CellFormat());
|
||||||
|
statustile.content << TileSimple::Row("Sended count: " + PIString::fromNumber(diag->sendCount()), CellFormat());
|
||||||
|
statustile.content << TileSimple::Row("Immediate Frequency, Hz: " + PIString::fromNumber(diag->immediateFrequency()), CellFormat());
|
||||||
|
statustile.content << TileSimple::Row("Integral Frequency, Hz: " + PIString::fromNumber(diag->integralFrequency()), CellFormat());
|
||||||
|
statustile.content << TileSimple::Row("Receive speed: " + diag->receiveSpeed(), CellFormat());
|
||||||
|
statustile.content << TileSimple::Row("Send speed: " + diag->sendSpeed(), CellFormat());
|
||||||
|
statustile.content << TileSimple::Row("Quality: " + PIString::fromNumber((int)diag->quality()), CellFormat());
|
||||||
|
}
|
||||||
|
screen.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateODB() {
|
||||||
|
screen.lock();
|
||||||
|
odbtile.content.clear();
|
||||||
|
odbtile.content << TileSimple::Row("Speed: " + PIString::fromNumber(odb.speed), CellFormat());
|
||||||
|
odbtile.content << TileSimple::Row("RPM: " + PIString::fromNumber(odb.engine_RPM), CellFormat());
|
||||||
|
screen.unlock();
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ REGISTER_DEVICE(PIBinaryLog)
|
|||||||
|
|
||||||
PIBinaryLog::PIBinaryLog() {
|
PIBinaryLog::PIBinaryLog() {
|
||||||
setThreadedReadBufferSize(65536);
|
setThreadedReadBufferSize(65536);
|
||||||
is_started = is_indexed = false;
|
is_started = is_indexed = is_pause = false;
|
||||||
current_index = -1;
|
current_index = -1;
|
||||||
setPlaySpeed(1.);
|
setPlaySpeed(1.);
|
||||||
setDefaultID(1);
|
setDefaultID(1);
|
||||||
@@ -61,6 +61,7 @@ PIBinaryLog::PIBinaryLog() {
|
|||||||
setFilePrefix(PIString());
|
setFilePrefix(PIString());
|
||||||
setRapidStart(false);
|
setRapidStart(false);
|
||||||
file.setName("__S__PIBinaryLog::file");
|
file.setName("__S__PIBinaryLog::file");
|
||||||
|
// piCoutObj << "created";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -71,6 +72,7 @@ bool PIBinaryLog::openDevice() {
|
|||||||
is_started = false;
|
is_started = false;
|
||||||
is_thread_ok = true;
|
is_thread_ok = true;
|
||||||
is_indexed = false;
|
is_indexed = false;
|
||||||
|
is_pause = false;
|
||||||
index.clear();
|
index.clear();
|
||||||
index_pos.clear();
|
index_pos.clear();
|
||||||
if (mode_ == ReadWrite) {
|
if (mode_ == ReadWrite) {
|
||||||
@@ -121,6 +123,7 @@ bool PIBinaryLog::openDevice() {
|
|||||||
if (!rapidStart()) is_started = true;
|
if (!rapidStart()) is_started = true;
|
||||||
}
|
}
|
||||||
startlogtime = PISystemTime::current();
|
startlogtime = PISystemTime::current();
|
||||||
|
pause_time = PISystemTime();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -146,10 +149,18 @@ bool PIBinaryLog::threadedRead(uchar *readed, int size) {
|
|||||||
double delay;
|
double delay;
|
||||||
switch (play_mode) {
|
switch (play_mode) {
|
||||||
case PlayRealTime:
|
case PlayRealTime:
|
||||||
|
pausemutex.lock();
|
||||||
|
if (is_pause) {
|
||||||
|
piMSleep(100);
|
||||||
|
pausemutex.unlock();
|
||||||
|
return false;
|
||||||
|
} else if (pause_time > PISystemTime()) {
|
||||||
|
startlogtime += pause_time;
|
||||||
|
pause_time = PISystemTime();
|
||||||
|
}
|
||||||
|
pausemutex.unlock();
|
||||||
pt = PISystemTime::current() - startlogtime;
|
pt = PISystemTime::current() - startlogtime;
|
||||||
if (is_started) {
|
if (is_started) {
|
||||||
if ((lastrecord.timestamp - pt).toSeconds() > 100. || (lastrecord.timestamp - pt).toSeconds() < -100.)
|
|
||||||
piCoutObj << PISystemTime::current() << startlogtime << pt << lastrecord.timestamp << (lastrecord.timestamp - pt);
|
|
||||||
if (lastrecord.timestamp > pt)
|
if (lastrecord.timestamp > pt)
|
||||||
(lastrecord.timestamp - pt).sleep();
|
(lastrecord.timestamp - pt).sleep();
|
||||||
} else {
|
} else {
|
||||||
@@ -163,6 +174,10 @@ bool PIBinaryLog::threadedRead(uchar *readed, int size) {
|
|||||||
double cdelay;
|
double cdelay;
|
||||||
int dtc;
|
int dtc;
|
||||||
if (is_started) {
|
if (is_started) {
|
||||||
|
if (is_pause) {
|
||||||
|
piMSleep(100);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (delay > 0) {
|
if (delay > 0) {
|
||||||
cdelay = delay * play_speed;
|
cdelay = delay * play_speed;
|
||||||
dtc = int(cdelay) /100;
|
dtc = int(cdelay) /100;
|
||||||
@@ -182,8 +197,13 @@ bool PIBinaryLog::threadedRead(uchar *readed, int size) {
|
|||||||
play_time = lastrecord.timestamp.toMilliseconds();
|
play_time = lastrecord.timestamp.toMilliseconds();
|
||||||
break;
|
break;
|
||||||
case PlayStaticDelay:
|
case PlayStaticDelay:
|
||||||
if (is_started) play_delay.sleep();
|
if (is_started) {
|
||||||
else is_started = true;
|
if (is_pause) {
|
||||||
|
piMSleep(100);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
play_delay.sleep();
|
||||||
|
} else is_started = true;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
@@ -229,6 +249,15 @@ void PIBinaryLog::createNewFile(const PIString &path) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void PIBinaryLog::setPause(bool pause) {
|
||||||
|
pausemutex.lock();
|
||||||
|
is_pause = pause;
|
||||||
|
if (pause) pause_time = PISystemTime::current();
|
||||||
|
else pause_time = PISystemTime::current() - pause_time;
|
||||||
|
pausemutex.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int PIBinaryLog::writeBinLog(int id, const void *data, int size) {
|
int PIBinaryLog::writeBinLog(int id, const void *data, int size) {
|
||||||
if (size <= 0 || !canWrite()) return -1;
|
if (size <= 0 || !canWrite()) return -1;
|
||||||
if (id == 0) {
|
if (id == 0) {
|
||||||
@@ -247,6 +276,7 @@ int PIBinaryLog::writeBinLog(int id, const void *data, int size) {
|
|||||||
break;
|
break;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
|
if (is_pause) return 0;
|
||||||
PIByteArray logdata;
|
PIByteArray logdata;
|
||||||
logdata << id << size << (PISystemTime::current() - startlogtime) << PIByteArray::RawData(data, size);
|
logdata << id << size << (PISystemTime::current() - startlogtime) << PIByteArray::RawData(data, size);
|
||||||
int res = file.write(logdata.data(), logdata.size());
|
int res = file.write(logdata.data(), logdata.size());
|
||||||
@@ -503,7 +533,21 @@ PIBinaryLog::BinLogInfo PIBinaryLog::getLogInfo(const PIString & path) {
|
|||||||
|
|
||||||
PIString PIBinaryLog::constructFullPath() const {
|
PIString PIBinaryLog::constructFullPath() const {
|
||||||
PIString ret(fullPathPrefix() + "://");
|
PIString ret(fullPathPrefix() + "://");
|
||||||
ret << logDir() << ":" << filePrefix() << ":" << defaultID();
|
ret << logDir() << ":" << filePrefix() << ":" << defaultID() << ":";
|
||||||
|
switch (play_mode) {
|
||||||
|
case PlayRealTime:
|
||||||
|
ret << "RT";
|
||||||
|
break;
|
||||||
|
case PlayVariableSpeed:
|
||||||
|
ret << PIString::fromNumber(playSpeed()) << "X";
|
||||||
|
break;
|
||||||
|
case PlayStaticDelay:
|
||||||
|
ret << PIString::fromNumber(playDelay().toMilliseconds()) << "M";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ret << "RT";
|
||||||
|
break;
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -573,12 +617,18 @@ void PIBinaryLog::configureFromFullPath(const PIString & full_path) {
|
|||||||
case 0: setLogDir(p); break;
|
case 0: setLogDir(p); break;
|
||||||
case 1: setFilePrefix(p); break;
|
case 1: setFilePrefix(p); break;
|
||||||
case 2: setDefaultID(p.toInt()); break;
|
case 2: setDefaultID(p.toInt()); break;
|
||||||
|
case 3:
|
||||||
|
if (p.toUpperCase() == "RT") setPlayRealTime();
|
||||||
|
if (p.toUpperCase().right(1) == "X") setPlaySpeed((p.left(p.size() - 1)).toDouble());
|
||||||
|
if (p.toUpperCase().right(1) == "M") setPlayDelay(PISystemTime::fromMilliseconds((p.left(p.size() - 1)).toDouble()));
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// piCoutObj << "configured";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PIBinaryLog::propertyChanged(const PIString &) {
|
void PIBinaryLog::propertyChanged(const PIString &s) {
|
||||||
default_id = property("defaultID").toInt();
|
default_id = property("defaultID").toInt();
|
||||||
rapid_start = property("rapidStart").toBool();
|
rapid_start = property("rapidStart").toBool();
|
||||||
play_mode = (PlayMode)property("playMode").toInt();
|
play_mode = (PlayMode)property("playMode").toInt();
|
||||||
@@ -589,5 +639,6 @@ void PIBinaryLog::propertyChanged(const PIString &) {
|
|||||||
split_time = property("splitTime").toSystemTime();
|
split_time = property("splitTime").toSystemTime();
|
||||||
split_size = property("splitFileSize").toLLong();
|
split_size = property("splitFileSize").toLLong();
|
||||||
split_count = property("splitRecordCount").toInt();
|
split_count = property("splitRecordCount").toInt();
|
||||||
|
// piCoutObj << "propertyChanged" << s << play_mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -164,6 +164,8 @@ public:
|
|||||||
//! Also this function set \a splitMode to \a SplitCount
|
//! Also this function set \a splitMode to \a SplitCount
|
||||||
void setSplitRecordCount(int count) {setSplitMode(SplitCount); setProperty("splitRecordCount", count);}
|
void setSplitRecordCount(int count) {setSplitMode(SplitCount); setProperty("splitRecordCount", count);}
|
||||||
|
|
||||||
|
//! Set pause while playing via \a threadedRead or writing via write
|
||||||
|
void setPause(bool pause);
|
||||||
|
|
||||||
//! Write one record to BinLog file, with ID = id, id must be greather than 0
|
//! Write one record to BinLog file, with ID = id, id must be greather than 0
|
||||||
int writeBinLog(int id, PIByteArray data) {return writeBinLog(id, data.data(), data.size_s());}
|
int writeBinLog(int id, PIByteArray data) {return writeBinLog(id, data.data(), data.size_s());}
|
||||||
@@ -192,6 +194,9 @@ public:
|
|||||||
|
|
||||||
//! Returns if BinLog file is empty
|
//! Returns if BinLog file is empty
|
||||||
bool isEmpty() const {return (file.size() <= PIBINARYLOG_SIGNATURE_SIZE + 1);}
|
bool isEmpty() const {return (file.size() <= PIBINARYLOG_SIGNATURE_SIZE + 1);}
|
||||||
|
|
||||||
|
//! Returns BinLog pause status
|
||||||
|
bool isPause() const {return is_pause;}
|
||||||
|
|
||||||
//! Returns if BinLog file is empty
|
//! Returns if BinLog file is empty
|
||||||
int lastReadedID() const {return lastrecord.id;}
|
int lastReadedID() const {return lastrecord.id;}
|
||||||
@@ -293,12 +298,12 @@ private:
|
|||||||
SplitMode split_mode;
|
SplitMode split_mode;
|
||||||
PIFile file;
|
PIFile file;
|
||||||
BinLogRecord lastrecord;
|
BinLogRecord lastrecord;
|
||||||
PISystemTime startlogtime, play_delay, split_time;
|
PISystemTime startlogtime, play_delay, split_time, pause_time;
|
||||||
PIMutex logmutex;
|
PIMutex logmutex, pausemutex;
|
||||||
double play_time, play_speed;
|
double play_time, play_speed;
|
||||||
llong split_size;
|
llong split_size;
|
||||||
int write_count, split_count, default_id, current_index;
|
int write_count, split_count, default_id, current_index;
|
||||||
bool is_started, is_thread_ok, is_indexed, rapid_start;
|
bool is_started, is_thread_ok, is_indexed, rapid_start, is_pause;
|
||||||
};
|
};
|
||||||
|
|
||||||
//! \relatesalso PICout \relatesalso PIBinaryLog::BinLogInfo \brief Output operator to PICout
|
//! \relatesalso PICout \relatesalso PIBinaryLog::BinLogInfo \brief Output operator to PICout
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "pipeer.h"
|
#include "pipeer.h"
|
||||||
|
#include "piconfig.h"
|
||||||
|
|
||||||
#define _PIPEER_MSG_SIZE 4000
|
#define _PIPEER_MSG_SIZE 4000
|
||||||
#define _PIPEER_MSG_TTL 100
|
#define _PIPEER_MSG_TTL 100
|
||||||
@@ -26,6 +27,7 @@
|
|||||||
#define _PIPEER_LOOPBACK_PORT_S 13313
|
#define _PIPEER_LOOPBACK_PORT_S 13313
|
||||||
#define _PIPEER_LOOPBACK_PORT_E (13313+32)
|
#define _PIPEER_LOOPBACK_PORT_E (13313+32)
|
||||||
#define _PIPEER_MULTICAST_PORT 13360
|
#define _PIPEER_MULTICAST_PORT 13360
|
||||||
|
#define _PIPEER_TCP_PORT _PIPEER_MULTICAST_PORT
|
||||||
#define _PIPEER_BROADCAST_PORT 13361
|
#define _PIPEER_BROADCAST_PORT 13361
|
||||||
#define _PIPEER_TRAFFIC_PORT_S 13400
|
#define _PIPEER_TRAFFIC_PORT_S 13400
|
||||||
#define _PIPEER_TRAFFIC_PORT_E 14000
|
#define _PIPEER_TRAFFIC_PORT_E 14000
|
||||||
@@ -132,7 +134,7 @@ PIString PIPeer::PeerInfo::fastestAddress() const {
|
|||||||
|
|
||||||
REGISTER_DEVICE(PIPeer)
|
REGISTER_DEVICE(PIPeer)
|
||||||
|
|
||||||
PIPeer::PIPeer(const PIString & n): PIIODevice() {
|
PIPeer::PIPeer(const PIString & n): PIIODevice(), diag_d(false), diag_s(false), eth_tcp_srv(PIEthernet::TCP_Server), eth_tcp_cli(PIEthernet::TCP_Client) {
|
||||||
destroyed = false;
|
destroyed = false;
|
||||||
PIMutexLocker mbl(mc_mutex);
|
PIMutexLocker mbl(mc_mutex);
|
||||||
PIMutexLocker ethl(eth_mutex);
|
PIMutexLocker ethl(eth_mutex);
|
||||||
@@ -171,6 +173,8 @@ PIPeer::~PIPeer() {
|
|||||||
piForeach (PIEthernet * i, eths_bcast)
|
piForeach (PIEthernet * i, eths_bcast)
|
||||||
i->stopThreadedRead();
|
i->stopThreadedRead();
|
||||||
eth_lo.stopThreadedRead();
|
eth_lo.stopThreadedRead();
|
||||||
|
eth_tcp_srv.stopThreadedRead();
|
||||||
|
eth_tcp_cli.stopThreadedRead();
|
||||||
sendSelfRemove();
|
sendSelfRemove();
|
||||||
destroyMBcasts();
|
destroyMBcasts();
|
||||||
eth_send.close();
|
eth_send.close();
|
||||||
@@ -293,6 +297,18 @@ void PIPeer::initMBcasts(PIStringList al) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
eth_tcp_srv.setName("__S__PIPeer_eth_TCP_Server");
|
||||||
|
eth_tcp_srv.init();
|
||||||
|
eth_tcp_srv.listen("0.0.0.0", _PIPEER_TCP_PORT, true);
|
||||||
|
CONNECTU(ð_tcp_srv, newConnection, this, newTcpClient);
|
||||||
|
eth_tcp_srv.startThreadedRead();
|
||||||
|
eth_tcp_cli.setName("__S__PIPeer_eth_TCP_Client");
|
||||||
|
eth_tcp_cli.init();
|
||||||
|
eth_tcp_cli.setDebug(false);
|
||||||
|
tcpClientReconnect();
|
||||||
|
CONNECTU(ð_tcp_cli, threadedReadEvent, this, mbcastRead);
|
||||||
|
CONNECTU(ð_tcp_cli, disconnected, this, tcpClientReconnect);
|
||||||
|
eth_tcp_cli.startThreadedRead();
|
||||||
if (eths_mcast.isEmpty() && eths_bcast.isEmpty() && !eth_lo.isOpened()) piCoutObj << "Warning! Can`t find suitable network interface for multicast receive, check for exists at least one interface with multicasting enabled!";
|
if (eths_mcast.isEmpty() && eths_bcast.isEmpty() && !eth_lo.isOpened()) piCoutObj << "Warning! Can`t find suitable network interface for multicast receive, check for exists at least one interface with multicasting enabled!";
|
||||||
// piCoutObj << "initMBcasts ok";
|
// piCoutObj << "initMBcasts ok";
|
||||||
}
|
}
|
||||||
@@ -332,6 +348,7 @@ void PIPeer::destroyMBcasts() {
|
|||||||
eth_lo.close();
|
eth_lo.close();
|
||||||
eths_mcast.clear();
|
eths_mcast.clear();
|
||||||
eths_bcast.clear();
|
eths_bcast.clear();
|
||||||
|
eth_tcp_srv.stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -690,6 +707,16 @@ void PIPeer::sendMBcast(const PIByteArray & ba) {
|
|||||||
if (eth_lo.send(ba))
|
if (eth_lo.send(ba))
|
||||||
diag_s.sended(ba.size_s());
|
diag_s.sended(ba.size_s());
|
||||||
}
|
}
|
||||||
|
PIVector<PIEthernet * > cl = eth_tcp_srv.clients();
|
||||||
|
piForeach (PIEthernet * e, cl) {
|
||||||
|
if (e->isOpened() && e->isConnected())
|
||||||
|
if (e->send(ba))
|
||||||
|
diag_s.sended(ba.size_s());
|
||||||
|
}
|
||||||
|
if (eth_tcp_cli.isOpened() && eth_tcp_cli.isConnected()) {
|
||||||
|
if (eth_tcp_cli.send(ba))
|
||||||
|
diag_s.sended(ba.size_s());
|
||||||
|
}
|
||||||
// piCout << "send muticast ok";
|
// piCout << "send muticast ok";
|
||||||
send_mc_mutex.unlock();
|
send_mc_mutex.unlock();
|
||||||
}
|
}
|
||||||
@@ -766,7 +793,17 @@ void PIPeer::pingNeighbours() {
|
|||||||
|
|
||||||
|
|
||||||
bool PIPeer::openDevice() {
|
bool PIPeer::openDevice() {
|
||||||
|
PIConfig conf(
|
||||||
|
#ifndef WINDOWS
|
||||||
|
"/etc/pip.conf"
|
||||||
|
#else
|
||||||
|
"pip.conf"
|
||||||
|
#endif
|
||||||
|
, PIIODevice::ReadOnly);
|
||||||
|
server_ip = conf.getValue("peer_server_ip", "");
|
||||||
reinit();
|
reinit();
|
||||||
|
diag_d.reset();
|
||||||
|
diag_s.reset();
|
||||||
PIMutexLocker ml(peers_mutex);
|
PIMutexLocker ml(peers_mutex);
|
||||||
if (trust_peer.isEmpty())
|
if (trust_peer.isEmpty())
|
||||||
return !peers.isEmpty();
|
return !peers.isEmpty();
|
||||||
@@ -900,6 +937,14 @@ int PIPeer::write(const void *data, int size) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void PIPeer::newTcpClient(PIEthernet *client) {
|
||||||
|
client->setName("__S__PIPeer_eth_TCP_ServerClient" + client->path());
|
||||||
|
piCoutObj << "client" << client->path();
|
||||||
|
CONNECTU(client, threadedReadEvent, this, mbcastRead);
|
||||||
|
client->startThreadedRead();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void PIPeer::configureFromFullPath(const PIString & full_path) {
|
void PIPeer::configureFromFullPath(const PIString & full_path) {
|
||||||
PIStringList pl = full_path.split(":");
|
PIStringList pl = full_path.split(":");
|
||||||
for (int i = 0; i < pl.size_s(); ++i) {
|
for (int i = 0; i < pl.size_s(); ++i) {
|
||||||
@@ -925,6 +970,8 @@ void PIPeer::initNetwork() {
|
|||||||
// piCoutObj << sl << self_info.addresses.size();
|
// piCoutObj << sl << self_info.addresses.size();
|
||||||
sl.removeAll("127.0.0.1");
|
sl.removeAll("127.0.0.1");
|
||||||
initMBcasts(sl);
|
initMBcasts(sl);
|
||||||
|
diag_d.start();
|
||||||
|
diag_s.start();
|
||||||
// piCoutObj << "initNetwork done";
|
// piCoutObj << "initNetwork done";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -977,3 +1024,8 @@ void PIPeer::buildMap() {
|
|||||||
//piCout << "map" << c.name << "=" << cpath;
|
//piCout << "map" << c.name << "=" << cpath;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void PIPeer::tcpClientReconnect() {
|
||||||
|
eth_tcp_cli.connect(server_ip, _PIPEER_TCP_PORT);
|
||||||
|
}
|
||||||
|
|||||||
@@ -134,6 +134,7 @@ public:
|
|||||||
void changeName(const PIString & new_name);
|
void changeName(const PIString & new_name);
|
||||||
const PIString & trustPeerName() const {return trust_peer;}
|
const PIString & trustPeerName() const {return trust_peer;}
|
||||||
void setTrustPeerName(const PIString & peer_name) {trust_peer = peer_name;}
|
void setTrustPeerName(const PIString & peer_name) {trust_peer = peer_name;}
|
||||||
|
void setTcpServerIP(const PIString & ip) {server_ip = ip; tcpClientReconnect();}
|
||||||
PIString constructFullPath() const;
|
PIString constructFullPath() const;
|
||||||
int read(void * read_to, int max_size);
|
int read(void * read_to, int max_size);
|
||||||
int write(const void * data, int size);
|
int write(const void * data, int size);
|
||||||
@@ -155,6 +156,8 @@ private:
|
|||||||
EVENT_HANDLER2(void, timerEvent, void * , data, int, delim);
|
EVENT_HANDLER2(void, timerEvent, void * , data, int, delim);
|
||||||
EVENT_HANDLER2(bool, sendInternal, const PIString &, to, const PIByteArray &, data);
|
EVENT_HANDLER2(bool, sendInternal, const PIString &, to, const PIByteArray &, data);
|
||||||
EVENT_HANDLER2(void, dtReceived, const PIString &, from, const PIByteArray &, data);
|
EVENT_HANDLER2(void, dtReceived, const PIString &, from, const PIByteArray &, data);
|
||||||
|
EVENT_HANDLER1(void, newTcpClient, PIEthernet * , client);
|
||||||
|
EVENT_HANDLER(void, tcpClientReconnect);
|
||||||
|
|
||||||
bool hasPeer(const PIString & name) {piForeachC (PeerInfo & i, peers) if (i.name == name) return true; return false;}
|
bool hasPeer(const PIString & name) {piForeachC (PeerInfo & i, peers) if (i.name == name) return true; return false;}
|
||||||
bool removePeer(const PIString & name);
|
bool removePeer(const PIString & name);
|
||||||
@@ -198,7 +201,7 @@ protected:
|
|||||||
private:
|
private:
|
||||||
PIVector<PIEthernet * > eths_traffic, eths_mcast, eths_bcast;
|
PIVector<PIEthernet * > eths_traffic, eths_mcast, eths_bcast;
|
||||||
PIEthernet::InterfaceList prev_ifaces;
|
PIEthernet::InterfaceList prev_ifaces;
|
||||||
PIEthernet eth_send, eth_lo;
|
PIEthernet eth_send, eth_lo, eth_tcp_srv, eth_tcp_cli;
|
||||||
PITimer sync_timer;
|
PITimer sync_timer;
|
||||||
PeerInfo self_info;
|
PeerInfo self_info;
|
||||||
PIVector<PeerInfo> peers;
|
PIVector<PeerInfo> peers;
|
||||||
@@ -208,6 +211,7 @@ private:
|
|||||||
PIDiagnostics diag_s, diag_d;
|
PIDiagnostics diag_s, diag_d;
|
||||||
bool destroyed, no_timer;
|
bool destroyed, no_timer;
|
||||||
PIString trust_peer;
|
PIString trust_peer;
|
||||||
|
PIString server_ip;
|
||||||
PIMutex read_buffer_mutex;
|
PIMutex read_buffer_mutex;
|
||||||
PIQueue<PIByteArray> read_buffer;
|
PIQueue<PIByteArray> read_buffer;
|
||||||
int read_buffer_size;
|
int read_buffer_size;
|
||||||
|
|||||||
@@ -275,13 +275,14 @@ void usage() {
|
|||||||
piCout << PICoutManipulators::Bold << "PIP System Daemon";
|
piCout << PICoutManipulators::Bold << "PIP System Daemon";
|
||||||
piCout << PICoutManipulators::Cyan << "Version" << PICoutManipulators::Bold << PIPVersion() << PICoutManipulators::NewLine;
|
piCout << PICoutManipulators::Cyan << "Version" << PICoutManipulators::Bold << PIPVersion() << PICoutManipulators::NewLine;
|
||||||
piCout << PICoutManipulators::Green << PICoutManipulators::Bold << "Usage:" << PICoutManipulators::Default
|
piCout << PICoutManipulators::Green << PICoutManipulators::Bold << "Usage:" << PICoutManipulators::Default
|
||||||
<< "\"pisd [-hdfk] [-n <name>]\"" << PICoutManipulators::NewLine;
|
<< "\"pisd [-hdfk] [-n <name>] [-a <ip>]\"" << PICoutManipulators::NewLine;
|
||||||
piCout << PICoutManipulators::Green << PICoutManipulators::Bold << "Details:";
|
piCout << PICoutManipulators::Green << PICoutManipulators::Bold << "Details:";
|
||||||
piCout << "-h --help " << PICoutManipulators::Green << "- display this message and exit";
|
piCout << "-h --help " << PICoutManipulators::Green << "- display this message and exit";
|
||||||
piCout << "-d --daemon " << PICoutManipulators::Green << "- start as daemon";
|
piCout << "-d --daemon " << PICoutManipulators::Green << "- start as daemon";
|
||||||
piCout << "-k --kill " << PICoutManipulators::Green << "- kill daemon";
|
piCout << "-k --kill " << PICoutManipulators::Green << "- kill daemon";
|
||||||
piCout << "-f --force " << PICoutManipulators::Green << "- don`t check for another running instance";
|
piCout << "-f --force " << PICoutManipulators::Green << "- don`t check for another running instance";
|
||||||
piCout << "-n --name <name> " << PICoutManipulators::Green << "- set daemon name";
|
piCout << "-n --name <name> " << PICoutManipulators::Green << "- set daemon name";
|
||||||
|
piCout << "-a --address <ip>" << PICoutManipulators::Green << "- connect to remote daemon via tcp";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -294,11 +295,13 @@ int main(int argc, char * argv[]) {
|
|||||||
cli.addArgument("kill");
|
cli.addArgument("kill");
|
||||||
cli.addArgument("1");
|
cli.addArgument("1");
|
||||||
cli.addArgument("name", true);
|
cli.addArgument("name", true);
|
||||||
|
cli.addArgument("address", true);
|
||||||
if (cli.hasArgument("help")) {
|
if (cli.hasArgument("help")) {
|
||||||
usage();
|
usage();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
PIString name = cli.argumentValue("name");
|
PIString name = cli.argumentValue("name");
|
||||||
|
PIString sip = cli.argumentValue("address");
|
||||||
PISingleApplication * sapp = 0;
|
PISingleApplication * sapp = 0;
|
||||||
if ((cli.hasArgument("1") && !cli.hasArgument("force")) || cli.hasArgument("kill")) {
|
if ((cli.hasArgument("1") && !cli.hasArgument("force")) || cli.hasArgument("kill")) {
|
||||||
sapp = new PISingleApplication("pisd");
|
sapp = new PISingleApplication("pisd");
|
||||||
@@ -318,6 +321,8 @@ int main(int argc, char * argv[]) {
|
|||||||
args << "-1";
|
args << "-1";
|
||||||
if (cli.hasArgument("force"))
|
if (cli.hasArgument("force"))
|
||||||
args << "-f";
|
args << "-f";
|
||||||
|
if (cli.hasArgument("address"))
|
||||||
|
args << "-a" << sip;
|
||||||
if (!name.isEmpty())
|
if (!name.isEmpty())
|
||||||
args << "-n" << name;
|
args << "-n" << name;
|
||||||
PIProcess::execIndependent(PISystemInfo::instance()->execCommand, args);
|
PIProcess::execIndependent(PISystemInfo::instance()->execCommand, args);
|
||||||
@@ -327,6 +332,7 @@ int main(int argc, char * argv[]) {
|
|||||||
//cli.addArgument("");
|
//cli.addArgument("");
|
||||||
screen = new PIScreen(false);
|
screen = new PIScreen(false);
|
||||||
Daemon * daemon = new Daemon();
|
Daemon * daemon = new Daemon();
|
||||||
|
if (!sip.isEmpty()) daemon->setTcpServerIP(sip);
|
||||||
sys_mon.startOnSelf();
|
sys_mon.startOnSelf();
|
||||||
screen->enableExitCapture(PIKbdListener::F10);
|
screen->enableExitCapture(PIKbdListener::F10);
|
||||||
if (!name.isEmpty())
|
if (!name.isEmpty())
|
||||||
|
|||||||
Reference in New Issue
Block a user