Dynamic visualizationsOur course’s themeTwo ‘dynamic visualizations’Some application toolsThe ‘tty’ interface‘tty’ customizationSlide 7The ‘c_lflag’ fieldICANON and ECHOThe ‘c_cc[ ]’ arrayHow to setup ‘raw’ terminal-modeInput-mode needs five settingsDemo program: ‘noncanon.cpp’‘Noncanonical’ terminal i/oANSI command-sequencesClearing the screenReposition the cursorANSI color-codesSetting text attributesCursor visibility commandsIn-class exercise #1In-class exercise #2In-class exercise #3Dynamic visualizationsOn ‘non-canonical’ keyboard-input and terminal escape-sequences for visualization effectsOur course’s themeUsing the computer to study the computerTwo ‘dynamic visualizations’•Showing the Linux kernel’s algorithm for setting up ‘permanent kernel mappings’ •Showing the dual-CPUs’ responses to device-interrupts and CPU-exceptionsSome application tools•We need to modify the terminal-console’s normal way of processing keyboard-input and of displaying its line-at-a-time output•ANSI terminal escape-sequences allow page-oriented output (i.e., left-and-right, up-and-down), control of cursor-visibility and of character-attributes (e.g., colors)The ‘tty’ interface•‘tty’ is an acronyn for ‘TeleTYpe’ terminal•Such devices have a keyboard and screen•Behavior emulates technology from 1950s•Usually a tty operates in ‘canonical’ mode:–Each user-keystroke is ‘echoed’ to screen–Some editing is allowed (e.g., backspace)–The keyboard-input is internally buffered–The <ENTER>-key signals an ‘end-of-line’ –Programs receive input one-line-at-a-time‘tty’ customization•Sometimes canonical mode isn’t suitable (an example: animated computer games)•The terminal’s behavior can be modified!•UNIX provides a convenient interface:–#include <termios.h>–struct termios tty;–int tcgetattr( int fd, struct termios *tty );–int tcsetattr( int fd, int flag, struct termios *tty );How does the ‘tty’ work?TeleTYpe display deviceHARDWARESOFTWAREapplicationtty_driverc_lflaginput handlingc_iflagc_ccoutput handlingc_oflagterminal_driverc_cflagUser spaceKernel spacestruct tty { c_iflag; c_oflag; c_cflag; c_lflag; c_line; c_cc[ ]; };The ‘c_lflag’ field•This field is just an array of flag bits•Individual bits have symbolic names•Names conform to a POSIX standard•Linux names match other UNIX’s names•Though actual symbol values may differ•Your C/C++ program should use:#include <termios.h>for portability to other UNIX environmentsICANON and ECHO•Normally the ‘c_lflag’ field has these set•They can be cleared using bitwise logic:tty.c_lflag &= ~ECHO; // inhibit echotty.c_lflag &= ~ICANON; // no bufferingtty.c_lflag &= ~ISIG; // no CTRL-CThe ‘c_cc[ ]’ array•‘struct termios’ objects include an array•The array-indices have symbolic names•Symbol-names are standardized in UNIX•Array entries are ‘tty’ operating parameters•Two useful ones for our purposes are:tty.c_cc[ VMIN ] and tty.c_cc[ VTIME ]How to setup ‘raw’ terminal-mode•Step 1: Use ‘tcgetattr()’ to get a copy of the current tty’s ‘struct termios’ settings•Step 2: Make a working copy of that object•Step 3: Modify its flags and control-codes•Step 4: Use ‘tcsetattr()’ to install changes•Step 5: Perform desired ‘raw’ mode input•Step 6: Use ‘tcsetattr()’ to restore the terminal to its original default settingsInput-mode needs five settings•tty.c_cc[ VMIN ] = 0;–so the ‘read()’ function will return -- even if there is not at least one new input-character available•tty.c_cc[ VTIME ] = 0;–so there will be no time-delay, after each new key pressed, until the ‘read()’ function returns•tty.c_lflag &= ~ECHO; // no input-echoing•tty.c_lflag &= ~ICANON; // no buffering•tty.c_lflag &= ~ISIG; // no <CTRL>-CDemo program: ‘noncanon.cpp’•This program may soon prove useful•It shows the keyboard scancode values•It demonstrates ‘noncanonical’ tty mode•It clears the ISIG bit (in ‘c_lflags’ field)•This prevents <CONTROL>-C from being used to abort the program: the user must ‘quit’ by hitting the <ESCAPE>-key; so default terminal-settings will get reinstalled‘Noncanonical’ terminal i/o•We’ve now learned how to reprogram the terminal to allow “raw” keyboard input#include <termios.h>struct termios tty;tcgetattr( 0, &tty ); // get tty settingstty.c_lflag &= ~( ICANON | ECHO | ISIG );tty.c_cc[ VMIN ] = 1; tty.c_cc[ VTIME ] = 0;tcsetattr( 0, TCSAFLUSH, &tty ); // installANSI command-sequencesA look at some terminal emulation features utilized in the “console-redirection” mechanismClearing the screen•Here is an ANSI command-sequence that clears the terminal’s display-screen:char cmd[] = “\033[2J”;int len = strlen( cmd );write( 1, cmd, len );Reposition the cursor•Here is an ANSI command-sequence that moves the cursor to row 12, column 40:char cmd[] = “\033[12;40H”;int len = strlen( cmd );write( 1, cmd, len );ANSI color-codes0 = black1 = red2 = green3 = brown4 = blue5 = magenta6 = cyan7 = graySetting text attributes•Here is an ANSI command-sequence that sets foreground and background colors:char cmd[] = “\033[32;44m”;int len = strlen( cmd );write( 1, cmd, len );Cursor visibility commands•Here are ANSI command-sequences that will ‘hide’ or ‘show’ the terminal’s cursor:char hide[] = “\033[?25l”; // lowercase Lchar show[] = “\033[?25h”; // lowercase HIn-class exercise #1•Modify this simple C++ program so that it will print its “Hello” message in colors and be located in the center of the screen:#include <stdio.h>int main( void ){printf( “Hello, world! \n” );}In-class exercise #2•Compile and install our ‘pkmaps.c’ module•Then download, compile and execute our ‘mapwatch.cpp’ visualization-application•While ‘mapwatch’ continues to run in one window of your graphical desktop, open a second window nearby and execute some common commands, for example:$ ls$ mmake pkmapsIn-class exercise #3•Compile and install our ‘smpwatch.c’ LKM•Then download, compile and execute our ‘smpwatch.cpp’ visualization-application•In a nearby window, try hitting some keys and moving the mouse•Try executing the ‘ping’ command to see if another machine responds, for example:$ ping
View Full Document