|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2024 nono project ! 4: // Licensed under nono-license.txt ! 5: // ! 6: ! 7: // ! 8: // シリアルポートのメイン画面コンソール入出力ドライバ ! 9: // ! 10: ! 11: #include "comdriver_cons.h" ! 12: #include "console.h" ! 13: #include "hostcom.h" ! 14: ! 15: // コンストラクタ ! 16: COMDriverCons::COMDriverCons(HostDevice *hostdev_) ! 17: : inherited(hostdev_, "Console") ! 18: { ! 19: } ! 20: ! 21: // デストラクタ ! 22: COMDriverCons::~COMDriverCons() ! 23: { ! 24: } ! 25: ! 26: // ドライバ初期化 ! 27: bool ! 28: COMDriverCons::InitDriver() ! 29: { ! 30: console = GetConsoleDevice(); ! 31: console->Attach(this); ! 32: ! 33: auto keyboard = gMainApp.GetObject<ConsoleKeyboard>(OBJ_KEYBOARD); ! 34: keyboard->Attach(this); ! 35: ! 36: int fds[2]; ! 37: if (pipe(fds) < 0) { ! 38: putmsg(0, "pipe failed: %s", strerror(errno)); ! 39: return false; ! 40: } ! 41: rxpipe = fds[0]; ! 42: txpipe = fds[1]; ! 43: ! 44: if (hostdev->AddOuter(rxpipe) < 0) { ! 45: putmsg(0, "AddOuter: %s", strerror(errno)); ! 46: return false; ! 47: } ! 48: ! 49: return true; ! 50: } ! 51: ! 52: // 外部への1バイト書き出し ! 53: void ! 54: COMDriverCons::Write(uint32 ch) ! 55: { ! 56: console->Putchar(ch); ! 57: } ! 58: ! 59: // 外部からの1バイト読み込み。 ! 60: // HostCOM スレッドから呼ばれる。 ! 61: int ! 62: COMDriverCons::Read() ! 63: { ! 64: uint8 buf[1]; ! 65: int r; ! 66: ! 67: r = read(rxpipe, buf, sizeof(buf)); ! 68: if (r < 0) { ! 69: putmsg(0, "read: %s", strerror(errno)); ! 70: return NODATA; ! 71: } ! 72: if (r == 0) { ! 73: return NODATA; ! 74: } ! 75: return buf[0]; ! 76: } ! 77: ! 78: // VM からのキー入力。 ! 79: // ConsoleKeyboard から呼ばれる。この文字をパイプに書き込んで帰る。 ! 80: void ! 81: COMDriverCons::EnqueueChar(uint charcode) ! 82: { ! 83: char buf[1]; ! 84: int r; ! 85: ! 86: buf[0] = charcode; ! 87: r = write(txpipe, buf, sizeof(buf)); ! 88: if (r < 0) { ! 89: putmsg(0, "write: %s", strerror(errno)); ! 90: return; ! 91: } ! 92: if (r == 0) { ! 93: putmsg(0, "write: short"); ! 94: return; ! 95: } ! 96: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.