Abstrakt: Interakce a visualizace dat z FITkitu, ukázka implementace v C++ i Python.
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.
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
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.
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
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)
Ukázali jsme si příklad čtení dat z FITkitu, na závěr si shrneme dostupné API a speciální objekty.
Předchozí díl: Pluginy pro QDevKit: Tvorba grafického rozhraní
Následující díl: Pluginy pro QDevKit: Přehled API
Zpět na návody