Čeština / English
Login

Návody / Pluginy pro QDevKit: Komunikace s FITkitem

Autor: Marek Vavruša ()

Abstrakt: Interakce a visualizace dat z FITkitu, ukázka implementace v C++ i Python.

Update: 27.9.2009

Komunikace s FITkitem představuje druhou důležitou oblast - často slouží jako zdroj dat pro další zpracování pluginem. Příklady:

  • Zobrazování dat na displeji FITkitu

  • Visualizace teploty z aplikace teploměr

  • Přeposílání výstupu do jiné aplikace

Do widgetu z předešlého dílu dnes doplníme pole pro zobrazování zprávy na displeji FITkitu. Předpokládáme, že běží aplikace Demo - LCD, která umožňuje zobrazování zpráv na displeji FITkitu.

1. Interakce s FITkitem

Existují dva přístupy pro práci s FITkitem :

  • sdílený - zařízení je stále připojeno ke konzoli, která z něj získává data

  • exkluzivní - volající získá výhradní přístup k FITkitu

Pro zápis je vhodné vždy použít exkluzivní přístup.

QDevKit verze 1.x.x nepodporuje plně sdílený přístup, data která plugin získá nebudou dostupná v terminálu.

Zdrojový kód:

def read_fitkit():
  conn = tabs.current()
  if conn is None:
     return None # Neni otevreno zadne spojeni
 
  kit = conn.device()
  channel = kit.channelB()
  return channel.read(10, 0)

Zdrojový kód:

def read_fitkit():
  conn = tabs.current()
  if conn is None:
     return None # Neni otevreno zadne spojeni
 
  kit = conn.detach(True) # Odpojime od terminalu
  channel = kit.channelB()
  data = channel.read(10, 0)
  conn.attach()
  return data

2. Příklad: Zasílání zpráv na displej FITkitu (Python)

Pro zápis použijeme metodu exkluzivního přístupu, zpráva se zobrazuje po stisku klávesy Enter v textovém poli nebo stisku tlačítka.

hello3.png

Zdrojový kód: hello.py

from PythonQt import *
 
# Globalni objekty
# prefix 'm' z duvodu nazornosti s C++ resenim
Widget = QDockWidget()
mText = QLineEdit()
 
# Inicializace modulu
# @return True|False
def init():
 
  # Create buttons
  sendButton = QPushButton()
  sendButton.text = "Zobrazit"
 
  # Connect
  mText.connect('returnPressed()', sendText)
  sendButton.connect('clicked()', sendText);
 
  # Add to layout
  widget = QWidget()
  layout = QHBoxLayout(widget)
  layout.addWidget(mText)
  layout.addWidget(sendButton)
 
  # Display
  mainWindow.addToDock(Qt.BottomDockWidgetArea, mWidget)
  mWidget.windowTitle = 'Zobrazit na displeji'
  mWidget.setWidget(widget)
  mWidget.hide()
  return True
 
# Spusteni modulu
# @return True|False
def load():
  mWidget.show()
  return True
 
# Ukonceni cinnosti
# @return True|False
def unload():
  mWidget.hide()
  return True
 
# Reset
def sendText():
 
  # Ziska soucasne pripojeni
  conn = tabs.current()
  if conn is None:
    return
 
  # Ziska zarizeni pro exkluzivni pristup
  # True = s notifikaci, False = bez notifikace
  dev = conn.detach(True)
  channel = dev.channelB()              # Kanal B
  text = mText.text.encode('ascii')     # Text pole
  channel.write('CLEAR\r\n')            # Vymaze displej
  channel.write('STRING %s\r\n' % text) # Nastavi text
  conn.attach()                         # Uvolni pristup terminalu

3. Příklad: Zasílání zpráv na displej FITkitu (C++)

Zdrojový kód: hello.h

#pragma once
#ifndef HELLO_H
#define HELLO_H
 
class QDockWidget;
class QLineEdit;
#include <qdevkit/plugininterfaces.h>
 
class Hello : public QObject, public PluginInterface
{
Q_OBJECT
Q_INTERFACES(PluginInterface)
 
public:
   Hello();
   bool isLoaded(); // Check if plugin loaded
   int load();      // Load plugin
   int unload();    // Unload plugin
   int configure(); // Configure - non-compulsory, responds to configure request
private slots:
   void sendText(); // NEW: Send text to display
private:
   QDockWidget* mWidget; // NEW: dock widget object
   QLineEdit* mText;     // NEW: line edit
};
 
#endif

Zdrojový kód: hello.cpp

#include "hello.h"
#include <QDockWidget>
#include <QLineEdit>
#include <QPushButton>
#include <QBoxLayout>
#include <qdevkit/connectiontabs.h>
#include <qdevkit/qfitkit.h>
#include <qdevkit/mainwindow.h>
 
Hello::Hello()
: mWidget(0), mText(0)
{}
 
bool Hello::isLoaded()
{
   return mWidget != 0;
}
 
int Hello::load()
{
   // Create widgets
   QWidget* widget = new QWidget();
   QPushButton* sendButton = new QPushButton("Zobrazit", widget);
   mText = new QLineEdit(widget);
 
   // Connect
   connect(mText, SIGNAL(returnPressed()), this, SLOT(sendText()));
   connect(sendButton, SIGNAL(clicked()), this, SLOT(sendText()));
 
   // Layout
   QHBoxLayout* layout = new QHBoxLayout(widget);
   layout->addWidget(mText);
   layout->addWidget(sendButton);
 
   // Create dock widget
   mWidget = new QDockWidget(tr("Zobrazit na displeji"));
   mWidget->setWidget(widget);
 
   // Display widget
   mainWindow().addToDock(Qt::BottomDockWidgetArea, mWidget);
}
 
int Hello::unload()
{
   // Remove widget
   mainWindow().removeFromDock(mWidget);
   mWidget->deleteLater();
   mWidget = 0;
   mText = 0; // Deleted from parent
   return !isLoaded();
}
 
int Hello::configure()
{
   return true;
}
 
void Hello::sendText()
{
   // Get connection
   Connection* conn = mainWindow().tabs()->current();
   if(conn == 0)
      return;
   if(!conn->isReady())
      return;
 
   // Get device (exclusive)
   QFitKit* device = conn->detach(true);
   QFitKitChannel& ch = *device->channelB();
   ch.write("CLEAR\r\n"); // Clear display
 
   QByteArray data("STRING ");
   data.append(mText->text());
   data.append("\r\n");
 
   ch.write(data, data.size()); // Send message
   conn->attach(); // Reattach connection
}
 
Q_EXPORT_PLUGIN2(pnp_Hello, Hello)

4. Závěr

Ukázali jsme si příklad čtení dat z FITkitu, na závěr si shrneme dostupné API a speciální objekty.

Zobrazeno: 3011x Naposledy: 1.10.2023 00:18:16