#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 "pifft.h" int asize(ssize_t s, size_t pid_rsize) { if (s <= 0) return 0; if (pid_rsize + pid_rsize >= size_t(s) && pid_rsize < size_t(s)) return pid_rsize + pid_rsize; ssize_t t = 0, s_ = ssize_t(s) - 1; while (s_ >> t) ++t; return (1 << t); } int main(int argc, char *argv[]) { PIFFTWf fft; PIVector in; for (int i = 0; i < 50; ++i) in << i%10; 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(); } */