diff --git a/examples/accounts/account_ex.nim b/examples/accounts/account_ex.nim index 3b67244..744e6ed 100644 --- a/examples/accounts/account_ex.nim +++ b/examples/accounts/account_ex.nim @@ -1,6 +1,6 @@ import sets, strutils import libnx/graphics -import libnx/wrapper/con +import libnx/console import libnx/ext/integer128 import libnx/account import libnx/input @@ -8,40 +8,42 @@ import libnx/app proc main() = graphics.initDefault() - discard consoleInit(nil) + console.init() - echo "\x1b[5;2H" & "Account info:" + printAt (5, 2), "Account info:" withAccountService: try: - let user = getActiveUser() - let userID = user.id - echo "\x1b[6;2HUserID: 0x" & userID.toHex() - echo "\x1b[7;2HUsername: " & user.username - echo "\x1b[8;2HMiiID: " & $user.miiID - echo "\x1b[9;2HIconID: " & $user.iconID + let + user = getActiveUser() + userID = user.id + + print "UserID: 0x" & userID.toHex() + print "Username: " & user.username + print "MiiID: " & $user.miiID + print "IconID: " & $user.iconID except AccountUserNotSelectedError: - echo "\x1b[6;2HNo user currently selected!" + print "No user currently selected!" except AccountError: let msg = getCurrentExceptionMsg() - echo "\x1b[6;2H" & msg + print msg try: let users = listAllUsers() - echo "" - echo " There are $# users:" % $users.len() + print "" + print "There are $# users:" % $users.len() for user in users: - echo " User: " & user.username + print "User: " & user.username except AccountUserListError: let msg = getCurrentExceptionMsg() - echo msg + print msg mainLoop: let keysDown = keysDown(Controller.P1_AUTO) if keysDown.len() > 0: - echo keysDown + print keysDown if ControllerKey.Plus in keysDown: break diff --git a/examples/helloworld/helloworld.nim b/examples/helloworld/helloworld.nim index d23efd4..3a88a2f 100644 --- a/examples/helloworld/helloworld.nim +++ b/examples/helloworld/helloworld.nim @@ -1,6 +1,6 @@ import sets import libnx/graphics -import libnx/wrapper/con +import libnx/console import libnx/wrapper/hid import libnx/app import libnx/input @@ -8,9 +8,9 @@ import libnx/input proc main() = initDefault() - discard consoleInit(nil) + console.init() - echo "\x1b[17;20HHELLO FROM NIM" + printAt (17, 20), "HELLO FROM NIM" mainLoop: let keysDown = keysDown(Controller.P1_AUTO) diff --git a/libnxGen.cfg b/libnxGen.cfg index d0a66b6..175cbe0 100644 --- a/libnxGen.cfg +++ b/libnxGen.cfg @@ -354,3 +354,6 @@ template CONSOLE_CONCEAL*: int = (1 shl 7) template CONSOLE_CROSSED_OUT*: int = (1 shl 8) """ + +search.threedmoo = "debugDevice_3DMOO" +replace.threedmoo = "debugDevice_3DMOO*" diff --git a/src/libnx/console.nim b/src/libnx/console.nim new file mode 100644 index 0000000..78957b9 --- /dev/null +++ b/src/libnx/console.nim @@ -0,0 +1,124 @@ +import libnx/wrapper/con +import libnx/utils +import macros, strutils + + +type + PrintCallback* = proc (con: pointer; c: cint): bool + + #Font* = ref object + # gfx*: Buffer[uint16] + # asciiOffset*: uint16 + # numChars*: uint16 + + Style* {.pure.} = enum + Bold = CONSOLE_COLOR_BOLD(), + Faint = CONSOLE_COLOR_FAINT(), + Italic = CONSOLE_ITALIC(), + Underline = CONSOLE_UNDERLINE(), + BlinkSlow = CONSOLE_BLINK_SLOW(), + BlinkFast = CONSOLE_BLINK_FAST(), + ColorReverse = CONSOLE_COLOR_REVERSE(), + Conceal = CONSOLE_CONCEAL(), + CrossedOut = CONSOLE_CROSSED_OUT() + + Console* = ref object + pcon: ptr PrintConsole + font*: ConsoleFont + frameBuffer*: ptr UncheckedArray[uint32] + frameBuffer2*: ptr UncheckedArray[uint32] + cursorX*: int + cursorY*: int + prevCursorX*: int + prevCursorY*: int + width*: int + height*: int + windowX*: int + windowY*: int + windowWidth*: int + windowHeight*: int + tabSize*: int + fg*: int + bg*: int + flags*: set[Style] + printCharCallback*: PrintCallback + initialised*: bool + + DebugDevice* {.size: sizeof(cint), pure.} = enum + Null, Service, Console, ThreeDMOO + +proc toConsole(pconsole: ptr PrintConsole): Console = + result = new(Console) + result.pcon = pconsole + result.font = pconsole.font + result.cursorX = pconsole.cursorX + result.frameBuffer = cast[ptr UncheckedArray[uint32]](pconsole.frameBuffer) + result.frameBuffer2 = cast[ptr UncheckedArray[uint32]](pconsole.frameBuffer2) + result.cursorX = pconsole.cursorX + result.cursorY = pconsole.cursorY + result.prevCursorX = pconsole.prevCursorX + result.prevCursorY = pconsole.prevCursorY + result.width = pconsole.consoleWidth + result.height = pconsole.consoleHeight + result.windowX = pconsole.windowX + result.windowY = pconsole.windowY + result.windowWidth = pconsole.windowWidth + result.windowHeight = pconsole.windowHeight + result.tabSize = pconsole.tabSize + result.fg = pconsole.fg + result.bg = pconsole.bg + result.flags = {} + #result.printCharCallback = cast[PrintCallback](pconsole.PrintChar) + result.initialised = pconsole.consoleInitialised + +proc setFont*(console: Console; font: ConsoleFont) = + var f = font + consoleSetFont(console.pcon, f.addr) + console.font = console.pcon.font + +proc setWindow*(console: Console, x, y, width, height: int) = + console.pcon.consoleSetWindow(x.cint, y.cint, width.cint, height.cint) + console.width = console.pcon.consoleWidth + console.height = console.pcon.consoleHeight + console.windowX = console.pcon.windowX.int + console.windowY = console.pcon.windowY.int + +proc getDefault*(): Console = + let pcon = consoleGetDefault() + result = pcon.toConsole() + +proc select*(console: Console): Console = + consoleSelect(console.pcon).toConsole() + +proc init*(console: Console = nil): Console {.discardable.} = + var newCon = console + if newCon.isNil: + newCon = new(Console) + + let pcon = consoleInit(newCon.pcon) + newCon = pcon.toConsole() + return newCon + +proc debugInit*(device: DebugDevice) = + if device == ThreeDMOO: + consoleDebugInit(debugDevice_3DMOO) + else: + consoleDebugInit(debugDevice(device)) + +proc clear*() = + consoleClear() + +var printPos: tuple[row: int, col: int] = (0, 0) + +proc setPrintPos*(pos: tuple[row: int, col: int]) = + printPos = pos + +proc printAt*(pos: tuple[row: int, col: int], args: varargs[string, `$`]) = + setPrintPos(pos) + echo ("\x1b[$#;$#H" % [$pos[0], $pos[1]]), args.join("") + +proc print*(args: varargs[string, `$`]) = + ## Will print at the previously set printPos using ``printAt`` or ``setPrintPos`` + ## and then increment the row by one + printAt printPos, args + printPos.row += 1