/* * clock.c: * Demo of the 128x64 graphics based LCD driver. * This is designed to drive the parallel interface LCD drivers * based on the popular 12864H controller chip. * * This test program assumes the following: * (Which is currently hard-wired into the driver) * * GPIO 0-7 is connected to display data pins 0-7. * GPIO 10 is CS1 * GPIO 11 is CS2 * GPIO 12 is STROBE * GPIO 10 is RS * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://github.com/WiringPi/WiringPi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #include #include #include #include #include #include #include #ifndef TRUE # define TRUE (1==1) # define FALSE (1==2) #endif double clockRadius ; double thickness, barLen ; int maxX, maxY ; double rads (double degs) { return degs * M_PI / 180.0 ; } void drawClockHands (void) { time_t t ; struct tm *now ; double angle, p, x0, y0, x1, y1 ; int h24, h, m, s ; char text [20] ; time (&t) ; now = localtime (&t) ; h24 = now->tm_hour ; m = now->tm_min ; s = now->tm_sec ; h = h24 ; if (h > 12) h -= 12 ; // Hour hand angle = h * 30 + m * 0.5 ; x0 = sin (rads (angle)) * (clockRadius * 0.75) ; y0 = cos (rads (angle)) * (clockRadius * 0.75) ; for (p = -3.0 ; p <= 3.0 ; p += 0.2) { x1 = sin (rads (angle + p)) * (clockRadius * 0.7) ; y1 = cos (rads (angle + p)) * (clockRadius * 0.7) ; lcd128x64line (0, 0, x1, y1, 1) ; lcd128x64lineTo (x0, y0, 1) ; } // Minute hand angle = m * 6 ; x0 = sin (rads (angle)) * (clockRadius * 0.9) ; y0 = cos (rads (angle)) * (clockRadius * 0.9) ; for (p = -1.0 ; p <= 1.0 ; p += 0.2) { x1 = sin (rads (angle + p)) * (clockRadius * 0.85) ; y1 = cos (rads (angle + p)) * (clockRadius * 0.85) ; lcd128x64line (0, 0, x1, y1, 1) ; lcd128x64lineTo (x0, y0, 1) ; } // Second hand angle = s * 6 ; x0 = sin (rads (angle)) * (clockRadius * 0.2) ; y0 = cos (rads (angle)) * (clockRadius * 0.2) ; x1 = sin (rads (angle)) * (clockRadius * 0.95) ; y1 = cos (rads (angle)) * (clockRadius * 0.95) ; lcd128x64line (0 - x0, 0 - y0, x1, y1, 1) ; lcd128x64circle (0, 0, clockRadius * 0.1, 0, 1) ; lcd128x64circle (0, 0, clockRadius * 0.05, 1, 1) ; // Text: sprintf (text, "%02d:%02d:%02d", h24, m, s) ; lcd128x64puts (32, 24, text, 0, 1) ; sprintf (text, "%2d/%2d/%2d", now->tm_mday, now->tm_mon + 1, now->tm_year - 100) ; lcd128x64puts (32, -23, text, 0, 1) ; } void drawClockFace (void) { int m ; double d, px1, py1, px2, py2 ; lcd128x64clear (0) ; lcd128x64circle (0,0, clockRadius, 1, TRUE) ; lcd128x64circle (0,0, clockRadius - thickness, 0, TRUE) ; // The four big indicators for 12,15,30 and 45 lcd128x64rectangle (- 3, clockRadius - barLen, 3, clockRadius, 1, TRUE) ; // 12 lcd128x64rectangle (clockRadius - barLen, 3, clockRadius, -3, 1, TRUE) ; // 3 lcd128x64rectangle (- 3, -clockRadius + barLen, 3, -clockRadius, 1, TRUE) ; // 6 lcd128x64rectangle (-clockRadius + barLen, 3, -clockRadius, -3, 1, TRUE) ; // 9 // Smaller 5 and 1 minute ticks for (m = 0 ; m < 60 ; ++m) { px1 = sin (rads (m * 6)) * clockRadius ; py1 = cos (rads (m * 6)) * clockRadius ; if ((m % 5) == 0) d = barLen ; else d = barLen / 2.0 ; px2 = sin (rads (m * 6)) * (clockRadius - d) ; py2 = cos (rads (m * 6)) * (clockRadius - d) ; lcd128x64line (px1, py1, px2, py2, 1) ; } } void setup (void) { lcd128x64getScreenSize (&maxX, &maxY) ; clockRadius = maxY / 2 - 1 ; thickness = maxX / 48 ; barLen = thickness * 4 ; lcd128x64setOrigin (32, 32) ; } /* *********************************************************************** * The main program *********************************************************************** */ int main (int argc, char *argv []) { time_t now ; wiringPiSetup () ; lcd128x64setup () ; setup () ; for (;;) { drawClockFace () ; drawClockHands () ; lcd128x64update () ; now = time (NULL) ; while (time (NULL) == now) delay (10) ; } return 0 ; }