Files
pip/main.cpp

207 lines
6.0 KiB
C++

#include "pip.h"
struct __S__ {
PIString text;
int i;
};
inline PIByteArray & operator <<(PIByteArray & s, const __S__ & v) {s << v.text << v.i; return s;}
inline PIByteArray & operator >>(PIByteArray & s, __S__ & v) {s >> v.text >> v.i; return s;}
REGISTER_VARIANT(__S__)
REGISTER_VARIANT_CAST(__S__, PIString) {return v.text + PIString::fromNumber(v.i);}
REGISTER_VARIANT_CAST(__S__, int) {return v.i;}
int main(int argc, char *argv[]) {
/*__S__ s, s1;
s.text = "123";
s.i = -1;
PIVariant v = PIVariant::fromValue(s);
PIByteArray ba;
ba << v;
PIVariant v1;
ba >> v1;
piCout << v1;*/
PISet<int> s0;
s0 << 1 << 3 << 5;
PIVector<int> v;
v << -1 << 8 << 0 << 2 << 1 << 6 << 4 << 3;
piCout << s0;
PISet<int> s1(v);
piCout << s1;
s1.subtract(s0);
piCout << s1;
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();
}
*/