Changeset 168


Ignore:
Timestamp:
Feb 12, 2010, 11:37:22 AM (11 years ago)
Author:
ogrimm
Message:
Conversion to string can now handle arrays and structures
Location:
Evidence
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • Evidence/Edd/Edd.cc

    r167 r168  
    2020        Qt::gray, Qt::darkGray, Qt::lightGray};
    2121
    22 class GUI *Handler;
     22
     23class Edd_DIM *Handler;
    2324
    2425
    2526// History chooser function (opens plot for numeric data, TextHist for all other)
    26 QWidget *OpenHistory(char *Service) {
     27QWidget *OpenHistory(char *Service, int Index) {
    2728
    2829  char *Name, *Format;
    2930  DimBrowser Browser;
    30  
    31   //if (Browser.getServices(Service) == 0) return NULL;
     31
    3232  Browser.getServices(Service);
    3333  if (Browser.getNextService(Name, Format) != DimSERVICE) return NULL;
    3434 
    35   if (strlen(Format) == 1 && *Format != 'C') return new Edd_Plot(Service);
     35  if (strlen(Format) == 1 && *Format != 'C') return new Edd_Plot(Service, Index);
    3636  else return new Edd_TextHist(Service);
    3737}
     
    4343
    4444// Constructor
    45 Edd_Indicator::Edd_Indicator(QString DIMService, QWidget *P): QLineEdit(P) {
    46 
     45Edd_Indicator::Edd_Indicator(QString Name, int Index, QWidget *P):
     46        QLineEdit(P), ServiceName(Name), Index(Index) {
     47 
    4748  // Widget properties
    4849  setReadOnly(true);
     
    5253  // Connect to DIM handler
    5354  if (connect(Handler, SIGNAL(YEP(DimInfo*, int, QByteArray, QString)), SLOT(Update(DimInfo*, int, QByteArray, QString))) == false) {
    54     printf("Failed connection for %s\n", DIMService.toAscii().data());
     55    printf("Failed connection for %s\n", Name.toAscii().data());
    5556  }
    5657
     
    6162  Menu->addAction("Copy data", this, SLOT(MenuCopyData()));
    6263
    63   // DIM client
    64   Data = new DimStampedInfo(DIMService.toAscii().data(), INT_MAX, NO_LINK, Handler);
     64  // Subscribe to service
     65  Handler->Subscribe(Name);
    6566}
    6667
    6768// Destructor
    6869Edd_Indicator::~Edd_Indicator() {
    69   delete Data;
     70
     71  Handler->Unsubscribe(ServiceName);
    7072}
    7173
     
    7375void Edd_Indicator::Update(DimInfo *Info, int Time, QByteArray Array, QString Text) {
    7476
    75   if (Info != Data) return;
    76    
     77  if (ServiceName != Info->getName()) return;
     78
    7779  QPalette Pal = palette(); 
    7880
     
    9395    }
    9496       
     97        if (toupper(*(Info->getFormat()) != 'C')) Text = Text.section(' ', Index, Index);
     98
    9599        if (!ShowAsTime) setText(Text);
    96100        else setText(QDateTime::fromTime_t(Text.toInt()).toString());
    97        
     101        setCursorPosition(0);
     102
    98103    // Update status tip
    99     setStatusTip(QString("%1:  Last update %2  Format '%3'").arg(Info->getName(), QDateTime::fromTime_t(Time).toString()).arg(Info->getFormat()));
     104    setStatusTip(QString("%1:  Last update %2   Format '%3'   Index %4").arg(Info->getName()).arg(  QDateTime::fromTime_t(Time).toString()).arg(Info->getFormat()).arg(Index));
    100105  }
    101106 
     
    135140  QDrag *Drag = new QDrag(this);
    136141  QMimeData *MimeData = new QMimeData;
    137   MimeData->setText(QString(Data->getName()));
     142  MimeData->setText(ServiceName);
    138143  Drag->setMimeData(MimeData);
    139144  Drag->exec();
     
    151156void Edd_Indicator::MenuOpenHistory() {
    152157 
    153   LastPlot = OpenHistory(Data->getName());
     158  LastPlot = OpenHistory(ServiceName.toAscii().data(), Index);
    154159  if (LastPlot != NULL) LastPlot->show();
    155160}
     
    158163void Edd_Indicator::MenuCopyService() {
    159164 
    160   QApplication::clipboard()->setText(QString(Data->getName()));
     165  QApplication::clipboard()->setText(ServiceName);
    161166}
    162167
     
    174179// Constructor
    175180//
    176 Edd_Plot::Edd_Plot(QString DIMService, QWidget *P): QwtPlot(P), EvidenceHistory() {
    177 
     181Edd_Plot::Edd_Plot(QString DIMService, int Index, QWidget *P):
     182        QwtPlot(P), EvidenceHistory() {
     183
     184  Mutex = new QMutex(QMutex::Recursive);
     185 
     186  // Widget properties
    178187  setAcceptDrops(true);
    179188  setAttribute(Qt::WA_DeleteOnClose);
    180  
    181   // Graph properties
    182189  setAutoReplot(false);
    183190  setCanvasBackground(QColor(Qt::yellow));
     
    220227
    221228  // DIM client
    222   if (!DIMService.isEmpty()) AddService(DIMService);
     229  if (!DIMService.isEmpty()) AddService(DIMService, Index);
    223230}
    224231
     
    229236
    230237  for (int i=0; i<Items.size(); i++) {
    231     delete Items[i].LiveData;
     238    Handler->Unsubscribe(Items[i].Name);
    232239    delete Items[i].Signal;
    233240  } 
    234241  delete Grid;
     242  delete Mutex;
    235243}
    236244
     
    238246// Add history service to plot
    239247//
    240 void Edd_Plot::AddService(QString Name) {
    241 
     248void Edd_Plot::AddService(QString Name, int Index) {
     249return;
    242250  // Lock before accessing Items list
    243   QMutexLocker Locker(&Mutex);
     251  QMutexLocker Locker(Mutex);
    244252
    245253  // Check if already subscribed to service
    246254  for (int i=0; i<Items.size(); i++) {
    247     if (Name == Items[i].LiveData->getName()) {
    248       QMessageBox::warning(this, "Edd Message",Name+".hist already present",QMessageBox::Ok);
     255    if (Name == Items[i].Name && Index == Items[i].Index) {
     256      QMessageBox::warning(this, "Edd Message",Name+" (index "+QString::number(Index)+") already present",QMessageBox::Ok);
    249257      return;
    250258    }
     
    253261  // Generate new curve and subscribe to service
    254262  struct PlotItem New;
     263
     264  New.Name = Name;
    255265  New.Signal = new QwtPlotCurve;
    256266  New.Signal->attach(this);
    257   New.Signal->setTitle(Name+".hist");
     267  New.Signal->setTitle(Name+"("+QString::number(Index)+")");
    258268  New.Signal->setPen(QColor(LineColors[Items.size() % (sizeof(LineColors)/sizeof(Qt::GlobalColor))]));
    259269  New.SizeLimit = 5000;
    260   New.LiveData = new DimStampedInfo(Name.toAscii().data(), NO_LINK, Handler);
     270  New.Index = Index;
    261271
    262272  Items.append(New);
     273  Handler->Subscribe(Name);
    263274}
    264275
     
    269280  if (Time == -1) {
    270281        setStatusTip(QString("%1:  unavailable").arg(Info->getName()));
     282        return;
    271283  }
    272284
    273285  // Lock before accessing Items list
    274   QMutexLocker Locker(&Mutex);
     286  QMutexLocker Locker(Mutex);
    275287
    276288  // Determine which plot item this call belongs to
    277289  int ItemNo;
    278   for (ItemNo=0; ItemNo<Items.size(); ItemNo++) if (Info == Items[ItemNo].LiveData) {
     290  for (ItemNo=0; ItemNo<Items.size(); ItemNo++) if (Items[ItemNo].Name == Info->getName()) {
    279291 
    280292        // If size limit reached, clear buffer
     
    289301          void *Data;
    290302
    291           if (GetHistory(Items[ItemNo].LiveData->getName())) {
     303          if (GetHistory(Items[ItemNo].Name.toAscii().data())) {
    292304        double Smallest = DBL_MAX, Largest = DBL_MIN;
    293305                double Number=0;
    294306                while (Next(Time, Size, Data)) {
    295                   switch (*(Info->getFormat())) {
    296                 case 'I':  Number = *(int *) Data;   break;
    297                 case 'S':  Number = *(short *) Data;   break;
    298                 case 'F':  Number = *(float *) Data;   break;
    299                 case 'D':  Number = *(double *) Data;   break;
    300                 case 'X':  Number = *(long long *) Data;   break;
     307                  switch (toupper(*(Info->getFormat()))) {
     308                case 'I':
     309                        case 'L':  Number = *((int *) Data + Items[ItemNo].Index);   break;
     310                case 'S':  Number = *((short *) Data + Items[ItemNo].Index);   break;
     311                case 'F':  Number = *((float *) Data + Items[ItemNo].Index);   break;
     312                case 'D':  Number = *((double *) Data + Items[ItemNo].Index);   break;
     313                case 'X':  Number = *((long long *) Data + Items[ItemNo].Index);   break;
    301314                default: break;
    302315                  }
     
    320333
    321334    // Append data
     335        Text = Text.section(' ', Items[ItemNo].Index, Items[ItemNo].Index);
     336
    322337    Items[ItemNo].x.append(Time);
    323338    Items[ItemNo].y.append(atof(Text.toAscii().data()));
     
    329344    // Update status tip
    330345    QDateTime Timex = QDateTime::fromTime_t(Time);
    331     StatusTip = QString("%1:  Last update %2  Format '%3'").arg(Info->getName(), Timex.toString()).arg(Info->getFormat());
    332   }
    333 
    334   Locker.unlock();
     346    setStatusTip(QString("%1:  Last update %2   Format '%3'").arg(Info->getName(), Timex.toString()).arg(Info->getFormat()));
     347  }
    335348
    336349  UpdatePlot();
     
    352365
    353366  // Lock before accessing Items list
    354   QMutexLocker Locker(&Mutex);
    355 
    356   setStatusTip(StatusTip);
    357  
     367  QMutexLocker Locker(Mutex);
     368
    358369  for (int ItemNo=0; ItemNo<Items.size(); ItemNo++) {
    359370
     
    440451
    441452  // Lock before accessing Items list
    442   QMutexLocker Locker(&Mutex);
     453  QMutexLocker Locker(Mutex);
    443454
    444455  while (Items.size() > 1) { 
    445     delete Items.last().LiveData;
     456    Handler->Unsubscribe(Items.last().Name);
    446457    delete Items.last().Signal;
    447458    Items.takeLast();
    448459  }
    449  
    450   Locker.unlock();
    451460  UpdatePlot();
    452461}
     
    465474 
    466475  // Lock before accessing Items list
    467   QMutexLocker Locker(&Mutex);
     476  QMutexLocker Locker(Mutex);
    468477  QTextStream Stream(&File);
    469478
    470479   // Write x and y data for all signals to file
    471480  for (int ItemNo=0; ItemNo<Items.size(); ItemNo++) {
    472     Stream << QString("# ")+Items[ItemNo].LiveData->getName()+".hist" << endl;
     481    Stream << QString("# ") + Items[ItemNo].Name + ".hist" << endl;
    473482    for (int i=0; i<Items[ItemNo].Signal->dataSize(); i++) {
    474483      Stream << (int) Items[ItemNo].x.at(i) << " " << Items[ItemNo].Signal->y(i) << endl;
     
    518527// Constructor
    519528//
    520 Edd_TextHist::Edd_TextHist(QString DIMService, QWidget *P): QTextEdit(P), EvidenceHistory() {
     529Edd_TextHist::Edd_TextHist(QString Name, QWidget *P):
     530        QTextEdit(P), EvidenceHistory(), Name(Name) {
    521531 
    522532  // Widget properties
     
    528538  // Connect to DIM handler
    529539  if (connect(Handler, SIGNAL(YEP(DimInfo*, int, QByteArray, QString)), SLOT(Update(DimInfo*, int, QByteArray, QString))) == false) {
    530     printf("Failed connection for %s\n", DIMService.toAscii().data());
     540    printf("Failed connection for %s\n", Name.toAscii().data());
    531541  }
    532542
     
    535545  void *Data;
    536546
    537   if (GetHistory(DIMService.toAscii().data())) {
     547  if (GetHistory(Name.toAscii().data())) {
    538548        while (Next(Time, Size, Data)) {
    539549          moveCursor (QTextCursor::Start);
     
    544554
    545555  // DIM client
    546   Service = new DimStampedInfo(DIMService.toAscii().data(), INT_MAX, NO_LINK, Handler);
     556  Handler->Subscribe(Name);
    547557}
    548558
     
    550560Edd_TextHist::~Edd_TextHist() {
    551561
    552   delete Service;
     562  Handler->Unsubscribe(Name);
    553563}
    554564
     
    557567void Edd_TextHist::Update(DimInfo *Info, int Time, QByteArray, QString Text) {
    558568
    559   if (Info != this->Service) return;
     569  if (Name != Info->getName()) return;
    560570
    561571  // Check if service available
     
    572582       
    573583  // Update status tip
    574   StatusTip = QString("%1:  Last update %2  Format '%3'").arg(Info->getName(), Timex.toString()).arg(Info->getFormat());
     584  setStatusTip(QString("%1:  Last update %2  Format '%3'").arg(Info->getName(), Timex.toString()).arg(Info->getFormat()));
    575585}
    576586
     
    581591
    582592// Constructor
    583 Edd_Textout::Edd_Textout(QString DIMService, QWidget *P): QTextEdit(P) {
     593Edd_Textout::Edd_Textout(QString Name, QWidget *P): QTextEdit(P), Name(Name) {
    584594
    585595  // Widget properties
     
    591601  // Connect to DIM handler
    592602  if (connect(Handler, SIGNAL(YEP(DimInfo*, int, QByteArray, QString)), SLOT(Update(DimInfo*, int, QByteArray, QString))) == false) {
    593     printf("Failed connection for %s\n", DIMService.toAscii().data());
    594   }
    595 
    596   // DIM client
    597   Data = new DimStampedInfo(DIMService.toAscii().data(), INT_MAX, NO_LINK, Handler);
     603    printf("Failed connection for %s\n", Name.toAscii().data());
     604  }
     605
     606  // Subscribe to service
     607  Handler->Subscribe(Name);
    598608}
    599609
     
    601611Edd_Textout::~Edd_Textout() {
    602612
    603   delete Data;
     613  Handler->Unsubscribe(Name);
    604614}
    605615
     
    607617void Edd_Textout::Update(DimInfo *Info, int Time, QByteArray, QString Text) {
    608618
    609   if (Info != this->Data) return;
     619  if (Name != Info->getName()) return;
    610620 
    611621  QPalette Pal = palette(); 
     
    622632        if (Accumulate == false) clear();
    623633       
    624     // Add if service contains only a string
    625     if (strcmp(Info->getFormat(), "C") == 0) insertPlainText(Text);
    626 
    627     // Update status tip
    628     setStatusTip(QString("%1:  Last update %2  Format '%3'").arg(Info->getName(), QDateTime::fromTime_t(Time).toString()).arg(Info->getFormat()));
     634        // Add if service contains only a string
     635        if (strcmp(Info->getFormat(), "C") == 0) insertPlainText(Text);
     636
     637        // Update status tip
     638        setStatusTip(QString("%1:  Last update %2  Format '%3'").arg(Info->getName(), QDateTime::fromTime_t(Time).toString()).arg(Info->getFormat()));
    629639  }
    630640  setPalette(Pal);
     641}
     642
     643
     644/////////////////////////////
     645// Interface to Dim system //
     646/////////////////////////////
     647Edd_DIM::Edd_DIM() {
     648
     649  Mutex = new QMutex(QMutex::Recursive);
     650
     651  // Connect to DIM handler
     652  if (connect(this, SIGNAL(YEP(DimInfo*, int, QByteArray, QString)), SLOT(Update(DimInfo*, int, QByteArray, QString))) == false) {
     653    printf("Failed connection in Edd_DIM()\n");
     654  }
     655}
     656
     657Edd_DIM::~Edd_DIM() {
     658
     659  delete Mutex;
     660}
     661
     662// Subscribe to DIM service
     663void Edd_DIM::Subscribe(QString Name) {
     664
     665  // Lock before accessing list
     666  QMutexLocker Locker(Mutex);
     667
     668  // Check if already subscribed to service, then increase usage count and emit last service data
     669  for (int i=0; i<ServiceList.size(); i++) if (ServiceList[i].Name == Name) {
     670        ServiceList[i].Count++;
     671        YEP(ServiceList[i].DIMService, ServiceList[i].TimeStamp, ServiceList[i].ByteArray, ServiceList[i].Text);
     672        return;
     673  }
     674
     675  // Create new entry in service list
     676  struct Item New;
     677  New.Name = Name;
     678  New.DIMService = new DimStampedInfo(Name.toAscii().data(), INT_MAX, NO_LINK, this);
     679  New.Count = 1;
     680  ServiceList.append(New);
     681
     682  return;
     683}
     684
     685// Unsubsribe from DIM service
     686void Edd_DIM::Unsubscribe(QString Name) {
     687
     688  // Lock before accessing list
     689  QMutexLocker Locker(Mutex);
     690
     691  for (int i=0; i<ServiceList.size(); i++) if (ServiceList[i].Name == Name) {
     692        ServiceList[i].Count--;
     693        if (ServiceList[i].Count == 0) {
     694          delete ServiceList[i].DIMService;
     695          ServiceList.removeAt(i);
     696          return;
     697        }
     698  }
     699}
     700
     701// Store service information for usage by Subscribe()
     702void Edd_DIM::Update(DimInfo *Info, int Time, QByteArray Data, QString Text) {
     703
     704  // Lock before accessing list
     705  QMutexLocker Locker(Mutex);
     706
     707  for (int i=0; i<ServiceList.size(); i++) if (ServiceList[i].Name == Info->getName()) {
     708          ServiceList[i].TimeStamp = Time;
     709          ServiceList[i].ByteArray = Data;
     710          ServiceList[i].Text = Text;
     711  }
     712}
     713
     714// Handling of DIM service update
     715void Edd_DIM::infoHandler() {
     716
     717  if (!EvidenceServer::ServiceOK(getInfo())) YEP(getInfo(), -1);
     718  else {
     719        char *Txt = EvidenceServer::ToString(getInfo());
     720        YEP(getInfo(), getInfo()->getTimestamp(), QByteArray((char *) getInfo()->getData(), getInfo()->getSize()), QString(Txt));
     721        free(Txt);
     722  }
    631723}
    632724
     
    637729GUI::GUI() {
    638730 
    639   Handler = this;
     731  Handler = new Edd_DIM();
    640732 
    641733  // Set features of main window
     
    685777  MainLayout->addWidget(Textout, 1, 0, 1, 2);
    686778
    687   QFrame *Val = new QFrame();
    688   Val->setFrameStyle(QFrame::HLine);
    689   Val->setLineWidth(10);
    690   //Value->setMaximumWidth(200);
    691   MainLayout->addWidget(Val, 2, 0, 2, 1);     
    692 
    693779  Value = new Edd_Indicator("DColl/Status");
    694780  Value->setMaximumWidth(200);
     
    718804  connect(Button, SIGNAL(released()), SLOT(StartDIMBrowser()));
    719805  MainLayout->addWidget(Button, 7, 1, 1, 1);
    720 
    721   Edd_TextHist *Bla;
    722   Bla = new Edd_TextHist("DColl/CurrentFile");
    723   MainLayout->addWidget(Bla, 8, 0, 1, 1);
    724806
    725807  // Layout of all widgets
     
    737819  Graph = new Edd_Plot();
    738820  for (int i=0; i<36; i++) {
    739     Text = Text.sprintf("Feedback/Average/ID%.2d/%.2d",i/8, i%8);
    740     Value = new Edd_Indicator(Text);
    741 
     821    //Text = Text.sprintf("Feedback/Average/ID%.2d/%.2d-%.3d",i/16, (i%16)/8, i%8);
     822    Text = Text.sprintf("Feedback/AverageTest/ID%.2d",i/16);
     823    Value = new Edd_Indicator(Text, i%16);
    742824    FeedbackLayout->addWidget(Value, i%9+1, 0+i/9, 1, 1);
    743825    //Graph->AddService(Text);
    744 
    745     //Text = Text.sprintf("Bias/VOLT/ID00/01-%.3d",i);
    746     //Value = new Edd_Indicator(Text);
    747     //BiasLayout->addWidget(Value, i%9+1, 2+i/9, 1, 1);
     826  }
     827  FeedbackLayout->addWidget(Graph, 0, 4, 11, 3);
     828
     829  //Graph = new Edd_Plot();
     830  //for (int i=0; i<36; i++) {
     831    //Text = Text.sprintf("Feedback/Sigma/ID%.2d/%.2d-%.3d",i/16, (i%16)/8, i%8);
    748832    //Graph->AddService(Text);
    749   }
    750 
    751   FeedbackLayout->addWidget(Graph, 0, 4, 12, 3);
     833  //}
     834  //FeedbackLayout->addWidget(Graph, 10, 0, 10, 3);
     835
    752836  Value = new Edd_Indicator("Feedback/Status");
    753837  Value->setMaximumWidth(200);
    754838  FeedbackLayout->addWidget(Value, 0, 0, 1, 3);     
     839  Value = new Edd_Indicator("Feedback/Count");
     840  FeedbackLayout->addWidget(Value, 0, 3, 1, 1);     
    755841
    756842  // Bias voltage page
     
    759845  Graph = new Edd_Plot();
    760846  for (int i=0; i<18; i++) {
    761     Text = Text.sprintf("Bias/VOLT/ID00/00-%.3d",i);
    762     Value = new Edd_Indicator(Text);
    763 
     847    Value = new Edd_Indicator("Bias/VOLT/ID00", i);
    764848    BiasLayout->addWidget(Value, i%9+1, 0+i/9, 1, 1);
    765     Graph->AddService(Text);
    766 
    767     Text = Text.sprintf("Bias/VOLT/ID00/01-%.3d",i);
    768     Value = new Edd_Indicator(Text);
     849    //Graph->AddService(Text, i);
     850
     851    Value = new Edd_Indicator("Bias/VOLT/ID00", i+32);
    769852    BiasLayout->addWidget(Value, i%9+1, 2+i/9, 1, 1);
    770     Graph->AddService(Text);
     853    //Graph->AddService(Text,i+32);
    771854  }
    772855
     
    789872  Graph = new Edd_Plot();
    790873  for (int i=0; i<10; i++) {
    791     Text = Text.sprintf("ARDUINO/VAL%.2d", i);
    792     Value = new Edd_Indicator(Text);
     874    Value = new Edd_Indicator("ARDUINO/Data", i);
    793875    EnvironmentLayout->addWidget(Value, i%5+1, i/5, 1, 1);
    794     Graph->AddService(Text);
     876    Graph->AddService("ARDUINO/Data", i);
    795877  }
    796878  EnvironmentLayout->addWidget(Graph, 0, 3, 7, 4);     
     
    857939    Result = Result.trimmed();
    858940    if (Result.endsWith(".hist")) Result.chop(5);
    859     QWidget *Hist = OpenHistory(Result.toAscii().data());
     941    QWidget *Hist = OpenHistory(Result.toAscii().data(), 0);
    860942    if (Hist != NULL) Hist->show();
    861   }
    862 }
    863 
    864 // Handling of DIM service update
    865 void GUI::infoHandler() {
    866 
    867   // Check if service available
    868   if (!EvidenceServer::ServiceOK(getInfo())) YEP(getInfo(), -1);
    869   else {
    870     char *Txt = EvidenceServer::ToString(getInfo());
    871 
    872     YEP(getInfo(), getInfo()->getTimestamp(), QByteArray((char *) getInfo()->getData(), getInfo()->getSize()), QString(Txt));
    873         free(Txt);
    874943  }
    875944}
  • Evidence/Edd/Edd.h

    r167 r168  
    2525#define SVN_REVISION "$Revision$"
    2626
    27 QWidget *OpenHistory(char *);
     27QWidget *OpenHistory(char *, int);
    2828
    2929// Time scale for axis
     
    3333    virtual QwtText label(double v) const {
    3434      QDateTime t = QDateTime::fromTime_t((int) v);
    35       return t.toString("dMMM'\n'h:m:s");
     35      return t.toString("dMMM'\n'hh:mm:ss");
    3636    }
    3737};
     
    3939                 
    4040// General indicator for DIM service
    41 class Edd_Indicator: public QLineEdit, public DimClient {
     41class Edd_Indicator: public QLineEdit {
    4242    Q_OBJECT
    4343
    4444    QMenu *Menu;
    4545    QPoint dragStart;
    46     //QwtPlot *LastPlot;
    4746    QWidget *LastPlot;
    4847       
    49     DimStampedInfo *Data;
     48        QString ServiceName;
     49        int Index;
    5050       
    5151    void mousePressEvent(QMouseEvent *);
     
    5454       
    5555  public:
    56     Edd_Indicator(QString, QWidget * = NULL);
     56    Edd_Indicator(QString, int=0, QWidget * = NULL);
    5757    ~Edd_Indicator();
    5858
     
    7272
    7373    struct PlotItem {
    74       DimInfo *LiveData;
     74      QString Name;
    7575      QwtPlotCurve *Signal;
    7676      double Smallest;
     
    7878          int SizeLimit;
    7979          QVector<double> x;
    80           QVector<double> y;     
     80          QVector<double> y;
     81          int Index;     
    8182    };
    8283
    8384    QList<struct PlotItem> Items;
    84     QMutex Mutex;
    85    
    86         QString StatusTip;
    87        
     85    QMutex *Mutex;
     86   
    8887    QMenu *Menu;
    8988    QAction *YLogAction;
     
    10099
    101100  public:
    102     Edd_Plot(QString = QString(), QWidget * = NULL);
     101    Edd_Plot(QString = QString(), int = 0, QWidget * = NULL);
    103102    ~Edd_Plot();
    104     void AddService(QString);
     103    void AddService(QString, int = 0);
    105104
    106105  private slots:
     
    123122    Q_OBJECT
    124123
    125         QString StatusTip;
    126         DimStampedInfo *Service;
     124        QString Name;
    127125       
    128126  public:
     
    138136    Q_OBJECT
    139137
    140     DimStampedInfo *Data;
     138    QString Name;
    141139
    142140  public:
     
    150148};
    151149
     150// Interface to DIM system
     151class Edd_DIM: public QObject, public DimInfo {
     152    Q_OBJECT
     153
     154        struct Item {
     155          QString Name;
     156          DimStampedInfo *DIMService;
     157          int Count;
     158          int TimeStamp;
     159          QByteArray ByteArray;
     160          QString Text;
     161        };
     162    QList<Item> ServiceList;
     163    QMutex *Mutex;
     164
     165        void infoHandler();
     166
     167  private slots:
     168        void Update(DimInfo *, int, QByteArray, QString);
     169
     170  public:
     171    Edd_DIM();
     172    ~Edd_DIM();
     173
     174        void Subscribe(QString);
     175        void Unsubscribe (QString);
     176
     177  signals:
     178    void YEP(DimInfo *, int, QByteArray = QByteArray(), QString = QString());
     179};
     180
     181
    152182// Main window class
    153 class GUI: public QMainWindow, public DimBrowser, public DimInfo {
     183class GUI: public QMainWindow, public DimBrowser {
    154184    Q_OBJECT
    155185
     
    162192           
    163193    void closeEvent(QCloseEvent *);
    164         void infoHandler();
    165194       
    166195  public:
     
    172201    void MenuNewHistory();
    173202        void StartDIMBrowser();
    174        
    175   signals:
    176     void YEP(DimInfo *, int, QByteArray = QByteArray(), QString = QString());
    177203};
    178204
  • Evidence/Evidence.cc

    r167 r168  
    227227
    228228// Translates DIMInfo to string (memory has to be freed by caller)
    229 // DIM structures are converted to hexadecimal representation
    230 // For string conversion, a terminating \0 is enforced.
    231229char *EvidenceServer::ToString(DimInfo *Item) {
    232230
    233231  char *Text;
    234   int R=0;
    235  
     232
     233  // Structure: print hex representation (3 characters per byte) 
    236234  if (strlen(Item->getFormat()) != 1) {
    237235    if ((Text = (char *) malloc(3*Item->getSize()+1)) != NULL) {
    238236          for (int i=0; i<Item->getSize(); i++) sprintf(Text+3*i, "%02x", *((char *) Item->getData() + i));
    239237        }
    240   }
    241   else {
    242         switch (*(Item->getFormat())) {
    243       case 'I':  R = asprintf(&Text, "%d", Item->getInt());   break;
    244       case 'S':  R = asprintf(&Text, "%hd", Item->getShort());   break;
    245       case 'F':  R = asprintf(&Text, "%.5f", Item->getFloat());   break;
    246       case 'D':  R = asprintf(&Text, "%.5f", Item->getDouble());   break;
    247       case 'X':  R = asprintf(&Text, "%lld", Item->getLonglong());   break;
    248       case 'C':  *(Item->getString() + Item->getSize() - 1) = '\0';
    249                                  R = asprintf(&Text, "%s", Item->getString());
    250                                  break;
    251       default: return NULL;
     238        return Text;
     239  }
     240
     241  // String: terminating \0 is enforced
     242  if (toupper(*(Item->getFormat())) == 'C') { 
     243    *(Item->getString() + Item->getSize() - 1) = '\0';
     244        if (asprintf(&Text, "%s", Item->getString()) == -1) return NULL;
     245        return Text;
     246  }
     247
     248  // Number array
     249  int Size;
     250  switch (toupper(*(Item->getFormat()))) {
     251    case 'I':
     252    case 'L': Size = sizeof(int);               break;
     253    case 'S': Size = sizeof(short);             break;
     254    case 'F': Size = sizeof(float);             break;
     255    case 'D': Size = sizeof(double);    break;
     256    case 'X': Size = sizeof(long long); break;
     257    default: return NULL;
     258  }
     259
     260  int Max, Mem = Item->getSize()*Size*4+1;
     261  char *Pos;
     262
     263  if ((Text = (char *) malloc(Mem)) == NULL) return NULL;
     264
     265  *Text = '\0';
     266  for (int i=0; i<Item->getSize()/Size; i++) {
     267        Pos = Text+strlen(Text);
     268        Max = Mem-strlen(Text);
     269
     270        switch (toupper(*(Item->getFormat()))) {
     271      case 'I':
     272      case 'L': snprintf(Pos, Max, "%d ", *((int *) Item->getData() + i));
     273                                break;
     274      case 'S': snprintf(Pos, Max, "%hd ", *((short *) Item->getData() + i));
     275                                break;
     276      case 'F': snprintf(Pos, Max, "%.5f ", *((float *) Item->getData() + i));
     277                                break;
     278      case 'D': snprintf(Pos, Max, "%.5f ", *((double *) Item->getData() + i));
     279                                break;
     280      case 'X': snprintf(Pos, Max, "%lld ", *((long long *) Item->getData() + i));
     281                                break;
    252282        }
    253283  }
    254284 
    255   return (R == -1) ? NULL : Text;
     285  return Text;
    256286}
    257287
Note: See TracChangeset for help on using the changeset viewer.