Advertisement
y2kbug

waveclock

Dec 4th, 2015
335
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.37 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <bcm2835.h>
  5. #include <signal.h>
  6. #include <time.h>
  7.  
  8. #define PIN RPI_V2_GPIO_P1_07
  9.  
  10. void gen_pulse(int ms)
  11. {
  12.     int len = ms * 40 + 1;
  13.     while (len--)
  14.     {
  15.         bcm2835_gpio_write(PIN, HIGH);
  16.         bcm2835_delayMicroseconds(12);
  17.         bcm2835_gpio_write(PIN, LOW);
  18.         bcm2835_delayMicroseconds(12);
  19.     }
  20. }
  21.  
  22. void transmit_timecode(int *send_data)
  23. {
  24.     int i;
  25.    
  26.     for( i = 0; i < 60; i++ ) {
  27.         switch( send_data[i] ) {
  28.            
  29.             case -1:    // マーカー
  30.                 gen_pulse(200);
  31.                 bcm2835_delayMicroseconds(800 * 1000);
  32.                 break;
  33.            
  34.             case 1:     // 1
  35.                 gen_pulse(500);
  36.                 bcm2835_delayMicroseconds(500 * 1000);
  37.                 break;
  38.            
  39.             case 0:
  40.                 gen_pulse(800);
  41.                 bcm2835_delayMicroseconds(200 * 1000);
  42.                 break;
  43.         }
  44.     }
  45. }
  46.  
  47.  
  48. void wait_for_next_minute()
  49. {
  50.     struct timeval tv;
  51.     time_t jt;
  52.     struct tm *tmt;
  53.     suseconds_t usec;
  54.    
  55.     gettimeofday(&tv,NULL);
  56.     usec = (suseconds_t)1000000 - (tv.tv_usec % 1000000);
  57.     fprintf(stdout , "wait for next second, %u usec\n",  usec );
  58.     usleep(usec);
  59.    
  60.     jt = time(NULL);
  61.     tmt = localtime(&jt);
  62.     usec = (60 - tmt->tm_sec) * 1000 * 1000;
  63.     fprintf(stdout , "wait for next minute, %u usec\n",  usec );
  64.     usleep(usec);
  65. }
  66.  
  67. void signal_handler(int sig)
  68. {
  69.     bcm2835_gpio_write(PIN, LOW);
  70.     exit(0);
  71. }
  72.  
  73. int main(int argc, char *argv[])
  74. {
  75.     int i;
  76.     int f_daemon = 0;
  77.    
  78.     if( bcm2835_init() < 0 ) {
  79.         fprintf( stderr, "could not initialize bcm2835\n" );
  80.     }
  81.    
  82.     bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_OUTP);
  83.    
  84.     /* options */
  85.     if( argc > 1 ) {
  86.         for( i = 1; i < argc; i++ ) {
  87.             char *param = argv[i];
  88.            
  89.             if( strcmp( param, "-d" ) == 0 ) f_daemon = 1;
  90.             else if( strcmp( param, "-h" ) == 0 ) {
  91.                 fprintf( stderr, "Usage %s [OPTION]\n"
  92.                                  "OPTIONS are follows\n"
  93.                                  "  -d   daemonize\n"
  94.                                  "  -h   display this text and exit\n", argv[0] );
  95.                 exit(0);
  96.             }
  97.         }
  98.     }
  99.    
  100.     /* signal handle */
  101.     signal( SIGKILL, signal_handler );
  102.     signal( SIGTERM, signal_handler );
  103.     signal( SIGINT, signal_handler );
  104.    
  105.     if( f_daemon ) daemon( 0, 0 );
  106.    
  107.     while (1) {
  108.         int t;
  109.         time_t jt;
  110.         struct tm *tmt;
  111.         int send_data[60];
  112.        
  113.         wait_for_next_minute();
  114.        
  115.         jt = time(NULL);
  116.         tmt = localtime(&jt);
  117.         fprintf(stdout, "Current time: %04d/%02d/%02d %02d:%02d:%02d\n",
  118.                          tmt->tm_year + 1900, tmt->tm_mon+1, tmt->tm_mday,
  119.                          tmt->tm_hour, tmt->tm_min, tmt->tm_sec);
  120.  
  121.         // マーカー
  122.         send_data[0] = -1;
  123.        
  124.         // 分の10の位
  125.         t = tmt->tm_min / 10;
  126.         send_data[1] = t & 4 ? 1 : 0;
  127.         send_data[2] = t & 2 ? 1 : 0;
  128.         send_data[3] = t & 1 ? 1 : 0;
  129.         send_data[4] = 0;
  130.        
  131.         // 分の1の位
  132.         t = tmt->tm_min - t * 10;
  133.         send_data[5] = t & 8 ? 1 : 0;
  134.         send_data[6] = t & 4 ? 1 : 0;
  135.         send_data[7] = t & 2 ? 1 : 0;
  136.         send_data[8] = t & 1 ? 1 : 0;
  137.    
  138.         // マーカー
  139.         send_data[9] = -1;
  140.         send_data[10] = 0;
  141.         send_data[11] = 0;
  142.        
  143.         // 時の10の位
  144.         t = tmt->tm_hour / 10;
  145.         send_data[12] = t & 2 ? 1 : 0;
  146.         send_data[13] = t & 1 ? 1 : 0;
  147.        
  148.         send_data[14] = 0;
  149.  
  150.         // 時の1の位
  151.         t = tmt->tm_hour - t * 10;
  152.         send_data[15] = t & 8 ? 1 : 0;
  153.         send_data[16] = t & 4 ? 1 : 0;
  154.         send_data[17] = t & 2 ? 1 : 0;
  155.         send_data[18] = t & 1 ? 1 : 0;
  156.    
  157.         // マーカー
  158.         send_data[19] = -1;
  159.        
  160.         send_data[20] = 0;
  161.         send_data[21] = 0;
  162.        
  163.         // 1月1日の経過年100の位
  164.         t = (tmt->tm_yday + 1) / 100;
  165.         send_data[22] = t & 2 ? 1 : 0;
  166.         send_data[23] = t & 1 ? 1 : 0;
  167.    
  168.         send_data[24] = 0;
  169.    
  170.         // 1月1日の経過年10の位
  171.         t = (tmt->tm_yday + 1) / 10 - t * 10;
  172.         send_data[25] = t & 8 ? 1 : 0;
  173.         send_data[26] = t & 4 ? 1 : 0;
  174.         send_data[27] = t & 2 ? 1 : 0;
  175.         send_data[28] = t & 1 ? 1 : 0;
  176.    
  177.         // マーカー
  178.         send_data[29] = -1;
  179.    
  180.         // 1月1日の経過年1の位
  181.         t = (tmt->tm_yday + 1) % 100 - t * 10;
  182.         send_data[30] = t & 8 ? 1 : 0;
  183.         send_data[31] = t & 4 ? 1 : 0;
  184.         send_data[32] = t & 2 ? 1 : 0;
  185.         send_data[33] = t & 1 ? 1 : 0;
  186.  
  187.         send_data[34] = 0;
  188.         send_data[35] = 0;
  189.        
  190.         // チェックサム
  191.         t = 0;
  192.         for(i = 12 ;i < 19 ; i++) {
  193.             t += send_data[i] == 1 ? 1 : 0;
  194.         }
  195.         send_data[36]= t & 1;
  196.        
  197.         // チェックサム
  198.         t = 0;
  199.         for (i = 1 ; i < 9 ; i++) {
  200.             t += send_data[i] == 1 ? 1 : 0;
  201.         }
  202.         send_data[37]= t & 1;
  203.    
  204.         send_data[38] = 0;
  205.        
  206.         // マーカー
  207.         send_data[39] = -1;
  208.         send_data[40] = 0;
  209.    
  210.         // 年の10の位
  211.         t = (tmt->tm_year % 100) / 10;
  212.         send_data[41]= t & 8 ? 1 : 0;
  213.         send_data[42]= t & 4 ? 1 : 0;
  214.         send_data[43]= t & 2 ? 1 : 0;
  215.         send_data[44]= t & 1 ? 1 : 0;
  216.        
  217.         // 年の1の位
  218.         t = (tmt->tm_year % 100 ) - t * 10;
  219.         send_data[45] = t & 8 ? 1 : 0;
  220.         send_data[46] = t & 4 ? 1 : 0;
  221.         send_data[47] = t & 2 ? 1 : 0;
  222.         send_data[48] = t & 1 ? 1 : 0;
  223.        
  224.         // マーカー
  225.         send_data[49] = -1;
  226.  
  227.         // 週(曜日)
  228.         t = tmt->tm_wday;
  229.         send_data[50] = t & 4 ? 1 : 0;
  230.         send_data[51] = t & 2 ? 1 : 0;
  231.         send_data[52] = t & 1 ? 1 : 0;
  232.        
  233.         send_data[53] = 0;
  234.         send_data[54] = 0;
  235.        
  236.         send_data[55] = 0;
  237.         send_data[56] = 0;
  238.         send_data[57] = 0;
  239.         send_data[58] = 0;
  240.        
  241.         // マーカー
  242.         send_data[59] = -1;
  243.    
  244.         transmit_timecode(send_data);
  245.     }
  246. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement