#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;} */ /*const char app_config[] = "include = cd_ip.conf\n\ port_rec = 2\n\ port_send = 1\n\ [connection]\n\ device.cd = peer://cd_app:cd_pult #s\n\ []\n\ connectionmodel = AAAM2Xja7VXLTttAFD12QpsikKjUSixYlLbKEpIUtVIlVEfqhk2FWuiGRRolUYtoHgrmpYiv6IItf8AveMMH9E/YsG6Ph3sde5hGoQoblLGuPHfunTPjc49nADxDA110+LTYC7FrPCAPeAO+vZu+aX7c/8PGd45WCJC0OGcfT6FDnmfSTPtwhZFt3HjgDs/Qtu5jPbZHtI/x50XfIzMQbdwEolbg9INP4ku++myPaUtCHYRaT2j1ldIh3VP60/Qff8vSfXLu9BP6JX9K/0TVH6jqVe22P1X/fao/oddWu/paDs1vBf9Jv/EZ91clbyHqv7BL6sscDOd4v4WTqs6jzaHGJ8QJerxlpJSpdZ7IWFJvDW7I2JxZqIM62k6A57RZmMQGmlyrxdV+WGBnmR01mXPI267hBKwp4FeBeo9VPtssxyb7rzHg1B7T9nCMU45U8BZlWuVWtIcD/CRGOqtsbW09851tXsHN0UTlLIAdASjSXnLyLn+H7L2+xbGYvC63Ezqg543egkLmn8qnRF6USbM4Qp9godkhzI777Ne5bCIt/5UtGz2o/yGby0nKpjqmbOa1ynkjmyzIrzvIZUeBPjvlUmbh32EFJbGyJZhR8YcvlS+3TpjhqeWSyvUkpbI9plSWtcKLcsK05beOJVEnhaEFfHEH+RwpeMcpn1JKGqWMNOL+G6wZyahlpdVOtufKfbDS+guLke9O\n\ "; const char pult_config[] = "include = cd_ip.conf\n\ port_rec = 1\n\ port_send = 2\n\ [connection]\n\ device.cd = peer://cd_pult:cd_app #s\n\ []\n\ connectionmodel = AAAM2Xja7VXLTttAFD12QpsikKjUSixYlLbKEpIUtVIlVEfqhk2FWuiGRRolUYtoHgrmpYiv6IItf8AveMMH9E/YsG6Ph3sde5hGoQoblLGuPHfunTPjc49nADxDA110+LTYC7FrPCAPeAO+vZu+aX7c/8PGd45WCJC0OGcfT6FDnmfSTPtwhZFt3HjgDs/Qtu5jPbZHtI/x50XfIzMQbdwEolbg9INP4ku++myPaUtCHYRaT2j1ldIh3VP60/Qff8vSfXLu9BP6JX9K/0TVH6jqVe22P1X/fao/oddWu/paDs1vBf9Jv/EZ91clbyHqv7BL6sscDOd4v4WTqs6jzaHGJ8QJerxlpJSpdZ7IWFJvDW7I2JxZqIM62k6A57RZmMQGmlyrxdV+WGBnmR01mXPI267hBKwp4FeBeo9VPtssxyb7rzHg1B7T9nCMU45U8BZlWuVWtIcD/CRGOqtsbW09851tXsHN0UTlLIAdASjSXnLyLn+H7L2+xbGYvC63Ezqg543egkLmn8qnRF6USbM4Qp9godkhzI777Ne5bCIt/5UtGz2o/yGby0nKpjqmbOa1ynkjmyzIrzvIZUeBPjvlUmbh32EFJbGyJZhR8YcvlS+3TpjhqeWSyvUkpbI9plSWtcKLcsK05beOJVEnhaEFfHEH+RwpeMcpn1JKGqWMNOL+G6wZyahlpdVOtufKfbDS+guLke9O\n\ "; */ #include template struct Info { enum {Defined = 0}; }; template struct TypeInfo { typedef T PureType; typedef const T ConstPureType; typedef T * PointerType; typedef const T * ConstPointerType; typedef T & ReferenceType; typedef const T & ConstReferenceType; }; #define TYPEINFO_SINGLE(PT, T) \ template<> struct TypeInfo { \ typedef PT PureType; \ typedef const PT ConstPureType; \ typedef PT * PointerType; \ typedef const PT * ConstPointerType; \ typedef PT & ReferenceType; \ typedef const PT & ConstReferenceType; \ }; #define TYPEINFO(T) \ TYPEINFO_SINGLE(T, T &) \ TYPEINFO_SINGLE(T, const T) \ TYPEINFO_SINGLE(T, const T &) \ TYPEINFO_SINGLE(T, T *) \ TYPEINFO_SINGLE(T, const T *) TYPEINFO(PIString) template class A { public: void f() { piCout << "T"; } }; template class A { public: void f() { piCout << "const T&"; } }; #include "pivector2d.h" int main(int argc, char *argv[]) { /* enum VCO_Aim_Type {VCO_Aim_Type_None, VCO_Aim_Type_Detected, VCO_Aim_Type_New, VCO_Aim_Type_Confirmed, VCO_Aim_Type_Deleted = 127}; #pragma pack (push, 1) struct VCO_Element { VCO_Element() {} VCO_Aim_Type type; double elapsed; float wls_a; // m/s float wls_b; // m float speed; float acceleration; // m/s^2 float prediction_pos; // m float variance; // m float power; float angle; int id; int missed; int missed_ml; int confirmed; int history_size; bool tracing; bool _found; bool _checked; bool _delete; PIVector > history; }; #pragma pack (pop) struct VCO_ElementX { VCO_Aim_Type type; double elapsed; float wls_a; // m/s float wls_b; // m float speed; float acceleration; // m/s^2 float prediction_pos; // m float variance; // m float power; float angle; int id; int missed; int missed_ml; int confirmed; int history_size; bool tracing; bool _found; bool _checked; bool _delete; }; struct VCO_ElementY : VCO_ElementX { PIVector > history; }; VCO_Element v; VCO_ElementX x; VCO_ElementY y; piCout << sizeof(x); piCout << sizeof(y) << sizeof(y.history) << sizeof(y) - sizeof(y.history) ; piCout << sizeof(v) << sizeof(v.history) << sizeof(v) - sizeof(v.history) ; return 0;*/ PIVector > in; in.resize(5); for (int i = 0; i < in.size_s(); ++i) for (int j = 0; j < 20; ++j) in[i] << j+i*100; // piCout << in.size() << in[0].size(); PIVector2D f0; PIVector2D f1(30, 40); //in.resize(1); PIVector2D f2(in); f0 = f2; // piCout << f0; // piCout << f1; // piCout << f2; // piCout << f2.rows() << f2.cols() << f2.size_all() << f2.rows()*f2.cols(); piCout << in; piCout << f2; piCout << f2.toVectors(); PIVector t = f2.toPlainVector(); piCout << t; piCout << PIVector2D(f2.rows(), f2.cols(), t); return 0; // PIFFTWf fft; // fft.preparePlan(50, PIFFTWf::foReal); // PIVector out = fft.calcFFT(in); // piCout << out; /*for (int i = 0; i < 16; ++i) { piCout << asize(i, 100); } return 0;*/ /*__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 s0; s0 << 1 << 3 << 5; PIVector v; v << -1 << 8 << 0 << 2 << 1 << 6 << 4 << 3; piCout << s0; PISet s1(v); piCout << s1; s1.subtract(s0); piCout << s1;*/ /*PIConnection c; PIString s(app_config); c.configureFromString(&s); c.start(); piMSleep(3000); s = pult_config; c.stop(); c.removeAllDevices(); c.configureFromString(&s); c.start(); piMSleep(3000);*/ /*PIScreen s; s.enableExitCapture(PIKbdListener::F10); s.start(); TileList * list = new TileList(); for (int i = 0; i < 100; ++i) list->content << TileList::Row(i, PIScreenTypes::CellFormat()); s.rootTile()->addTile(list); s.waitForFinish();*/ /*PIDeque d; d.resize(atoi(argv[1])); while (1) { d.push_back(1); d.pop_front(); piCout << d.size() << d.capacity() << d._start(); }*/ //PIVector o; //o[0] = o[1]; 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(); } */