-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathSpectrumFeeder.cpp
84 lines (75 loc) · 2.25 KB
/
SpectrumFeeder.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include "SpectrumFeeder.h"
#include "SessionEvent.h"
using namespace std;
SpectrumFeeder::SpectrumFeeder(wxEvtHandler *handler, int id):
sweep_points(0),
values(nullptr),
evtHandler_(handler),
id_(id)
{}
void SpectrumFeeder::data_feed_callback(shared_ptr<sigrok::Device> device, shared_ptr<sigrok::Packet> packet)
{
if(packet->type()->id() == SR_DF_FRAME_BEGIN)
{
sweep_points = 0;
}
else if(packet->type()->id() == SR_DF_ANALOG)
{
shared_ptr<sigrok::Analog> analogPayload = std::dynamic_pointer_cast<sigrok::Analog>(packet->payload());
const sigrok::Quantity *mq;
try {mq = analogPayload->mq();}
catch (...) {mq = sigrok::Quantity::POWER;}
const sigrok::Unit *unit;
try {unit = analogPayload->unit();}
catch (...) {unit = sigrok::Unit::DECIBEL_MW;}
if (mq == sigrok::Quantity::POWER)
{
if (unit != sigrok::Unit::DECIBEL_MW)
return;
if (sweep_points)
clear_trace();
sweep_points = analogPayload->num_samples();
values = new double[sweep_points];
if (!values)
sweep_points = 0;
else
memcpy(values, analogPayload->data_pointer(), sweep_points * sizeof(double));
}
}
else if(packet->type()->id() == SR_DF_FRAME_END)
{
if (sweep_points == 0)
{
clear_trace();
return;
}
double **pdata = new double*[1];
size_t *pSweepPoints = new size_t[1];
if (pdata && pSweepPoints)
{
pdata[0] = values;
pSweepPoints[0] = sweep_points;
SessionEvent *evt = new SessionEvent(wxEVT_SESSION_UPDATE, id_);
evt->SetData(pdata, pSweepPoints, 1);
wxQueueEvent(evtHandler_, evt);
}
else
{
delete [] pdata;
delete [] pSweepPoints;
}
sweep_points = 0;
values = nullptr;
}
else if(packet->type()->id() == SR_DF_END)
{
wxQueueEvent(evtHandler_, new SessionEvent(wxEVT_SESSION_ENDED, id_));
}
}
void SpectrumFeeder::clear_trace()
{
if (values)
delete[] values;
values = nullptr;
sweep_points = 0;
}