tatzemax Geschrieben December 23, 2013 at 20:17 Geschrieben December 23, 2013 at 20:17 Hallo, bin Frischling bei der C++ Programmierung Ich habe vor das 7 Segment-display als Uhr zu nutzen, habe da auch schon Erfolge zu verzeichen, allerdings weiß ich nicht wie ich die Schleife zeitlich pausiern lassen kann des weitern hatte ich vor dass duch die eingabe von "a" das Programm/die Schleife beendet wird, klappt auch aber die schleife wird erst wiederholt wenn enter gedrückt wird, sollte sich aber wiederholen. #include <stdio.h> #include <time.h> #include "ip_connection.h" #include "bricklet_segment_display_4x7.h" #define HOST "localhost" #define PORT 4223 const uint8_t digits[] = {0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; // 0~9,A,b,C,d,E,F int main(void) { // Create IP connection IPConnection ipcon; ipcon_create(&ipcon); // Create device object SegmentDisplay4x7 sd4x7; segment_display_4x7_create(&sd4x7, "iX8", &ipcon); // Connect to brickd if(ipcon_connect(&ipcon, HOST, PORT) < 0) { fprintf(stderr, "Could not connect\n"); exit(1); } while(getchar()!='a') { struct tm *newtime; time_t long_time; time( &long_time ); newtime = localtime( &long_time ); int stunde = newtime->tm_hour; int minute = newtime->tm_min; //Befehl an die Anzeige senden uint8_t segments[4] = {digits[stunde/10], digits[stunde%10], digits[minute/10], digits[minute%10]}; segment_display_4x7_set_segments(&sd4x7, segments, 1, true); } ipcon_destroy(&ipcon); // Calls ipcon_disconnect internally } Zitieren
remotecontrol Geschrieben December 23, 2013 at 20:35 Geschrieben December 23, 2013 at 20:35 Wenn ich das richtig sehe, dürfte sich Deine Anzeige derzeit nur aktualisieren, wenn Du ENTER drückst - korrekt? getchar() liest stdin immer "buffered", d. h. die Anwendung bekommt immer nur eine ganze Zeile, die dann zeichenweise gelesen werden kann. Um das zu umgehen musst Du stdin in einen unbuffered mode versetzen und dann kannst Du prüfen, ob überhaupt ein Zeichen getippt wurde, siehe z:b. http://stackoverflow.com/questions/5616092/non-blocking-call-for-reading-descriptor. Zum warten gibt es z. B. usleep oder besser noch die C++ Varianten davon, siehe z: B. http://stackoverflow.com/questions/4184468/sleep-for-milliseconds. Du könntest also immer etwas warten, prüfen ob eine Taste gedrückt wurde und die Anzeige aktualisieren. Alternativ geht es nur mit 2 Threads (dann wird es aber auch gleich komplizierter): einer wartet auf Tastatureingabe, die kann dann auch gepuffert sein, und der andere aktualisiert die Anzeige. Die Threads müssen sich dann aber noch synchronisieren ... Zitieren
tatzemax Geschrieben December 23, 2013 at 20:39 Autor Geschrieben December 23, 2013 at 20:39 Ja ist korrekt aktualisiert nur beim drücken von Enter. Sollte halt nach möglichkeit selbst aktualisieren. Gibt es ein besser Möglichkeit die Schleife zu beenden?? Danke für deine schnelle Antwort. Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.