279 lines
9.0 KiB
C++
279 lines
9.0 KiB
C++
#include "piobject.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[]) {
|
|
PIVector<float> in;
|
|
for (int i = 0; i < 50; ++i)
|
|
in << i%10;
|
|
PIFFTWf fft;
|
|
fft.preparePlan(50, PIFFTWf::foReal);
|
|
PIVector<complexf> 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<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;*/
|
|
|
|
/*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<int> d;
|
|
d.resize(atoi(argv[1]));
|
|
while (1) {
|
|
d.push_back(1);
|
|
d.pop_front();
|
|
piCout << d.size() << d.capacity() << d._start();
|
|
}*/
|
|
//PIVector<PIIODevice> 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();
|
|
}
|
|
*/
|