NXC: erweiterte Fkt.: Schrift, Sound, Grafik, Errors

NXC, C/C++, Lejos, pbLua, RobotC...

Moderator: Moderatoren

Benutzeravatar
Sebi
Administrator
Administrator
Beiträge: 1946
Registriert: 11. Jan 2008 14:28
Wohnort: Aub
Kontaktdaten:

Beitragvon Sebi » 18. Feb 2010 19:12

Low Level Grafikfunktionen
Dei Low Level Funktionen funktieren so wie die High Level Funkionen.
Man kann aber beim "Lösch-Parameter" auch angeben, dass die Grafik/Text in weiß auf dem NXT Bildschirm angezeigt wird. Bzw. das nur die Grafik gelöscht wird.
Nachtrag:30.5.10. Man kann auch die normalen Funktioenren mit den Parametern benutzen. Also z.B. "TextOut(0,LCDLINE_1,"Test",4)"; (Schreibt "Test" "weis")
Text:

Code: Alles auswählen

DrawTextType dtArgs;
dtArgs.Location.X = 0;
dtArgs.Location.Y = LCD_LINE1;
dtArgs.Text = "Please Work";
dtArgs.Options = 0x01; // clear Screen before drawing
SysDrawText(dtArgs);


Punkt

Code: Alles auswählen

DrawPointType dpArgs;
dpArgs.Location.X = 20;
dpArgs.Location.Y = 20;
dpArgs.Options = 0x04; // clear this pixel
SysDrawPoint(dpArgs);


Linie

Code: Alles auswählen

DrawLineType dlArgs;
dlArgs.StartLoc.X = 20;
dlArgs.StartLoc.Y = 20;
dlArgs.EndLoc.X = 60;
dlArgs.EndLoc.Y = 60;
dlArgs.Options = 0x01; // clear Screen before drawing
SysDrawLine(dlArgs);


Kreis

Code: Alles auswählen

DrawCircleType dcArgs;
dcArgs.Center.X = 20;
dcArgs.Center.Y = 20;
dcArgs.Size = 10; // radius
dcArgs.Options = 0x01; // clear Screen before drawing
SysDrawCircle(dcArgs);


Rechteck

Code: Alles auswählen

DrawRectType drArgs;
drArgs.Location.X = 20;
drArgs.Location.Y = 20;
drArgs.Size.Width = 20;
drArgs.Size.Height = 10;
drArgs.Options = 0x00; // do not clear Screen before drawing
SysDrawRect(drArgs);


Grafik

Code: Alles auswählen

variable of this structure type.
DrawGraphicType dgArgs;
dgArgs.Location.X = 20;
dgArgs.Location.Y = 20;
dgArgs.Filename = "image.ric";
ArrayInit(dgArgs.Variables, 0, 10); // 10 zeros
dgArgs.Variables[0] = 12;
dgArgs.Variables[1] = 14; // etc...
dgArgs.Options = 0x00; // do not clear before drawing
SysDrawGraphic(dgArgs);


Lösch-Konstanten:

Code: Alles auswählen

0x00 Nichts löschen
0x01 Vor dem "malen" löschen
0x04 Mit wei0 "malen"/nur diese Pixel löschen

Man die Paramater auch als "normale" Zahlen angeben, also 0,1,4.
Und 0+1 kann man auch mit true/false angeben.

Die Codes stammen aus dem NXC-Guide Seite 25-27.
Zuletzt geändert von Sebi am 30. Mai 2010 19:27, insgesamt 2-mal geändert.

Computerfreak
Schreibt super viel
Schreibt super viel
Beiträge: 406
Registriert: 26. Dez 2007 20:01

Beitragvon Computerfreak » 18. Feb 2010 19:58

Die Low-Level-Funktion SetDisplayPopup()
Mit der Low-Level-Funtkion SetDisplayPopup() kann man eine Zeichnung für mehrere Programme auf dem NXC verwenden.

Code: Alles auswählen

SetDisplayPopup(x, line, count, data) Function
Write "count" bytes to the popup display memory from the data array. Start writing at
the specified x, line coordinate. Each byte of data read from screen memory is a
vertical strip of 8 bits at the desired location. Each bit represents a single pixel on the
LCD screen. Use TEXTLINE_1 through TEXTLINE_8 for the "line" parameter.
SetDisplayPopup(0, TEXTLINE_1, 8, PopupMem);
Auszug aus dem NXC-Guide Seite 70

Die Koordinaten des Popups geben dabei die ersten zwei Parameter an, wobei der erste Parameter den Pixel auf der X-Achse und der zweite Parameter die Zeile auf dem LCD-Display des NXT. Der dritte Parameter gibt die Bytezahl des vierten Parameters an, also die anzahl der vertikalen Pixelreihen des Popups. Der vierte Parameter ist ein Bytearray. Die Bits der Bytes definieren die gesetzten Pixel von oben nach unten auf dem NXT.

Beispiel:

Code: Alles auswählen

byte PopupMem[] = {0xFF, 0x99, 0x99, 0xFF}; //Der Bytearray des Popups wird deklariert
//0xFF = 11111111; 0x99 = 10011001; (Bits von oben nach unten, entsprechen den vertikalen Pixeln von oben nach unten auf dem NXT)
task main()
{
  TextOut(10, LCD_LINE3, "Standard"); //Textausgabe auf dem "Standard-Display"
  SetDisplayPopup(10, TEXTLINE_3, 4, PopupMem); //Setzen der "Popup-Pixel" im Array PopupMem, X = 10; Y = 3. Zeile;
  //4 Bytes werden gesetzt, entspricht 4 * 8 Bits = 32 Bits -> 32 Pixel wurden im Array PopupMem definiert
  SetDisplayPopup(10, TEXTLINE_5, 4, PopupMem); //Setzen der "Popup-Pixel" im Array PopupMem, X = 10; Y = 5. Zeile;
  //Array PopupMem wird gesetzt (4 * 8 Bits)
  while(true)
  {
    SetDisplayFlags(DISPLAY_POPUP); //Die Anzeige zwischen dem "Standard-Display" und dem "Popup-Display" wird auf "Popup-Display" gesetzt
    //-> Das Popup wird angezeigt
    Wait(1000); //Warten (1000ms)
    SetDisplayFlags(~DISPLAY_POPUP); //Die Anzeige zwischen dem "Standard-Display" und dem "Popup-Display" wird auf "Standard-Display" gesetzt
    //-> Der normale Text wird angezeigt ("Standard")
    Wait(1000); //Warten (1000ms)
  }
}


Erstellt man nun ein weiteres Programm in welchem man die Funktion SetDisplayFlags(DISPLAY_POPUP) verwendet, werden die letzten gesetzten Popups des NXTs auf dem Display angezeigt.

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5402
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Beitragvon HaWe » 18. Feb 2010 21:21

DRAW options in der Übersicht:
John Hansen hat geschrieben:The information from that thread is very old. As you can see from the documentation below, the only value that matters when you call GraphicOut is the clear screen bit (0x0, 0x1, or 0x2). You can now set the CopyOptions value using the same kind of options that work for regular drawing API functions. These are parameterizable as well. I am, admittedly, not an expert on all the possibilities of drawing with these options both external to an RIC (passed as the last optional argument to the *Out() functions) or internal (set as the CopyOptions value of each RIC opcode). Ron McRae has done about as much as anyone has with these features. Also the inestimable author of nxtRICeditv2, Andreas Dreier. All of these options should work correctly but you need to understand what they do. I urge you to experiment with very simple programs to see how they all work.

Code: Alles auswählen

/*
 * Constants that are for specifying drawing options in several display module API functions.
 * Bits 0 & 1 (values 0,1,2,3) control screen clearing behaviour (Not within RIC files).
 * Bit 2 (value 4) controls the NOT operation, i.e. draw in white or invert text/graphics.
 * Bits 3 & 4 (values 0,8,16,24) control pixel logical combinations (COPY/AND/OR/XOR).
 * Bit 5 (value 32) controls shape filling, or overrides text/graphic bitmaps with set pixels.
 * These may be ORed together for the full instruction
 * (e.g., DRAW_OPT_NORMAL|DRAW_OPT_LOGICAL_XOR)
 * These operations are resolved into the separate, common parameters
 * defined in 'c_display.iom' before any drawing function is called.
 * Note that when drawing a RIC file, the initial 'DrawingOptions' parameter
 * supplied in the drawing instruction controls screen clearing, but nothing else.
 * The 'CopyOptions' parameter from each instruction in the RIC file then controls
 * graphic operations, but the screen-clearing bits are ignored.
 */

#define DRAW_OPT_NORMAL                (0x0000) /*!< Normal drawing */
#define DRAW_OPT_CLEAR_WHOLE_SCREEN       (0x0001) /*!< Clear the entire screen before drawing */
#define DRAW_OPT_CLEAR_EXCEPT_STATUS_SCREEN (0x0002) /*!< Clear the screen except for the status line before drawing */

#define DRAW_OPT_CLEAR_PIXELS            (0x0004) /*!< Clear pixels while drawing (aka draw in white) */
#define DRAW_OPT_CLEAR                 (0x0004) /*!< Clear pixels while drawing (aka draw in white) */
#define DRAW_OPT_INVERT                (0x0004) /*!< Invert text or graphics */

#define DRAW_OPT_LOGICAL_COPY            (0x0000) /*!< Draw pixels using a logical copy operation */
#define DRAW_OPT_LOGICAL_AND            (0x0008) /*!< Draw pixels using a logical AND operation */
#define DRAW_OPT_LOGICAL_OR             (0x0010) /*!< Draw pixels using a logical OR operation */
#define DRAW_OPT_LOGICAL_XOR            (0x0018) /*!< Draw pixels using a logical XOR operation */

#define DRAW_OPT_FILL_SHAPE             (0x0020) /*!< Fill the shape while drawing (rectangle, circle, ellipses, and polygon) */

#define DRAW_OPT_CLEAR_SCREEN_MODES       (0x0003) /*!< Bit mask for the clear screen modes */
#define DRAW_OPT_LOGICAL_OPERATIONS       (0x0018) /*!< Bit mask for the logical drawing operations */
#define DRAW_OPT_FONT_DIRECTIONS         (0x01C0) /*!< Bit mask for the font direction bits */

#define DRAW_OPT_FONT_WRAP      (0x0200) /*!< Option to have text wrap in FontNumOut and FontTextOut calls */

#define DRAW_OPT_FONT_DIR_L2RB   (0x0000) /*!< Font left to right bottom align */
#define DRAW_OPT_FONT_DIR_L2RT   (0x0040) /*!< Font left to right top align */
#define DRAW_OPT_FONT_DIR_R2LB   (0x0080) /*!< Font right to left bottom align */
#define DRAW_OPT_FONT_DIR_R2LT   (0x00C0) /*!< Font right to left top align */
#define DRAW_OPT_FONT_DIR_B2TL   (0x0100) /*!< Font bottom to top left align */
#define DRAW_OPT_FONT_DIR_B2TR   (0x0140) /*!< Font bottom to top right align */
#define DRAW_OPT_FONT_DIR_T2BL   (0x0180) /*!< Font top to bottom left align */
#define DRAW_OPT_FONT_DIR_T2BR   (0x01C0) /*!< Font top to bottom right align */


John Hansen


Beispiel: DRAW_OPT_LOGICAL_XOR = 0x18
beim 1. Schreiben: schreibt schwarz, was bisher weiß war
beim 2. Schreiben: schreibt weiß, was vorher schwarz war

Code: Alles auswählen

task  main()
{
  while (true)
  {
     DrawCircleType dcArgs;
     dcArgs.Center.X = 20;
     dcArgs.Center.Y = 20;
     dcArgs.Size = 10; // radius
     dcArgs.Options = 0x18; // DRAW_OPT_LOGICAL_XOR
     SysDrawCircle(dcArgs);

     Wait(500);
  }
}

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5402
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Beitragvon HaWe » 23. Mär 2010 11:23

für alle, die sich ihre Fonts selber machen möchten - hier ein Download zum Programm RicFont.exe :

http://mindstormsforum.de/uploads/index.php?downloade_datei=3f7caa0d4adb47022d2fe31c1f9384de

hier sind einige Fontbeispiele zum Download:

http://mindstormsforum.de/uploads/index.php?downloade_datei=4b4ae5a05bfe7374c8f5ffd88963379f

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5402
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Beitragvon HaWe » 12. Feb 2011 15:55

NXC-Fehlercodes,
schnell zum Nachschlagen, ein herzliches Dankeschön an Linus^^

Code: Alles auswählen

#define NO_ERR        0

//Fatal errors

#define ERR_ARG      -1
#define ERR_INSTR    -2
#define ERR_FILE     -3
#define ERR_VER      -4
#define ERR_MEM      -5
#define ERR_BAD_PTR  -6

//General errors

#define ERR_INVALID_PORT   -16
#define ERR_INVALID_FIELD  -17
#define ERR_INVALID_QUEUE  -18
#define ERR_INVALID_SIZE   -19
#define ERR_NO_PROG        -20

//Communications specific errors

#define ERR_COMM_CHAN_NOT_READY -32
#define ERR_COMM_CHAN_INVALID   -33
#define ERR_COMM_BUFFER_FULL    -34
#define ERR_COMM_BUS_ERR        -35

//Remote control (direct commands) errors

#define ERR_RC_ILLEGAL_VAL -64
#define ERR_RC_BAD_PACKET  -65
#define ERR_RC_UNKNOWN_CMD -66
#define ERR_RC_FAILED      -67

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5402
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: NXC: erweiterte Fkt.: Schrift, Sound, Grafik, Errors

Beitragvon HaWe » 30. Jun 2012 22:49

Übersicht über alle darstellbaren Zeichen inkl. Sonderzeichen:

kleines (zugegebenermaßen unnötig kompliziertes) Programm, um alle vom NXT darstellbaren Zeichen und Sonderzeichen auf dem NXT-Bildschirm auszugeben -
Ich finde es allerdings sehr praktisch, um sich einen Überblick zu verschaffen.

Kernfunktion meiner Ausgabe ist die Anzeige von ASCII-Zahlenwert und dann dem Zeichen selber per printf-Funktion -
Für die, die das Zeichen ASCII-codiert mit TextOut ausgeben möchten, kann man FlattenVar verwenden (danke an mattallen37):

Code: Alles auswählen

printfEx("%3d", i);    printfEx(" %c ", i);
NumOut(0,56, i);       TextOut(30,56, FlattenVar(i) )

Code: Alles auswählen

// nxcstdio.h
// providing a more ANSI C printf() compatible procedure

int _cur_x_=0, _cur_y_=56;      // cursor home for NXC  = upper left = (0,56)
int _tab_width_=24;             // tab width by default = 24 = 4* 6-point letter

unsigned long _TEXTSTYLE_ = DRAW_OPT_NORMAL;   // text style by default

#define scrclr() {  ClearScreen();  _cur_x_=0; _cur_y_=56; }

#define gotoxy( x, y )    { _cur_x_=x; _cur_y_=y; }   // move cursor to position
#define curxy( x, y )     { _cur_x_=x; _cur_y_=y; }   // move cursor to (alias)
#define curx  ( x )       { _cur_x_=x; }              // move cursor to x-pos
#define cury  ( y )       { _cur_y_=y; }              // move cursor to y-pos
#define curhome           { _cur_x_=0; _cur_y_=56; }  // move cursor home
#define settabwidth( t )  { _tab_width_ = t; }        // redefine tab width
#define settextstyle( t ) { _TEXTSTYLE_ = t; }        // redefine text style


inline string strsplit(string &src, string mark) {
  string s="";
  int p=-1, l;
  p=Pos(mark, src);
  if (p>=0) {
    l=strlen(mark);
    s= SubStr(src, 0, p);
    src=SubStr(src, p+l, strlen(src)-p);
  }
  return s;
}


string strexch(string src, string ex, string ch) {
  string s;
  s=strsplit(src,ex);
  return (StrCat(s,ch,src));
}


// printfxy()
// featuring "\i" for writing inverted
//******************************************************************************
#define printfxy( x, y, f, v) {      \
  _cur_y_=y;   string s1, s2, sv;    \
  s2=f;                              \
  if (Pos("\i",s2)>=0) {             \
    _TEXTSTYLE_= DRAW_OPT_INVERT;    \
    s2=strexch(s2,"\i","");          \
  }                                  \
  int len=0;                         \
  if (Pos("%",s2)==-1)  { sv=s2; }   \
  else { sv = FormatVal(s2, v);  }   \
  TextOut(x, y, sv, _TEXTSTYLE_);    \
  len=strlen(sv);                    \
  _cur_x_=x+6*(len);                 \
  _TEXTSTYLE_= DRAW_OPT_NORMAL;      \
}


// printfEx redefined as printf()
// featuring \n, \t, and "\i" for writing inverted
//******************************************************************************
#define printf(fmt, val) {            \
  int x=_cur_x_; int y=_cur_y_;       \
  string sf, s;                       \
  sf=fmt;                             \
  while (Pos("\n",sf)>=0) {           \
    s=strsplit(sf,"\n");              \
    while (Pos("\t",s)>=0) {          \
      x=(1+x/_tab_width_)*_tab_width_;\
      s=strexch(s, "\t", ""); }       \
    printfxy( x, y, s, val);          \
    x=0;  y-=8;                       \
  }                                   \
  while (Pos("\t",sf)>=0) {           \
      x=(1+x/_tab_width_)*_tab_width_;\
      sf=strexch(sf, "\t", ""); }     \
  printfxy( x, y, sf, val);           \
}


//******************************************************************************
task main() {
  int i;
  settabwidth(18);
  scrclr();

  for(;;++i) {       // (ascii char 0...31 not displayed)
    printf("\i%3d",i); printf(" %c",i); printf("\t\i%3d",++i); printf(" %c\n",i);
    if (_cur_y_<0) {
      curxy(0,8);  printf("\t\t\t\t <%d>\n", 1+i/16);
      printf("\t\t\t\t %s", "BTN");
      if (getchar()==BTNLEFT) {i=(i>=31?i-=32:111);}
      scrclr();
    }
    if (i>126) i=-1;
  }
}


Zurück zu „textbasierte Programmiersoftware“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 12 Gäste

Lego Mindstorms EV3, NXT und RCX Forum : Haftungsauschluss