OpenCores
URL https://opencores.org/ocsvn/modular_oscilloscope/modular_oscilloscope/trunk

Subversion Repositories modular_oscilloscope

[/] [modular_oscilloscope/] [trunk/] [sw/] [src/] [rvicommthread.cpp] - Blame information for rev 60

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 60 budinero
#include <QtGui/QDialog>
2
#include <QThread>
3
#include <QString>
4
#include <QTimer>
5
#include <cmath>
6
//#include <QBasicTimer>
7
#include "rvicommthread.h"
8
 
9
RVICommThread::RVICommThread(QObject *parent): QThread(parent = 0)
10
{
11
    portAddress = 0;
12
    continuous = 0;
13
    triggerOn = 0;
14
    triggerSlope = 0;
15
    triggerChannel = 0;
16
    timeScaleEnabled = 0;
17
    timeScaleValue = 0;
18
    channelAEnabled = 0;
19
    channelBEnabled = 0;
20
    bufferSize = 0;
21
    triggerLevel = 0;
22
    triggerOffset = 0;
23
 
24
    aDCSampleRate = BASE_SAMPLE_RATE;
25
 
26
}
27
 
28
 
29
RVICommThread::~RVICommThread()
30
{
31
    port.closeEPP();
32
}
33
 
34
 
35
void RVICommThread::run()
36
{
37
    ////////////////////////////////////////////////////////////////////////////////////////////////
38
    // Init
39
    acqStopped = false;
40
    bufferFull = false;
41
 
42
    unsigned short int confArray[5];
43
 
44
    if (bufferSize < triggerOffset || -bufferSize > triggerOffset )
45
    {
46
        if (triggerOffset < 0)
47
            triggerOffset = -bufferSize;
48
        else
49
            triggerOffset = bufferSize;
50
 
51
        emit statusMessage(tr("Too big trigger offset, truncating to: %1").arg(triggerOffset));
52
    }
53
    if ( (channelAEnabled == false) && (channelBEnabled == false) )
54
    {
55
        emit statusMessage(tr("All channels disabled."));
56
        return;
57
    }
58
    timer = new QTimer;
59
    timer->setSingleShot(true);
60
    connect(timer, SIGNAL(timeout()), SLOT(endWaiting()));
61
    ////////////////////////////////////////////////////////////////////////////////////////////////
62
    //  Writing config
63
    confArray[0] = 1;                                     // Run
64
    confArray[0] = continuous        << 1 | confArray[0]; // Cont
65
    confArray[0] = triggerOn         << 2 | confArray[0]; // TrOn
66
    confArray[0] = triggerSlope      << 3 | confArray[0]; // TrEdg
67
    confArray[0] = triggerChannel    << 4 | confArray[0]; // TrCh
68
    confArray[0] = timeScaleEnabled  << 5 | confArray[0]; // TScalEn
69
    confArray[0] = timeScaleValue    << 6 | confArray[0]; // TScal00..04
70
 
71
    confArray[1] = channelAEnabled;                       // RCh00
72
    confArray[1] = channelBEnabled   << 1 | confArray[1]; // RCh01
73
 
74
    confArray[2] = bufferSize;                            // BuffS00..13
75
 
76
    confArray[3] = triggerLevel;                          // TrLvl00..09
77
 
78
    confArray[4] = triggerOffset;                         // TrOff00..14
79
 
80
    /*
81
      ADR  NAME        MODE    [     15|     14|     13|     12|     11|     10|      9|      8|
82
                                      7|      6|      5|      4|      3|      2|      1|      0]    bits
83
 
84
       00   RunConf_R   RW     [       |       |       |       |       |TScal04|TScal03|TScal02|
85
    --                          TScal01|TScal00|TScalEn|   TrCh|  TrEdg|   TrOn|   Cont|  Start]
86
    --
87
    -- 01   Channels_R  RW     [       |       |       |       |       |       |       |       |
88
    --                                 |       |       |       |       |       |  RCh01|  RCh00]
89
    --
90
    -- 02   BuffSize_R  RW     [       |       |BuffS13|BuffS12|BuffS11|BuffS10|BuffS09|BuffS08|
91
    --                          BuffS07|BuffS06|BuffS05|BuffS04|BuffS03|BuffS02|BuffS01|BuffS00]
92
    --
93
    -- 03   TrigLvl_R   RW     [       |       |       |       |       |       |TrLvl09|TrLvl08|
94
    --                          TrLvl07|TrLvl06|TrLvl05|TrLvl04|TrLvl03|TrLvl02|TrLvl01|TrLvl00]
95
    --
96
    -- 04   TrigOff_R   RW     [       |TrOff14|TrOff13|TrOff12|TrOff11|TrOff10|TrOff09|TrOff08|
97
    --                          TrOff07|TrOff06|TrOff00|TrOff00|TrOff00|TrOff00|TrOff00|TrOff00]
98
    --
99
    -- 05   ADCConf     RW     [       |       |       |       |   ADCS|ADSleep| ADPSEn| ADPS08|
100
    --                           ADPS07| ADPS06| ADPS05| ADPS04| ADPS03| ADPS02| ADPS01| ADPS00]
101
    --
102
    -- 08   Data_O      R      [ErrFlag|RunFlag|       |       |       |  DCh00|  Dat09|  Dat08|
103
    --                            Dat07|  Dat06|  Dat05|  Dat04|  Dat03|  Dat02|  Dat01|  Dat00]
104
    --
105
    -- 09   Error_O     R      [       |       |       |       |       |       |       |       |
106
    --                                 |       |       |       |       | ErrN02| ErrN01| ErrN00]
107
    */
108
 
109
 
110
    EppParallelUseWin::PPStatusType status;
111
 
112
    status = port.negotiateEPP(portAddress);
113
    emit statusMessage(translateStatus(status));
114
 
115
    if (status != EppParallelUseWin::PP_CONECTED)
116
        return;
117
 
118
    status = port.testDataTransfer();
119
    for (int i = 4; i >= 0; i--)
120
    {
121
        port.writeWord(confArray[i], i);
122
        status = port.testDataTransfer();
123
 
124
        if (status != EppParallelUseWin::PP_CONECTED)
125
        {
126
            for (int j = 0; (j <= 5) && (status != EppParallelUseWin::PP_CONECTED); j++)
127
            {
128
                port.writeWord(confArray[i], i);
129
                status = port.testDataTransfer();
130
            }
131
            if (status != EppParallelUseWin::PP_CONECTED)
132
            {
133
                emit statusMessage(translateStatus(status));
134
                return;
135
            }
136
        }
137
 
138
    }
139
 
140
    ////////////////////////////////////////////////////////////////////////////////////////////////
141
    //  Write and check stream address
142
    char address = 8;  // input data address
143
    port.testDataTransfer();
144
    port.writeAddress(address);
145
    port.readAddress(address);
146
    if (address != 8)
147
    {
148
        emit statusMessage(tr("Can't write an address"));
149
        return;
150
    }
151
 
152
    ////////////////////////////////////////////////////////////////////////////////////////////////
153
    // Getting data
154
    int count = 0;
155
    bool oddBuffer = false;
156
    unsigned int data = 0x80; // stopped with errors
157
 
158
 
159
    dataUsed = false;
160
    port.testDataTransfer(); // clear time out flags
161
    channelData[0].clear();
162
    channelData[1].clear();
163
 
164
 
165
    if (triggerOn)
166
        emit statusMessage(tr("Waiting for trigger..."));
167
    else
168
        emit statusMessage(tr("Running"));
169
 
170
    do {
171
        port.readWord(data);
172
        status =  port.testDataTransfer();
173
 
174
        if ((status == EppParallelUseWin::PP_CONECTED) && (data != 0xFFFF))
175
        {
176
            // check running flag
177
            if ((data & 0x4000) == 0x0000 )
178
            {
179
                port.readWord(data ,0);
180
                port.readWord(data,8);
181
                if ((data & 0x4000) == 0x0000 )
182
                {
183
                    if (continuous)
184
                    {
185
                        emit statusMessage(tr("Error in data"));
186
                    }
187
                    else
188
                    {
189
                        checkDataSize();
190
                    }
191
                    bufferFull = true;
192
                    while (dataUsed == false && acqStopped == false) ;
193
                 //   emit endOfBuffer();
194
                    return;
195
                }
196
            }
197
            // if buffer is full
198
 
199
            else if ( ((data & 0x8000) == 0x0000) != oddBuffer)
200
            {
201
             //   emit endOfBuffer();
202
                dataUsed = false;
203
                bufferFull = true;
204
                checkDataSize();
205
                while (dataUsed == false && acqStopped == false) ;
206
                channelData[0].clear();
207
                channelData[1].clear();
208
            }
209
 
210
            // channel A
211
            else if ( (data & 0x0400) == 0x0400 )
212
            {
213
             //   emit chBNewData(0x3FF & data);
214
                channelData[0] << (0x3FF & data);
215
             //   oddBuffer = (data & 0x8000) == 0x0000 ;
216
            }
217
            // channel B
218
            else
219
            {
220
            //    emit chANewData(0x3FF & data);
221
                channelData[1] << (0x3FF & data);
222
 
223
            }
224
            oddBuffer = (data & 0x8000) == 0x0000 ;
225
            count = 0;
226
        }
227
        else
228
        {
229
            count++;
230
            if (count >= 500000)
231
            {
232
                if (triggerOn)
233
                {
234
                    statusMessage(tr("Still waiting for trigger..."));
235
                    count = 0;
236
                }
237
                else
238
                {
239
               //     emit endOfBuffer();
240
                    emit statusMessage(tr("Too much time out. Check the cable."));
241
                    return;
242
                }
243
            }
244
        }
245
    } while (acqStopped == false);
246
 
247
}
248
 
249
 
250
QList<int> RVICommThread::getChannelData(int channel)
251
{
252
    if (channel > 1 || channel < 0)
253
        channel = 0;
254
    dataUsed = true;
255
    bufferFull = false;
256
    return channelData[channel];
257
}
258
 
259
bool RVICommThread::isBufferFull()
260
{
261
    return bufferFull;
262
}
263
 
264
 
265
 
266
void RVICommThread::checkDataSize()
267
{
268
    if (channelAEnabled && channelBEnabled)
269
    {
270
        if ( (bufferSize != (channelData[0].size()-1)*2) && \
271
             (bufferSize != (channelData[1].size()-1)*2) )
272
            emit statusMessage(tr("Data size and buffer size not match"));
273
        else
274
            emit statusMessage(tr(""));
275
    }
276
    else if (channelAEnabled)
277
    {
278
        if (bufferSize != channelData[0].size())
279
            emit statusMessage(tr("Data size and buffer size not match"));
280
        else
281
            emit statusMessage(tr(""));
282
    }
283
    else
284
    {
285
        if (bufferSize != channelData[1].size())
286
            emit statusMessage(tr("Data size and buffer size not match"));
287
        else
288
            emit statusMessage(tr(""));
289
    }
290
}
291
 
292
 
293
QString RVICommThread::translateStatus(const EppParallelUseWin::PPStatusType &port_status)
294
{
295
  switch(port_status)
296
  {
297
    case EppParallelUseWin::PP_CONECTED:
298
        return QString( tr("Conected"));
299
        break;
300
    case EppParallelUseWin::PP_TIME_OUT:
301
        return QString( tr("Time Out"));
302
        break;
303
    case EppParallelUseWin::PP_COMUNICATION_FAIL:
304
        return QString( tr("Comunication fail at 0x%1").arg(portAddress, 0, 16));
305
        break;
306
    case EppParallelUseWin::PP_NEGOTIATION_FAIL:
307
        return QString( tr("Negotiation fail at 0x%1").arg(portAddress, 0, 16));
308
        break;
309
    case EppParallelUseWin::PP_LOAD_LIBRARY_FAIL:
310
       return QString( tr("Canīt load the library"));
311
        break;
312
    case EppParallelUseWin::PP_WRONG_BASE_ADDRESS:
313
        return QString( tr("Wrong port base address: 0x%1").arg(portAddress, 0, 16));
314
        break;
315
    default:
316
        return QString( tr("OK"));
317
        break;
318
  }
319
}
320
 
321
void RVICommThread::endWaiting()
322
{
323
    waiting = false;
324
}
325
 
326
 
327
////////////////////////////////////////////////////////////////////////////////////////////////////
328
// Parameters
329
void RVICommThread::setAddress(const short int &address)
330
{
331
    portAddress = address;
332
}
333
 
334
 
335
void RVICommThread::setContinuous(const bool &on)
336
{
337
    continuous = on;
338
}
339
 
340
 
341
void RVICommThread::setTrigger(const bool &on, const bool &slope, const bool &channel, const int &level, const int &offset)
342
{
343
    triggerOn = on;
344
    triggerSlope = slope;
345
    triggerChannel = channel;
346
    triggerLevel = level;
347
    triggerOffset = offset;
348
}
349
 
350
 
351
void RVICommThread::setChannels(const bool &chAOn, const bool &chBOn)
352
{
353
    channelAEnabled = chAOn;
354
    channelBEnabled = chBOn;
355
}
356
 
357
 
358
void RVICommThread::setBuffer(const int &size)
359
{
360
    bufferSize = size;
361
}
362
 
363
 
364
void RVICommThread::setTimeScaler(const bool &on, const int &value)
365
{
366
    timeScaleEnabled = on;
367
    timeScaleValue = value;
368
}
369
 
370
 
371
void RVICommThread::setADCPreScale(const int &preScale)
372
{
373
    adcPreScaler = preScale;
374
}
375
 
376
 
377
void RVICommThread::stopAcquistion()
378
{
379
    acqStopped = true;
380
}
381
 
382
 
383
void RVICommThread::configADC()
384
{
385
    if (adcPreScaler > pow(2.0, 8) )
386
    {
387
        emit statusMessage("Too big pre scaler, setting to default value (1).");
388
        adcPreScaler = 1;
389
    }
390
    else
391
    {
392
        emit statusMessage(tr("ADC Config Writed."));
393
    }
394
 
395
    unsigned short int config;
396
    config = adcPreScaler;                     // clk_pre_scaler
397
    config = 1                 << 9  | config; // clk_pre_scaler_ena
398
    config = 0                 << 10 | config; // adc sleep
399
    config = 0                 << 11 | config; // adc_chip_sel
400
 
401
    // if clk_pre_scaler_ena = 1,
402
    // freq_adc = freq_wbn / ((clk_pre_scaler+1)*2)
403
 
404
    EppParallelUseWin::PPStatusType status;
405
 
406
    status = port.negotiateEPP(portAddress);
407
 
408
 
409
    if (status != EppParallelUseWin::PP_CONECTED)
410
    {
411
        emit statusMessage(translateStatus(status));
412
        return;
413
    }
414
 
415
    status = port.testDataTransfer();
416
 
417
    port.writeWord(config, 5);
418
    status = port.testDataTransfer();
419
 
420
    if (status != EppParallelUseWin::PP_CONECTED)
421
    {
422
        for (int j = 0; (j <= 5) && (status != EppParallelUseWin::PP_CONECTED); j++)
423
        {
424
            port.writeWord(config, 5);
425
            status = port.testDataTransfer();
426
        }
427
        if (status != EppParallelUseWin::PP_CONECTED)
428
        {
429
            emit statusMessage(translateStatus(status));
430
            return;
431
        }
432
    }
433
 
434
    aDCSampleRate = BASE_SAMPLE_RATE/adcPreScaler;
435
 
436
}
437
 
438
double RVICommThread::getADCSampleRate()
439
{
440
    return aDCSampleRate;
441
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.