このフローチャートに従って、共有メモリに書き込むプログラムAのその部分 ↓

    while (1) { // 無限ループ
        if ((fp=popen("ntpq -c rv", "r"))==NULL) {
            string s = "N"; // ntpp -c rv 実行失敗時 N を共有メモリに書き込む
            sprintf(shared_memory, s.c_str());
        } else {
            fgets(str, 512, fp); // 一行読み込む
            ptr = strstr(str, "sync_ntp");
            if (ptr != NULL) {
                string s = "S"; // S を共有メモリに書き込む
                sprintf(shared_memory, s.c_str());
                sleep(16);
            } else {
                ptr = strstr(str, "sync_unspec");
                if (ptr != NULL) {
                    ptr = strstr(str, "no_sys_peer");
                    if (ptr != NULL) {
                        string s = "M"; // M を共有メモリに書き込む    
                        sprintf(shared_memory, s.c_str());
                    } else {
                        string s = "N"; // N を共有メモリに書き込む
                        sprintf(shared_memory, s.c_str());
                    }
                } else {
                    string s = "N"; // N を共有メモリに書き込む    
                    sprintf(shared_memory, s.c_str());
                }
            }
        }
        pclose(fp);
        sleep(1);
    }

 

プログラムAによって共有メモリに書き込まれた文字により、表示を変化させるラズパイ7桁時計のその部分 ↓

    static int segdata[22][8] = { // 7セグメントデータ
      // a  b  c  d  e  f  g  dp
	{H, H, H, H, H, H, L, L}, // 0
	{L, H, H, L, L, L, L, L}, // 1
	{H, H, L, H, H, L, H, L}, // 2
	{H, H, H, H, L, L, H, L}, // 3
	{L, H, H, L, L, H, H, L}, // 4
	{H, L, H, H, L, H, H, L}, // 5
	{H, L, H, H, H, H, H, L}, // 6
	{H, H, H, L, L, L, L, L}, // 7
	{H, H, H, H, H, H, H, L}, // 8
	{H, H, H, H, L, H, H, L}, // 9
        {H, H, H, H, H, H, L, H}, // 0. 小数点付き
        {L, H, H, L, L, L, L, H}, // 1. 小数点付き
        {H, H, L, H, H, L, H, H}, // 2. 小数点付き
        {H, H, H, H, L, L, H, H}, // 3. 小数点付き
        {L, H, H, L, L, H, H, H}, // 4. 小数点付き
        {H, L, H, H, L, H, H, H}, // 5. 小数点付き
        {H, L, H, H, H, H, H, H}, // 6. 小数点付き
        {H, H, H, L, L, L, L, H}, // 7. 小数点付き
        {H, H, H, H, H, H, H, H}, // 8. 小数点付き
        {H, H, H, H, L, H, H, H}, // 9. 小数点付き
	{L, L, L, L, L, L, L, L}, // Blank
	{L, L, L, L, L, L, L, H}, // dp
    };

    // 中略

    while (1) { // 無限ループ 1サイクル14.8ミリ秒 1秒間に約67回繰り返す

        // 共有メモリの文字により表示を変える
        switch (*shared_memory) {
            case 'S': // +++++ 時計表示 + 同期LED点灯 +++++
                disp = 2000;  // 2ミリ秒表示維持
                LEDstate = 1; // 同期LED点灯
                break;
            case 'M': // +++++ 時計表示 ++++++++++++++++++
                disp = 2000;  // 2ミリ秒表示維持
                LEDstate = 0; // 同期LED消灯
                break;
            case 'N': // +++++ チラツキ表示 ++++++++++++++
                disp = 10000; // 10ミリ秒表示維持
                LEDstate = 0; // 同期LED消灯
                break;
        }

        gpioWrite(SYNC_LED, LEDstate); // 共有メモリに応じて同期LED点灯・消灯

        // 時刻の取得
        clock_gettime(CLOCK_REALTIME, &ts);
        localtime_r(&ts.tv_sec, &lotm);  // ローカル時間に変換
        num[0] = ts.tv_nsec / 100000000; // 1/10秒の桁取得
        num[1] = lotm.tm_sec % 10 + 10;  //  1. 秒の桁取得(小数点付き)
        num[2] = lotm.tm_sec / 10;       // 10  秒の桁取得
        num[3] = lotm.tm_min % 10;       //  1  分の桁取得
        num[4] = lotm.tm_min / 10;       // 10  分の桁取得
        num[5] = lotm.tm_hour % 10;      //  1  時の桁取得
        num[6] = lotm.tm_hour / 10;      // 10  時の桁取得

        // 7桁ダイナミック表示ルーチン
        for (j = 0; j < 7; j++) {
            for (i = 0; i < 9; i++) { // 7セグメントデータセット
                gpioWrite(nanaseg[i], segdata[num[j]][i]);
            }
            gpioWrite(common[j], SEG_ON); // 7セグLED表示
            gpioDelay(disp);             // 共有メモリに応じて表示維持時間変化
            gpioWrite(common[j], SEG_OFF);// 7セグLED消灯
        }

    }

 

↓ 7セグLEDのコモンをオシロで観測した画像。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Post Navigation