#include "tc_system.h"
#include "logger.h"
#include "config.h"
#include "com_ttySx.h"
#include "ptimer.h"
#include "acrel_DJSF1352RN.h"
#include "ast_XH.h"
#include "modbus_TCP_HW.h"
#include "goose_HW.h"
#include "stm32f103.h"
#include "tc_tcu.h"
#include "tcXHHW.h"

// static int tcu_quit = 0;

// void sigint_handler(int sig)
// {
// 	tcu_quit = 1;
// }

// void parse_options(int argc, char** argv) 
// {
//     int c;

//     while ((c = getopt(argc, argv, "ct:")) != -1) {
//         switch (c) {
//         case 'c':
// 			config_filename = optarg;
//             break;
//         case 't':
//             // ttyS0_devname = optarg;
// 			break;
//         case '?':
//             break;
//         default:
//             exit(2);
//         }
//     }
// }


const char *months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
static char app_version[128] = {0};
char* formatAppVersion(void)
{
	int i;
	int month, mday, year, hour, min, sec;
    #define ASCII_CODE(x)  ((x)==32? 0:((x)-'0'))
    mday = ASCII_CODE(__DATE__[4])*10 + ASCII_CODE(__DATE__[5]);
    year = ASCII_CODE(__DATE__[7])*1000 + ASCII_CODE(__DATE__[8])*100 + ASCII_CODE(__DATE__[9])*10 + ASCII_CODE(__DATE__[10]);
    hour = ASCII_CODE(__TIME__[0])*10 + ASCII_CODE(__TIME__[1]);
    min  = ASCII_CODE(__TIME__[3])*10 + ASCII_CODE(__TIME__[4]);
    sec  = ASCII_CODE(__TIME__[6])*10 + ASCII_CODE(__TIME__[7]);
    #undef ASCII_CODE
  	for (i = 0; i < 12; i++)
  	{
    	if (strncmp(__DATE__, months[i], 3)==0)
    	{
      		month = i + 1;
     	 	break;
    	}
  	}

    snprintf(app_version, 128, "app_XHHW_V1R1-%04d%02d%02d %02d:%02d:%02d", year, month, mday, hour, min, sec);
    return app_version;
}

extern void rs232_test(int loop);

int main(int argc, char* argv[])
{
    signal(SIGPIPE, SIG_IGN);
    // signal(SIGINT, sigint_handler);
	// parse_options(argc, argv);

    clog_init("/home/root/log/tcu", CLOG_BUFF_SIZE*60*24, 30);
    tcu_BSP_init();
	tcu_config_init(config_filename);
    printf("\n\r\tSW:%s\n", formatAppVersion());

    clog_bind_serverip(tcu_config.xhlog_ip, tcu_config.xhlog_port);

    

    set_GUNLED_on(0, 0);
    set_GUNLED_on(1, 0);
    set_GUNLED_on(2, 0);
    set_GUNLED_on(3, 0);

    set_KMD_out(0, 0);
    set_KMD_out(1, 0);
    set_KMD_out(2, 0);
    set_KMD_out(3, 0);

    // for (;;)
    // {
    //     // rs232_test(10);

    //     set_SYSLED_on(0, 1);
    //     printf("\nget_TCUID:%4d, get_USERKEY:%d\n\n", get_TCUID(), get_USEKEY());

    //     printf("set_GUNLED_on(...)\n");
    //     set_GUNLED_on(0, 1);
    //     printf("set_GUNLED_on(0)\n"); getchar();
    //     set_GUNLED_on(1, 1);
    //     printf("set_GUNLED_on(1)\n"); getchar();
    //     set_GUNLED_on(2, 1);
    //     printf("set_GUNLED_on(2)\n"); getchar();
    //     set_GUNLED_on(3, 1);
    //     printf("set_GUNLED_on(3)\n"); getchar();

    //     set_SYSLED_on(0, 0);
    //     printf("set_GUNLED_off(ALL)...\n");
    //     set_GUNLED_on(0, 0);
    //     set_GUNLED_on(1, 0);
    //     set_GUNLED_on(2, 0);
    //     set_GUNLED_on(3, 0);
    //     printf("set_GUNLED_off(all) done.\n"); getchar();

    //     set_SYSLED_on(1, 1);
    //     printf("set_KMD_out(...)\n");
    //     set_KMD_out(0, 1);
    //     printf("set_KMD_out(0)\n");getchar();
    //     set_KMD_out(1, 1);
    //     printf("set_KMD_out(1)\n");getchar();
    //     set_KMD_out(2, 1);
    //     printf("set_KMD_out(2)\n");getchar();
    //     set_KMD_out(3, 1);
    //     printf("set_KMD_out(3)\n");getchar();

    //     printf("get_KMDFB:%d, %d, %d, %d\n", get_KMDFB(0), get_KMDFB(1), get_KMDFB(2), get_KMDFB(3));

    //     set_SYSLED_on(1, 0);
    //     printf("set_KMD_off(ALL)...\n");
    //     set_KMD_out(0, 0);
    //     set_KMD_out(1, 0);
    //     set_KMD_out(2, 0);
    //     set_KMD_out(3, 0);
    //     printf("set_KMD_off(ALL) done.\n");
    //     msleep(500);
    //     printf("get_KMDFB:%d, %d, %d, %d\n", get_KMDFB(0), get_KMDFB(1), get_KMDFB(2), get_KMDFB(3));
    //     getchar();

    // }


    ccu_TCU_init();
    ccu_TCU_run(0);
    ccu_TCU_exit();
    
    tcu_BSP_exit();
    tcu_config_exit();
    clog_exit();
	return 0;
}