このフローチャートに従って、共有メモリに書き込むプログラム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のコモンをオシロで観測した画像。