|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2021 nono project
4: // Licensed under nono-license.txt
5: //
6:
7: //
8: // シリアルポートの標準入出力ドライバ
9: //
10:
11: #include "comdriver_stdio.h"
12: #include "hostcom.h"
13:
14: // コンストラクタ
15: COMDriverStdio::COMDriverStdio(HostDevice *hostdev_)
16: : inherited(hostdev_, "Stdio")
17: {
18: // 現在の端末属性を取得
19: tcgetattr(STDIN_FILENO, &oldtc);
20: }
21:
22: // デストラクタ
23: COMDriverStdio::~COMDriverStdio()
24: {
25: // 端末属性を元に戻す
26: tcsetattr(STDIN_FILENO, TCSANOW, &oldtc);
27: }
28:
29: // ドライバ初期化
30: bool
31: COMDriverStdio::InitDriver()
32: {
33: struct termios tc;
34:
35: // 端末の設定を変更
36: tc = oldtc;
37:
38: // 入力時の変換は無し
39: tc.c_iflag = 0;
40:
41: tc.c_lflag &= ~ECHO; // エコーオフ
42: tc.c_lflag &= ~ICANON; // 非カノニカルモード
43: tc.c_lflag &= ~IEXTEN; // DISCARD(^O)と LNEXT をオフ?
1.1.1.2 ! root 44: tc.c_lflag &= ~ISIG; // シグナルを生成しない
1.1 root 45: tc.c_cc[VTIME] = 0;
46: tc.c_cc[VMIN] = 1;
47:
48: if (tcsetattr(STDIN_FILENO, TCSANOW, &tc) < 0) {
49: putmsg(0, "tcsetattr: %s", strerror(errno));
50: return false;
51: }
52:
53: if (hostdev->AddOuter(STDIN_FILENO) < 0) {
54: putmsg(0, "AddOuter: %s", strerror(errno));
55: return false;
56: }
57:
58: return true;
59: }
60:
61: // 外部への1バイト書き出し
62: void
63: COMDriverStdio::Write(uint32 data)
64: {
65: uint8 buf[1];
66: int r;
67:
68: buf[0] = data;
69: r = write(STDOUT_FILENO, buf, sizeof(buf));
70: if (r < 0) {
71: putmsg(0, "write: %s", strerror(errno));
72: return;
73: }
74: if (r < sizeof(buf)) {
75: putmsg(0, "write: short");
76: return;
77: }
78: }
79:
80: // 外部からの1バイト読み込み
81: int
82: COMDriverStdio::Read()
83: {
84: uint8 buf[1];
85: int r;
86:
87: r = read(STDIN_FILENO, buf, sizeof(buf));
88: if (r < 0) {
89: putmsg(0, "read: %s", strerror(errno));
90: return NODATA;
91: }
92: if (r == 0) {
93: return NODATA;
94: }
95: return buf[0];
96: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.