
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

#include <wiringPi.h>
#include <string.h>

#define STOP_PIN	24

#define LED_A	16
#define LED_B	12
#define LED_C	13
#define LED_D	19
#define LED_E	26
#define LED_F	20
#define LED_G	21
#define LED_DP	6

#define LED2_A	8
#define LED2_B	25
#define LED2_C	11
#define LED2_D	0
#define LED2_E	5
#define LED2_F	7
#define LED2_G	1
#define LED2_DP	9

int g_disp_mode = 1 ;

static int one_onoff[8] = {1, 0, 0, 1, 1, 1, 1, 1} ;
static int two_onoff[8] = {0, 0, 1, 0, 0, 1, 0, 1} ;
static int three_onoff[8] = {0, 0, 0, 0, 1, 1, 0, 1} ;
static int four_onoff[8] = {1, 0, 0, 1, 1, 0, 0, 1} ;
static int five_onoff[8] = {0, 1, 0, 0, 1, 0, 0, 1} ;
static int six_onoff[8] = {0, 1, 0, 0, 0, 0, 0, 1} ;
static int seven_onoff[8] = {0, 0, 0, 1, 1, 1, 1, 1} ;
static int eight_onoff[8] = {0, 0, 0, 0, 0, 0, 0, 1} ;
static int nine_onoff[8] = {0, 0, 0, 0, 1, 0, 0, 1} ;
static int zero_onoff[8] = {0, 0, 0, 0, 0, 0, 1, 1} ;
static int clear_led[8] = {1, 1, 1, 1, 1, 1, 1, 1} ;

void led_onoff(int *onoff) {
	digitalWrite(LED_A, onoff[0]);
	digitalWrite(LED_B, onoff[1]);
	digitalWrite(LED_C, onoff[2]);
	digitalWrite(LED_D, onoff[3]);
	digitalWrite(LED_E, onoff[4]);
	digitalWrite(LED_F, onoff[5]);
	digitalWrite(LED_G, onoff[6]);

	if (g_disp_mode == 0 ) {
		digitalWrite(LED_DP, 0);
	} else {
		digitalWrite(LED_DP, 1); 
	}	

}

void led_onoff2(int *onoff) {
	digitalWrite(LED2_A, onoff[0]);
	digitalWrite(LED2_B, onoff[1]);
	digitalWrite(LED2_C, onoff[2]);
	digitalWrite(LED2_D, onoff[3]);
	digitalWrite(LED2_E, onoff[4]);
	digitalWrite(LED2_F, onoff[5]);
	digitalWrite(LED2_G, onoff[6]);

	digitalWrite(LED2_DP, 1);

}


void led_1_display(int value) {
	switch(value) {
		case 0 :
			led_onoff(&zero_onoff[0]) ; 
			break ;
			
		case 1 :
			led_onoff(&one_onoff[0]) ; 
			break ;
			
		case 2 :
			led_onoff(&two_onoff[0]) ; 
			break ;
			
		case 3 :
			led_onoff(&three_onoff[0]) ; 
			break ;

		case 4 :
			led_onoff(&four_onoff[0]) ; 
			break ;

		case 5 :
			led_onoff(&five_onoff[0]) ; 
			break ;

		case 6 :
			led_onoff(&six_onoff[0]) ; 
			break ;

		case 7 :
			led_onoff(&seven_onoff[0]) ; 
			break ;

		case 8 :
			led_onoff(&eight_onoff[0]) ; 
			break ;

		case 9 :
			led_onoff(&nine_onoff[0]) ; 
			break ;

		default :
			led_onoff(&clear_led[0]) ; 
			break ;
	}	
}	

void led_2_display(int value) {
	switch(value) {
		case 0 :
			led_onoff2(&zero_onoff[0]) ; 
			break ;
			
		case 1 :
			led_onoff2(&one_onoff[0]) ; 
			break ;
			
		case 2 :
			led_onoff2(&two_onoff[0]) ; 
			break ;
			
		case 3 :
			led_onoff2(&three_onoff[0]) ; 
			break ;

		case 4 :
			led_onoff2(&four_onoff[0]) ; 
			break ;

		case 5 :
			led_onoff2(&five_onoff[0]) ; 
			break ;

		case 6 :
			led_onoff2(&six_onoff[0]) ; 
			break ;

		case 7 :
			led_onoff2(&seven_onoff[0]) ; 
			break ;

		case 8 :
			led_onoff2(&eight_onoff[0]) ; 
			break ;

		case 9 :
			led_onoff2(&nine_onoff[0]) ; 
			break ;

		default :
			led_onoff2(&clear_led[0]) ; 
			break ;

	}	
}	

int init() {
	int i = 0 ;

	if (wiringPiSetupGpio() == -1) {
		return -1 ;
	}

	pinMode(STOP_PIN, INPUT) ;
	pullUpDnControl(STOP_PIN, PUD_UP) ;

	pinMode(LED_A, OUTPUT) ;
	pinMode(LED_B, OUTPUT) ;
	pinMode(LED_C, OUTPUT) ;
	pinMode(LED_D, OUTPUT) ;
	pinMode(LED_E, OUTPUT) ;
	pinMode(LED_F, OUTPUT) ;
	pinMode(LED_G, OUTPUT) ;
	pinMode(LED_DP, OUTPUT) ;

	pinMode(LED2_A, OUTPUT) ;
	pinMode(LED2_B, OUTPUT) ;
	pinMode(LED2_C, OUTPUT) ;
	pinMode(LED2_D, OUTPUT) ;
	pinMode(LED2_E, OUTPUT) ;
	pinMode(LED2_F, OUTPUT) ;
	pinMode(LED2_G, OUTPUT) ;
	pinMode(LED2_DP, OUTPUT) ;


	// 最初は点灯しない
	digitalWrite(LED_A, 1);
	digitalWrite(LED_B, 1);
	digitalWrite(LED_C, 1);
	digitalWrite(LED_D, 1);
	digitalWrite(LED_E, 1);
	digitalWrite(LED_F, 1);
	digitalWrite(LED_G, 1);
	digitalWrite(LED_DP, 1);
	
	digitalWrite(LED2_A, 1);
	digitalWrite(LED2_B, 1);
	digitalWrite(LED2_C, 1);
	digitalWrite(LED2_D, 1);
	digitalWrite(LED2_E, 1);
	digitalWrite(LED2_F, 1);
	digitalWrite(LED2_G, 1);
	digitalWrite(LED2_DP, 1);

	return 1 ;
}

int main(void) {
	int keta_1 = 0 ;
	int keta_2 = 0 ;
	int backsecond = 0 ;
	int lednumber = 0 ;

	if (init() == -1) {
		return 1 ;
	}

	time_t current ;
	struct tm* timer ;

	while(digitalRead(STOP_PIN) != 0) {

		current = time(NULL);
		timer = localtime(&current);

		if (backsecond != timer->tm_sec) {
			if (g_disp_mode) {
				g_disp_mode = 0 ;
			} else {
				g_disp_mode = 1 ;
			}

			backsecond = timer->tm_sec ;			
			
		}

		if (g_disp_mode == 0) {
			keta_2 = timer->tm_hour / 10 ;
			keta_1 = timer->tm_hour - keta_2 * 10 ;
		} else {
			keta_2 = timer->tm_min / 10 ;
			keta_1 = timer->tm_min - keta_2 * 10 ;
		}

		if (lednumber == 0) {
			led_1_display(keta_1) ;
			lednumber = 1 ;
		} else {
			led_2_display(keta_2) ;
			lednumber = 0 ;
		}
	}

	printf("Stop program !!\n") ;

	return 1 ;
}


