Add console module

This commit is contained in:
Joey Yakimowich-Payne 2018-07-06 21:48:23 +09:00
commit 1b0945fed8
4 changed files with 148 additions and 19 deletions

View file

@ -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

View file

@ -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)

View file

@ -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*"

124
src/libnx/console.nim Normal file
View file

@ -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