Skip to content

C++

13 posts with the tag “C++”

Casting between Qt and OpenCV primitives

OpenCV & QT
OpenCV & QT.

As a follow-up to the previous post, I’d like to present some code which I think might be helpful for other Qt / OpenCV projects as well.

This code was written for Pastie. Pastie is a piece of software I wrote as part my image processing seminar. It makes use of the well known libraries:

  • Qt for the graphical user interface
  • OpenCV for image processing and computer vision

I wrote a C++ header file to facilitate the co-operation of those two libraries. This file enables the conversion / casting of OpenCV and Qt types e.g.:

#include <QImage>
#include <cv/core.hpp>
QImage qimg("filename.png");
cv::Mat cvimg = toCv(qimg);

The source code is available at Codeberg: /stv0g/snippets/c/qcv_cast.h .

The following conversions are supported:

QImagecv::Mat
QTransformcv::Mat
QPointcv::Point2i
QPointFcv::Point2f
QRectcv::Rect2i
QRectFcv::Rect2f
QSizecv::Size

You can find some examples in the real code here: /stv0g/pastie/filters/pattern.cpp and here /stv0g/pastie/cast.h .

calcelestial

Planets of the Solar System

/stv0g/calcelestial ist ein kleines Linux-Tool zum Berechnen von Auf- und Untergangszeiten sowie der Position sämtlicher Planeten unseres Sonnensystems.

Es ist der Weiterentwicklung von /stv0g/sun , das ursprünglich als kleines Bash-Skript für meinen Router startete. Mittlerweile ist das Tool zu einem weit umfangreicherem Werkzeug gewachsen, welches nicht mehr nur die Auf- und Untergangszeit der Sonne berechnen kann:

Es sind mit dem Mond, Mars, Neptun, Jupiter, Merkur, Uranus, Saturn, Venus und Pluto eine Menge neuer Planeten dazugekommen. Auch kann nun die Position dieser Himmelskörper zu jedem beliebigen Zeitpunkt oder dem Auf- und Untergang berechnet werden.

Nun bin ich selber kein kleiner Hobby-Astronom, sodass ich diese ganzen Berechnungen aus dem Ärmel schütteln könnte. Stattdessen nutze ich die Bibliothek libnova. libnova benutzt die sehr genauen Algorithmen “Variations Séculaires des Orbites Planétaires” (kurz VSOP-87), die Pierre Pratagnon 1987 entwickelte.

Terminal window
$ calcelestial
Usage:
calcelestial [options]
Options:
-p, --object calc for celestial object: sun, moon, mars, neptune,
jupiter, mercury, uranus, saturn, venus or pluto
-H, --horizon calc rise / set time with twilight: nautic, civil or astronomical
-t, --time calc at given time: YYYY-MM-DD [HH:MM:SS]
-m, --moment calc position at moment of: rise, set, transit
-n, --next use rise, set, transit time of tomorrow
-f, --format output format: see strftime (3) for more details
-a, --lat geographical latitude of observer: -90° to 90°
-o, --lon geographical longitude of oberserver: -180° to 180°
-q, --query query geonames.org for geographical coordinates
-z, --timezone override system timezone
-u, --universal use universial time for parsing and formatting
-h, --help show this help
-v, --version show version
A combination of --lat & --lon or --query is required.
Please report bugs to: post@steffenvogel.de

Die einfachste Variante nutzt das Unix Tool at:

Terminal window
echo ~/bin/enable-lightning | at $(calcelestial -p sun -m set -q Frankfurt -H civil)

Mit folgenden Cronjobs, lässt sich dieses Prinzip auch leicht auf andere Anwendungen übertragen:

0 0 * * * echo 'fnctl stop && fnctl fade -c 000000' | at $(calcelestial -m rise -p sun -q Aachen)
0 0 * * * echo 'fnctl start' | at $(calcelestial -m set -p sun -q Frankfurt)

Mit dem Tool nvram-wakeup, lässt sich so beispielsweise der Rechner jeden Tag 10 Minuten for Sonnenaufgang automatisch starten:

Terminal window
nvram-wakeup -s $(date -d "-10 min $(calcelestial -m rise -p sun -q Berlin)" +%s)

Oder möchtest du deinen Rechner nach Sonnenuntergang automatisch herunterfahren?

Terminal window
shutdown $(date -d +10 min $(calcelestial -m rise -p sun --lat=50.55 --lon=-6.2) +%H:%M)

Die aktuelle Position des Mondes kann beispielsweise so bestimmt werden:

Terminal window
calcelestial -p moon -q Aachen -f "az: §a alt: §h"

Detailiertere Dokumentation findet ihr in der Manpage calcelestial(1).

calcelestial ist wie immer auf Codeberg verfügbar /stv0g/calcelestial .

Cron Jobs für Sonnenauf- & untergang

Nicht selten kommt es mal vor, dass sich ein Rechner nach astronomischen Zyklen orientiert. Die zur Berechnung der Osterfeiertage häufig verwendete Gaußsche Osterformel basiert so z.T. auf der Mondgleichung.

Unser Problem stellte sich etwas anders dar: Die LED-Flurbeleuchtung in unserem Flur wird durch den Router geregelt und lief bisher in der Regel 24/7. Mit dem hier vorgestellten Programm haben wir es nun geschafft die Laufzeit auf die Nachtstunden zu begrenzen, indem wir die von unserer geografischen Position abhängige Sonnenuntergangszeit nutzen um die Lampen erst bei Dämmerung einzuschalten.

UPDATE: Ich habe nochmal etwas Arbeit in das Tool investiert und es in ein eigenes Projekt ausgelagert. Das neue Tool liefert wesentliche genauere Ergebnisse und mehr Funktionen. Zu finden ist es hier: calcelestial.

Das neue Tool besitzt eine Reihe weiterer nützlicher Funktionen:

Terminal window
$ sun
usage: sun mode [options]
mode is one of: rise, set, noon, daytime, nighttime
following OPTIONS are available
-t, --twilight use special twilight (nautic|civil|astro)
-d, --date calculcate for specified date (eg. 2011-12-25)
-f, --format output format (eg. %H:%M:%S)
-a, --lat geographical latitude (-90° to 90°)
-o, --lon geographical longitude (-180° to 180°)
-q, --query query geonames.org for geographical position
-z, --zone use timezone for output
-h, --help show this help
-v, --version show version
A combination of --lat, --lon or --query is required!

Die einfachste Variante nutzt das Unix Tool at:

Terminal window
echo ~/bin/enable-lightning | at $(sun set -q Frankfurt -t civil)

Mit folgenden Cronjobs, lässt sich dieses Prinzip auch leicht auf andere Anwendungen übertragen:

0 0 * * * echo 'fnctl stop && fnctl fade -c 000000' | at $(sun rise -q Aachen)
0 0 * * * echo 'fnctl start' | at $(sun set -q Frankfurt)

Mit dem Tool nvram-wakeup, lässt sich so beispielsweise der Rechner jeden Tag 10 Minuten for Sonnenaufgang automatisch starten:

Terminal window
nvram-wakeup -s $(date -d "-10min $(sun rise -q Berlin)" +%s)

Oder möchtest du deinen Rechner nach Sonnenuntergang automatisch herunterfahren?

Terminal window
shutdown $(date -d +10min $(src/sun set --lat=50.55 --lon=-6.2) +%H:%M)

HIDeKey

HIDeKey USB Security Token
HIDeKey USB Security Token.

Als Abschlussprojekt und Vorbereitung auf meine Betreuer Tätigkeit für die Mikrocontroller-AG des MMI’s habe ich mich näher mit dem USB-Bus und dem darauf aufbauenden HID-Protokoll befasst.

HIDeKey ist ein kleiner USB-Stick, der als HID-Tastatur vom Rechner erkannt wird und beliebge Zeichenketten und Tastenkombinationen an den Host-Rechner senden kann.

Mein Ziel war es ein kleinen Hardware-Dongle zu entwickeln welcher Passwörter, TANs und Onetime-Tokens direkt an jeden beliebigen Rechner senden kann. Meine Passwörter sind im verschlüsselt EEPROM des Mikrocontrollers gespeichert. Beim Drücken, des Tasters auf dem Stick, wird das Passwort eingegeben.

Als Hardware nutze ich die zuvor vorgestellten USBasp Programmieradapter aus China, deren Firmware ich durch eine eigene ersetzt habe. Mit einem zusätzlichen Taster lässt sich so über ein kleines Menü zwischen 10 User-Passwort-Kombination wählen.

Neue Passwörter können mit einem kleinen Konsolen-Programm direkt über den Rechner einprogrammiert werden.

HIDeKey soll auch zur Generierung von One Time Passwords (OTP) genutzt werden können. Da er sich wie ein gewöhnliche USB-Tastatur verhält, kann er auch unterwegs am Schlüsselbund in Internet-Cafes und Rechner-Pools genutzt werden.

Quelltext und Schaltpläne gibt auf Codeberg: /stv0g/hidekey .

In meinem Wiki ist auch noch etwas Dokumentation gesammelt.

HIDeKey ist wie die meisten meiner Projekte als OpenSource veröffentlicht. Ich freue mich über jede Verbesserung, Erweiterung oder andere Beiträge zu diesem Projekt 😊.

transcode

Digital Logic Diagram
Assembler code

Ich sitze im Zug nach Hause. Gerade komme ich von der letzten Vorlesung des zweiten Semesters: Informatik. Eigentlich bin ich auf dem Weg in die Semester-”Ferien”, ständen da nicht für den nächsten Monat noch 4 Klausuren in meinem Kalender 😉.

Informatik, Grundlagen des Digitalrechners. Klingt eigentlich recht trocken. Trotzdem ist es klar mein Favorit unter den Fächern dieses Semesters. Als Ergänzung zur Vorlesung richtete unser Professor einen kleinen Wettbewerb aus. Mein Beitrag zum Students Englightment Award ist ein Compiler Frontend für den GNU Compiler der Atmel AVRs.

Teil der Vorlesung war die Einführung des Mikrocontrollers ATMega8 von Atmel und dessen Programmierung mit Assembler. Dabei lernten wir zuerst die Schaltungstechnischen Grundlagen und die Minimierung von Schaltnetzen. Anschließend sind wir auf den Aufbau der Zentralen Recheneinheit eingegangen (Steuerwerk, ALU).

transcode kompiliert & assembliert ANSI C und Assembler in Maschinencode und umgekehrt. Dabei wird mit Hilfe von Debugging Informationen ein Bezug zwischen Zeilen im C-Code und den Mnemonics hergestellt. Durch Auswählen von Zeilen werden Bezüge direkt durch Hervorhebungen dargestellt. Für die Darstellung des Maschinencodes lässt sich zwischen binär, dezimal & hexadezimaler Form wählen.

transcode

Digital Logic Diagram
Assembler code

Ich sitze im Zug nach Hause. Gerade komme ich von der letzten Vorlesung des zweiten Semesters: Informatik. Eigentlich bin ich auf dem Weg in die Semester-”Ferien”, ständen da nicht für den nächsten Monat noch 4 Klausuren in meinem Kalender 😉.

Informatik, Grundlagen des Digitalrechners. Klingt eigentlich recht trocken. Trotzdem ist es klar mein Favorit unter den Fächern dieses Semesters. Als Ergänzung zur Vorlesung richtete unser Professor einen kleinen Wettbewerb aus. Mein Beitrag zum Students Englightment Award ist ein Compiler Frontend für den GNU Compiler der Atmel AVRs.

Teil der Vorlesung war die Einführung des Mikrocontrollers ATMega8 von Atmel und dessen Programmierung mit Assembler. Dabei lernten wir zuerst die Schaltungstechnischen Grundlagen und die Minimierung von Schaltnetzen. Anschließend sind wir auf den Aufbau der Zentralen Recheneinheit eingegangen (Steuerwerk, ALU).

transcode kompiliert & assembliert ANSI C und Assembler in Maschinencode und umgekehrt. Dabei wird mit Hilfe von Debugging Informationen ein Bezug zwischen Zeilen im C-Code und den Mnemonics hergestellt. Durch Auswählen von Zeilen werden Bezüge direkt durch Hervorhebungen dargestellt. Für die Darstellung des Maschinencodes lässt sich zwischen binär, dezimal & hexadezimaler Form wählen.

volkszaehler.org Zählerbox

Die volkszaehler.org Zählerbox
Die volkszaehler.org Zählerbox.

Das volkszaehler.org Projekt nähert sich mit großen Schritten seiner ersten stabilen Version und damit dem ersten Release.

Ich möchte hier nur einen kurzen Überblick über den aktuellen Stand geben. Du kennst das Projekt noch gar nicht? Weiß nicht was Smart-Meter sind? Da steigst du besser auf unsere Projekt Website ein!

Für die Entwicklung am Projekt habe ich mir eine kleine Hutschienenbox gebaut. Sie eignet sich perfekt für den mobilen Einsatz und zum Testen neuer Firmware und Funktionen. Mal schnell den Verbrauch des eigenen Kühlschranks zu erfassen ist kein Problem. Derzeit ist mein Schreibtisch an die Box angeschlossen und liefert so aktuelle Daten für die Demo Installation des Projektes.

Die Box enthält folgende Komponenten:

  • ~230V Eingang über Kaltgerätestecker (geerdet, max. 10 Ampere)
  • ~230V Ausgang über Schukostecker (geerdet, max. 16 Ampere)
  • Sicherungsautomat (Ein-/Ausschalter)
  • B&G E-Tech DRS-154D S0-Zähler (einphasig, 2000 Impulse/kWh)
  • Udo’s S0-Server (basierend auf Atmel AVR’s & ethersex, 10 Mbit/s Ethernet, TFTP Bootloader)
  • Knopf zum manuellen Triggern von Impulsen
  • externer Anschluss von Zählern

Conway's Game of Life

Conway's Game of Life Screenshot
Conway's Game of Life Screenshot.

Als Übung für meine Informatik Vorlesung an der RWTH Aachen habe ich diese C Implementation von Conways Game of Life geschrieben.

Dieses simple “zero player” Game wird komplett im Terminal ausgeführt. Mit Mausunterstützung und Farben wurden mit libncurses realisiert.

Den Quelltext findet ihr inklusive eines Makefiles auf Codeberg: /stv0g/rwth-info1/src/conway.c .

  • p” pausiert das Spiel
  • q” beendet das Spiel
  • c” leert das Spielfeld
  • Leertaste setzt eine neue Zelle in das aktuelle Feld
  • Pfeiltasten bewegen den Cursor
  • Maus kann zum Bewegen des Cursors genutzt werden
  • 0” fügt ein chaotisches Anfangsmuster ein
  • 1” fügt einen Glider in das Spielfeld ein
  • 2” fügt einen Segler in das Spielfeld ein
  • 3” fügt einen Buffer in das Spielfeld ein
  • +” erhöht die Anzahl der Generationen pro Sekunde (frames per second)
  • -” erniedrigt die Anzahl der Generationen pro Sekunde (frames per second)

fnordlicht VU Meter

Last time, I presented some code for visualizing your power consumption using the Fnordlicht modules. Today, we continue the journey in a similar direction: I’ve written a small C program to control the modules according to the current audio volume.

The software monitors the audio signal of my system (Ubuntu 10.10 with Pulseaudio). So you can dance to everything that can play audio 😄…

Update: As preparation for an upcoming exam, I added a Discrete Fourier Analysis (DFT). Unfortunately, the serial bus is to slow to visualize the audio spectrogram in real time . The bars are colored with their complex phase->hue (HSV) equivalent.

fnordlicht FFT Visualization
fnordlicht FFT Visualization.

The software uses libfn a C-library for controlling fnordlichts and is available at Codeberg: /stv0g/libfn/src/fnvum.c .

Ich benutze PulseAudio um mich in die Soundkarte des Systems einzuklinken. Das Programm tarnt sich als Recording-Tool. Und kann dadurch den kompletten Audio-Output oder nur bestimmte Programme visualisieren. Sogar das Mikrofon kann ich benutzen 😜.

PulseAudio liefert mir einen einfachen PCM Stream (44,1kHz Samplingrate, Mono & 16-Bit signed Integers). Derzeit addiere ich immer nur x Werte dieses Byte Streams und mittele diese Summe dann über einen kurzen Zeitraum.

Geplant ist noch eine FFT-Analyse um die Amplituden verschiedener Frequenzen gemäß der “Ohrkurve”, der Empfindlichkeit des menschlichen Gehörs, gewichten zu können. Der Schritt zur Spektral Darstellung (jedes meiner 10 fnordlichter als VU-Meter für ein bestimmtes Frequenzband) ist dann hoffentlich auch nicht mehr so weit.

Ohrkurve
Ohrkurve.

Visualize your Power Consumption with fnordlicht LED Modules

fnordlicht Power Consumption Visualizer

Gerade zurückgekommen vom elektro:camp(<<2010>>) aus Kaiserslautern, blogge ich heute über mein neustes Spielzeug: zehn fnordlichtmini’s.

Vor ein paar Wochen bin ich auf das Projekt von Alexander Neumann aufmerksam geworden, um den Eingang neuer Mails, Nachrichten und meinen Stromverbrauch darzustellen. Meine 10 Module waren schnell aufgebaut. Sie bestehen aus je 3x3 LED’s (RGB) und einem ATMega8 Mikrocontroller, der die PWM-Ansteuerung und die Kommunikation über einen seriellen Bus übernimmt.

Leider gab es bisher nur kein in Ruby geschriebenen Code zum Testen der Ansteuerung der Lichter über einen Rechner ( /fd0/fnordlicht/tests ). Daher ergriff ich die Gelegenheit und schrieb eine kleine C++-Bibliothek zur Ansteuerung der fnordlicht Module über die serielle Schnittstelle. Die Bibliothek sowie ein Beispiel-Programm für die Linux-Konsole gibt es auf Codeberg: /stv0g/libfn .

Mit der Ethernet-RS232 Bridge von ethersex (Y-Port) konnte ich sogar die Ansteuerung über das Internet testen. Dies wird auch von der Library unterstützt.

/_astro/IMG_3749.B-334MuJ.jpg /_astro/IMG_3754.Bzfs4Xvn.jpg /_astro/IMG_3756.CHWvRnKD.jpg /_astro/IMG_3760.M_alROZc.jpg /_astro/IMG_3765.C_mUVNnl.jpg /_astro/IMG_3766.Z-Mb1uBh.jpg /_astro/IMG_3770.BDw74amh.jpg

UNI-TREND UT61E Digital Multimeter

Der Testaufbau
Der Testaufbau.

Seit ein paar Wochen habe ich schon nun mein neues Multimeter: ein UT61E von UNI-TREND. Bisher bin ich rundum zufrieden damit. Gekauft habe ich es über das Internet bei Pinsonne-Elektronik. Lieferung und Bezahlung verlief schnell und problemlos. Den Laden kann ich also nur weiterempfehlen.

Ein besonderes Highlight der neuen Messgeräte ist die RS232 Schnittstelle für die Auswertung am Rechner. Über diese per Optokopler isolierte Schnittstelle ist es möglich in aktuelle Messergebnisse am Rechner auszuwerten und weiter zu verarbeiten.

Leider haben die in China ansässigen Hersteller die Linux-Gemeinde aber mal wieder vergessen. Nach einigen Recherchen und etlichen Stunden später habe ich es dann jedoch geschafft ein kleines Tool für Linux zu entwickeln, welches mir die Messergebnisse im CSV Format liefert. In diesem Format kann ich sie nun in Open Office, MatLab und vielen anderen Programmen öffnen und auswerten.

Als besonderes Gimmick habe ich auch noch ein kleines Script geschrieben, das mit Hilfe gnuplot Graphen der Messergebnisse zeichnet. Diese werden dann 1-2 in der Sekunde aktualisiert. Mit einem Oszilloskop ist das jedoch lange noch nicht vergleichbar. Aber für Langzeit-Messungen durchaus sehr praktisch.

Die Live-Darstellung der Messergebnisse mit gnuplot
Die Live-Darstellung der Messergebnisse mit gnuplot.

Ich bedanke mich bei Henrik Haftmann für die detaillierte Beschreibung des Protokolls, welche mir beim Entwickeln dieses Tools unheimlich geholfen hat.

Update: Ich habe das Datenblatt es verwendeten IC’s gefunden. Es enthält auch eine Spezifikation des serielle Protokolls. Hier geht es zum neuen Eintrag mit Bildern des Chips und der restlichen Platine.

Das Tool sowie das gnuplot Script habe ich hier in einem Archiv zusammengefasst:

Download:dmmut61e-0.01.tar.gz (C++ Quelltext + gnuplot Script)

Die Installation ist sicherlich nicht die einfachste. Aber die nötigen Kenntnisse setzte ich bei dieser Zielgruppe einfach mal voraus 😜.

Anregungen, Patches und Bug Reports sind per Mail immer willkommen.

Hier noch ein kleines Beispiel wie die Daten von meinem Tool ausgegeben werden. Für das Verständnis hilft sicherlich ein Blick in den Quelltext.

1;0.0589;0.0589;0;0.0589;V;AC;Manual
2;0.07184;0.07184;0;0.06537;V;AC;Manual
3;0.12869;0.12869;0;0.0864767;V;AC;Manual
4;0.07876;0.12869;0;0.0845475;V;AC;Manual
5;0.06458;0.12869;0;0.080554;V;AC;Manual
6;0.09626;0.12869;0;0.0831717;V;AC;Manual
7;0.17355;0.17355;0;0.0960829;V;AC;Manual
8;0.17487;0.17487;0;0.105931;V;AC;Manual
9;0.13565;0.17487;0;0.109233;V;AC;Manual
10;0.10726;0.17487;0;0.109036;V;AC;Manual
11;0.16506;0.17487;0;0.114129;V;AC;Manual
12;0.14415;0.17487;0;0.116631;V;AC;Manual
13;0.15238;0.17487;0;0.119381;V;AC;Manual
14;0.17396;0.17487;0;0.123279;V;AC;Manual
15;0.11834;0.17487;0;0.12295;V;AC;Manual
16;0.2117;0.2117;0;0.128497;V;AC;Manual
17;0.18906;0.2117;0;0.132059;V;AC;Manual
18;0.17674;0.2117;0;0.134542;V;AC;Manual
19;0.08354;0.2117;0;0.131857;V;AC;Manual
20;0.053;0.2117;0;0.127915;V;AC;Manual
21;0.0688;0.2117;0;0.1251;V;AC;Manual
22;0.12796;0.2117;0;0.12523;V;AC;Manual
23;0.14954;0.2117;0;0.126287;V;AC;Manual
24;0.17535;0.2117;0;0.128331;V;AC;Manual
25;0.1381;0.2117;0;0.128722;V;AC;Manual
26;0.1588;0.2117;0;0.129878;V;AC;Manual
27;0.13258;0.2117;0;0.129979;V;AC;Manual
28;0.097;0.2117;0;0.128801;V;AC;Manual
29;0.04637;0.2117;0;0.125958;V;AC;Manual
30;0.06749;0.2117;0;0.124009;V;AC;Manual
31;0.09002;0.2117;0;0.122913;V;AC;Manual
32;0.07575;0.2117;0;0.121439;V;AC;Manual
33;0.0711;0.2117;0;0.119914;V;AC;Manual

Das n-Damen Problem

Für meine morgige Informatik-Klausur habe ich mich mal wieder an C++ gewagt um einen Algorithmus zu implementieren. Die Hauptthemen der Klausur werden das n-Dame Problem und das Josephus Problem sein.

JS, PHP & CSS Frontend
JS, PHP & CSS Frontend.

Für das n-Damen-Problem habe ich eine iterative Backtracking-Implementation in C++ geschrieben. Zudem ist es auch mein erstes funktionsfähiges und komplexeres C++ Programm 😉.

Um euch meine Ergebnisse zeigen zu können, habe ich mich bei der PHP, JS & CSS Version meines Freundes Micha bedient und sie leicht angepasst.

Das PHP-Script ruft über den Backtick-Operator das C++ Programm auf und stellt es anschließen mit JS und CSS dar.

Um den Server zu schonen habe ich die maximale Feldgröße auf 13 beschränkt. Das sind zu mindestens schon mal fünf Damen mehr als bei der PHP-Version.

Ohne die Beschränkung sind auch Problemgrößen bis 16 in einem angemessenen Zeitrahmen zu bewältigen. An den Weltrekord (25 Damen) komme ich jedoch noch nicht 😉.

Den Quellcode des C++ Programms findet ihr auf Codeberg: /stv0g/snippets/c++/ndame