From 76257775c3f532470692035d6d11c82e51dc880a Mon Sep 17 00:00:00 2001 From: Dmitriy Antipov Date: Sat, 6 May 2023 01:58:52 +0300 Subject: [PATCH] Extended show screen blocks options (#1019) * Update targetoverrides.ts Convert old blocks to obsolete ones, new blocks differ in that you can specify the place to start printing along the horizontal axis of the screen (column). And also added a print style. These are the standard black text on a white background and the new white text on a black background. These two parameters are optionally expanded and optional, by default column = 1 and the print style is the same as before, black text on white. * Update targetoverrides.ts * Update libs/screen/targetoverrides.ts Co-authored-by: Joey Wunderlich * Update libs/screen/targetoverrides.ts Co-authored-by: Joey Wunderlich * Update libs/screen/targetoverrides.ts Co-authored-by: Joey Wunderlich * Update libs/screen/targetoverrides.ts Co-authored-by: Joey Wunderlich * Update libs/screen/targetoverrides.ts --------- Co-authored-by: Joey Wunderlich --- libs/screen/targetoverrides.ts | 122 +++++++++++++++++++++++++++++++-- 1 file changed, 116 insertions(+), 6 deletions(-) diff --git a/libs/screen/targetoverrides.ts b/libs/screen/targetoverrides.ts index 4a45d034..6f2e78ad 100644 --- a/libs/screen/targetoverrides.ts +++ b/libs/screen/targetoverrides.ts @@ -31,6 +31,13 @@ namespace brick { Custom } + export enum PrintStyle { + //% block="black on white" + BlackOnWhite, + //% block="white on black" + WhiteOnBlack + } + let screenMode = ScreenMode.None; export let font = image.font8; @@ -50,6 +57,48 @@ namespace brick { return ((screen.height - textOffset) / lineHeight()) >> 0 } + /** + * Number of columns + */ + //% + export function columnCount(): number { + return ((screen.width - textOffset) / font.charWidth) >> 0 + } + + /** + * Show text on the screen on a specific line and starting at a column and the selected print style. + * @param text the text to print on the screen, eg: "Hello world" + * @param line the line number to print the text at (starting at 1), eg: 1 + * @param column the column number to print the text at (starting at 1), eg: 1 + * @param printStyle print style black on white or white on black + */ + //% blockId=screenPrintString block="show string $text|at line $line||column $column|style $printStyle" + //% weight=98 group="Screen" inlineInputMode="inline" blockGap=8 + //% expandableArgumentMode="enabled" + //% help=brick/show-string + //% line.min=1 line.max=12 + //% column.min=1 column.max=29 + export function printString(text: string, line: number, column: number = 1, printStyle: PrintStyle = PrintStyle.BlackOnWhite) { + if (screenMode != ScreenMode.ShowLines) { + screenMode = ScreenMode.ShowLines; + screen.fill(0); + } + + line = (line - 1) >> 0; // line indexing starts at 1 + column = (column - 1) >> 0; // column indexing starts at 1 + const nlines = lineCount(); + const nColumn = columnCount(); + if (line < 0 || line > nlines) return; // out of screen by line + if (column < 0 || column > nColumn) return; // out of screen by column + + const w = font.charWidth; + const h = lineHeight(); + const x = textOffset + w * column; + const y = textOffset + h * line; + screen.fillRect(x, y, text.length * font.charWidth, h, (printStyle == PrintStyle.BlackOnWhite ? 0 : 255)); // clear background + screen.print(text, x, y, (printStyle == PrintStyle.BlackOnWhite ? 1 : 2), font); + } + /** * Show text on the screen at a specific line. * @param text the text to print on the screen, eg: "Hello world" @@ -58,7 +107,8 @@ namespace brick { //% blockId=screen_print block="show string %text|at line %line" //% weight=98 group="Screen" inlineInputMode="inline" blockGap=8 //% help=brick/show-string - //% line.min=1 line.max=10 + //% line.min=1 line.max=12 + //% deprecated=true export function showString(text: string, line: number) { if (screenMode != ScreenMode.ShowLines) { screenMode = ScreenMode.ShowLines; @@ -76,19 +126,56 @@ namespace brick { screen.print(text, textOffset, y, 1, font); } + /** + * Show a number on the screen on a specific line and starting at a column and the selected print style. + * @param value the numeric value + * @param line the line number to print the text at, eg: 1 + * @param column the column number to print the text at (starting at 1), eg: 1 + * @param printStyle print style black on white or white on black + */ + //% blockId=screenPrintNumber block="show number $value|at line $line||column $column|style $printStyle" + //% weight=97 group="Screen" inlineInputMode="inline" blockGap=8 + //% expandableArgumentMode="enabled" + //% help=brick/show-number + //% line.min=1 line.max=12 + //% column.min=1 column.max=29 + export function printNumber(value: number, line: number, column: number = 1, printStyle: PrintStyle = PrintStyle.BlackOnWhite) { + printString("" + value, line, column, printStyle); + } + /** * Show a number on the screen * @param value the numeric value * @param line the line number to print the text at, eg: 1 */ //% blockId=screenShowNumber block="show number %name|at line %line" - //% weight=96 group="Screen" inlineInputMode="inline" blockGap=8 + //% weight=97 group="Screen" inlineInputMode="inline" blockGap=8 //% help=brick/show-number - //% line.min=1 line.max=10 + //% line.min=1 line.max=12 + //% deprecated=true export function showNumber(value: number, line: number) { showString("" + value, line); } + /** + * Show a name, value pair on the screen on a specific line and starting at a column and the selected print style. + * @param name the value name + * @param value the numeric value + * @param line the line number to print the text at, eg: 1 + * @param column the column number to print the text at (starting at 1), eg: 1 + * @param printStyle print style black on white or white on black + */ + //% blockId=screenPrintValue block="show value $name|= $value|at line $line||column $column|style $printStyle" + //% weight=96 group="Screen" inlineInputMode="inline" blockGap=8 + //% expandableArgumentMode="enabled" + //% help=brick/show-value + //% line.min=1 line.max=12 + //% column.min=1 column.max=29 + export function printValue(name: string, value: number, line: number, column: number = 1, printStyle: PrintStyle = PrintStyle.BlackOnWhite) { + value = Math.round(value * 1000) / 1000; + printString((name ? name + ": " : "") + value, line, column, printStyle); + } + /** * Show a name, value pair on the screen * @param value the numeric value @@ -97,7 +184,8 @@ namespace brick { //% blockId=screenShowValue block="show value %name|= %text|at line %line" //% weight=96 group="Screen" inlineInputMode="inline" blockGap=8 //% help=brick/show-value - //% line.min=1 line.max=10 + //% line.min=1 line.max=12 + //% deprecated=true export function showValue(name: string, value: number, line: number) { value = Math.round(value * 1000) / 1000; showString((name ? name + ": " : "") + value, line); @@ -125,7 +213,7 @@ namespace brick { */ //% blockId=brickShowPorts block="show ports" //% help=brick/show-ports blockGap=8 - //% weight=10 group="Screen" + //% weight=95 group="Screen" export function showPorts() { if (screenMode == ScreenMode.Ports) return; screenMode = ScreenMode.Ports; @@ -216,11 +304,33 @@ namespace brick { return image; } + /** + * Clear on the screen at a specific line. + * @param line the line number to clear at (starting at 1), eg: 1 + */ + //% blockId=clearLine block="clear line $line" + //% weight=94 group="Screen" inlineInputMode="inline" blockGap=8 + //% line.min=1 line.max=12 + export function clearLine(line: number) { + if (screenMode != ScreenMode.ShowLines) { + screenMode = ScreenMode.ShowLines; + screen.fill(0); + } + + line = (line - 1) >> 0; // line indexing starts at 1 + const nlines = lineCount(); + if (line < 0 || line > nlines) return; // out of screen by line + + const h = lineHeight(); + const y = textOffset + h * line; + screen.fillRect(0, y, screen.width, h, 0); // clear background + } + /** * Clear the screen */ //% blockId=screen_clear_screen block="clear screen" - //% weight=90 group="Screen" + //% weight=93 group="Screen" //% help=brick/clear-screen weight=1 export function clearScreen() { screen.fill(0)