Projekte_werkstatt
/
Mbed-Mensch-3-Menu
Fork of Mbed-Mensch-1 by
Diff: main.cpp
- Revision:
- 5:f4db4cd245e3
- Parent:
- 4:2acb70f9cd22
- Child:
- 6:eda2b36d5be1
diff -r 2acb70f9cd22 -r f4db4cd245e3 main.cpp --- a/main.cpp Mon Feb 08 18:59:08 2016 +0000 +++ b/main.cpp Fri Mar 11 07:47:58 2016 +0000 @@ -1,5 +1,7 @@ #include "mbed.h" #include "WS2812B.h" +#include "TextLCD.h" +#include <string> I2C i2c(P0_5,P0_4); Serial port(P0_19,P0_18); @@ -10,6 +12,7 @@ //BusIn btn(P1_16,P0_23,P0_10,P0_15); RGBOut rgb(P0_21,P0_9,P1_15); +TextLCD lcd(p21, p22, p26, p25, p24, p23,TextLCD::LCD20x4); LedOut Feld (P0_13); //LedOut Other(P0_13); //-> Würfel (ersten 3 LED in Binär-4. LED für 7. Zustand), Spieler, Start, Ziel, Referenz(auch RGB am board) @@ -21,170 +24,39 @@ InterruptIn Button3(P0_10); InterruptIn Button4(P0_15); -Timer Random; -Timer Dice; - -Ticker DiceAnim; -void DiceStart(); -void DiceStop(); -void DiceRun(); -void setDice(char number); -void DicePrint(); -char dicePos = 0; -char diceEn = 0; -char diceTick = 0; -char diceNum = 0; -int16_t diceDecode [7]= {0x1,0x88,0x89,0xAA,0xAB,0x1BA,0x154}; - -#define Feldgrose 10 -#define Spieler 4 -#define Steine 4 +InterruptIn DD_A(P0_22);//20 +InterruptIn DD_B(P0_16);//19 +InterruptIn DD_C(P0_14);//18 +DigitalIn DD_D(P0_14); +BusIn DD(P0_22,P0_16); +//Timeout DD_reset; +char DD_last; +char DD_d; -char PlayPos[Spieler*Steine]; //Zahl zwischen 0 & 47 ((0xC0 -> Spieler)>>2 / 0x03 -> Stein) -char Start[Spieler]; //Enthält den Index für PlayPos (nur das 'normale' Spielfend) -char Ziel[Spieler]; //Enthält den Index für PlayPos (nur das 'normale' Spielfend) -char Drann; //Spieler, der drann ist -char count; //Für 6er & mehrfaches Würfeln beim Ansetzen -char last[Spieler]; //zuletzt benutzte Spielstein, der zuletzt benutzt wurde -char moglich[Steine]; -char selected; //der aktuell ausgewählte Zug -char Field[Spieler*Feldgrose]; //Enthält den Index für PlayPos (nur das 'normale' Spielfend) -uint32_t Farben[Spieler]; //Berechnete Hellichkeiten der Speiler fertig zur Ausgabe... -void FieldPrint(); //Ausgabe auf Com-Port -void FieldGenerate(); //Berechnung von PlayPos auf Start, Ziel, Field -void FeldPrint(); //Ausgabe von Field auf den Led-Streifen (Feld) der Farben -void GameCal(); -void moveNext(); -void moveLast(); -Ticker MoveAnim; -void MoveRun(); -char MoveShow; -void MoveDo(); -void ColorPrint(uint32_t color); - -void reset() -{ - MoveAnim.detach(); - DiceAnim.detach(); - for(char i = 0;i<Spieler*Steine;i++) - PlayPos[i]=i%4; - Drann=0; - diceEn=0; - myled = myled&0xF0F; - DicePrint(); - rgb.set_RGB(0); - FieldGenerate(); - FieldPrint(); - FeldPrint(); -} +void dreh(); +void druck(); -void btn2() -{ - Drann = 0; - PlayPos[1]=Steine+Feldgrose*Spieler; - //PlayPos[2]=Steine+Feldgrose*Spieler+1; - PlayPos[3]=Steine+Feldgrose*Spieler+2; - PlayPos[0]=Steine+Feldgrose*Spieler-1; - FieldGenerate(); - FieldPrint(); - FeldPrint(); - -} -void btn3() -{ - /* - diceNum=2; - diceEn=2; - Drann = 1; - PlayPos[(1<<2)+0]=5; - PlayPos[(1<<2)+1]=7; - PlayPos[(1<<2)+2]=10; - PlayPos[(1<<2)+3]=12; - DicePrint(); - FieldGenerate(); - FieldPrint(); - FeldPrint(); - GameCal(); - */ - port.printf("W%c%c\n",27+0x3E,27+0x7); - for(char i=0;i<Spieler;i++) - { - port.printf("w"); - ColorPrint(Farben[i]); - wait(1); - } -} -void btn4() -{ - /* - for(char i = 0;i<Spieler;i++) - PlayPos[i<<2]=4; - FieldGenerate(); - FieldPrint(); - */ - myled = 0; - rgb.set(0,0,0); - port.printf("LBtn 4 Pressed\n"); -} +void up(); +void down(); +void accept(); +void exit(); +void print_menu(); +void Control(); -void btn4_() -{ - port.printf("LBtn 4 Released\n"); -} +//string test (""); +// "1234567890123456789","1234567890123456789","1234567890123456789","1234567890123456789", ,"1234567890123456789","1234567890123456789","1234567890123456789", +const char * const text_ln0[] = {"MENU: ","Spiel-Menu: ","Anzeige-Menu: ","Speicher-Menu: ","","7.Zustand-Menu: ","Farben-Menu: ","Spiel-Menu: ","","Spielregeln-Menu: ","Hell./Sp.Led-Menu: ","Config-Menu: ","","Autplay-Menu: ","Wurfel-Menu: ","Ofline/Com-Menu: "}; +const char * const text_ln1[] = {"Spiel ","7.Zustand ","Farben ","Spiel ","","Disable "," ","Laden ","","Smeiszwang <I/0> ","Wert: <wert> ","Laden ","","Zeit ","Farbverhalten ","New "}; +const char * const text_ln2[] = {"Anzeige ","Spielregeln ","Hellichkeit/Sp.Led ","Config. ","","kleinstmoglich ","SP: 1 2 3 4 ","Speichern ","","Go Home first <I/0>","Sp.Led-Verhalten ","Speichern ","","Agro/Taktik ","Farb def ","Reset "}; +const char * const text_ln3[] = {"Speicher ","Autoplay ","Wurfel ","Ofline/Com ","","grostmoglich "," ","Reset ","","Ausfahrzwang <I/0> ","Andert: <wert> ","Reset ","","Enable/Manuell ","Hellichkeit ","Com "}; -void Control() -{ - while(port.readable ()) - { - char message = port.getc(); - switch(message) - { - case '1': - setDice(1); - break; - case '2': - setDice(2); - break; - case '3': - setDice(3); - break; - case '4': - setDice(4); - break; - case '5': - setDice(5); - break; - case '6': - setDice(6); - break; - case '7': - setDice(7); - break; - case 'A': - DiceStart(); - break; - case 'a': - DiceStop(); - break; - case 'B': - moveNext(); - break; - case 'C': - moveLast(); - break; - case 'D': - MoveDo(); - break; - case 'I': - reset(); - break; - } - } -} + +char selected[256]; +char depth = 0; int main() { - Random.start(); + //Random.start(); //Random.stop(); //Random.read_us(); @@ -193,460 +65,207 @@ //.attach_us(&main,[micro-sec]); //.detach(); - Button0.rise(&reset); - Button1.rise(&DiceStart); - Button1.fall(&DiceStop); - Button2.rise(&btn2); - Button3.rise(&btn3); - Button4.rise(&btn4); - Button4.fall(&btn4_); - //myled = 0xFFF; port.baud(76800); port.format(8,Serial::None, 1); port.attach(&Control); /* - Farben[0]=0x001000;//Grün - Farben[1]=0x100000;//Rot - Farben[2]=0x000010;//Blau - Farben[3]=0x001010;//Gelb - //Farben[4]=0xFFFFFF;//Weiß + __disable_irq(); + __enable_irq(); */ - Farben[0]=0x00FF00;//Grün - Farben[1]=0xFF0000;//Rot - Farben[2]=0x0000FF;//Blau - Farben[3]=0x00FFFF;//Gelb + wait(0.01); + DD_A.mode(PullDown); + DD_B.mode(PullDown); + DD_C.mode(PullDown); + DD_A.rise(&dreh); + DD_A.fall(&dreh); + DD_B.rise(&dreh); + DD_B.fall(&dreh); + DD_C.rise(&druck); + DD_C.fall(&druck); + DD_last = DD; + DD_d=DD_D; - __disable_irq(); - for(char i = 0;i<Spieler;i++) - { - Feld.WriteLed(Farben[i]); - for(char j = 0;j<Feldgrose-1;j++) - Feld.WriteLed(0); - } - __enable_irq(); - + //text_ln0[0]=""; + //port.printf("D%c%ctest\n",27,27); + print_menu(); while(1) ; } - -void DiceStart() +void Control() { - if(diceEn==0) + while(port.readable ()) { - Dice.start(); - DiceAnim.attach(&DiceRun,0.1); - diceEn = 1; - diceTick = 1; - DicePrint(); - } -} -void DiceStop() -{ - if(diceEn==1) - { - if(Dice.read_us()> 200) + char message = port.getc(); + switch(message) { - DiceAnim.detach(); - diceEn = 2; - diceTick = 0; - diceNum = Random.read_us()%7; - diceNum = (Dice.read_us()+diceNum)%7+1; - Dice.stop(); - Dice.reset(); - if(diceNum==7) - { - diceEn=3; - for(char i = 0;i<Steine;i++) - if((PlayPos[(Drann<<2)|i]>Steine -1)&&(PlayPos[(Drann<<2)|i] < Steine + Feldgrose*Spieler)) - for(char j = 1;j<=6;j++) - { - char temp = Field[(PlayPos[(Drann<<2)|i]- Steine + Feldgrose * Drann+j) % (Feldgrose*Steine)]; - if(temp>0) - { - temp--; //(Spieler<<2)|Stein - temp = (temp&0xC)>>2;//Spieler - if(temp!=Drann) - if(j<diceNum) - diceNum=j; - } - } - //PlayPos[(Drann<<2)|i] im Feld suchen, weiter setzen, wenn treffer, der kleiner als diceNum ->setzen von diceNum - }//DiceNum == 7 - if(diceNum==7) - diceNum=6; - port.printf("LDiceNum:%d\n",diceNum); - DicePrint(); - GameCal(); + case 'D': + port.printf("Ldepth:%d,selected[depth-1]:%d\n",depth,selected[depth-1]); + break; + case 'E': + exit(); + break; + case 'F': + up(); + break; + case 'G': + down(); + break; + case 'H': + accept(); + break; + case 'I': + depth=0; + selected[0]=0; + print_menu(); + break; } } } -void setDice(char number) -{ - if(diceEn==1) - { - DiceAnim.detach(); - diceTick = 0; - Dice.stop(); - Dice.reset(); - } - diceEn = 2; - diceNum = number; - if(diceNum>7) - diceNum=7; - if(diceNum==7) - { - diceEn=3; - for(char i = 0;i<Steine;i++) - if((PlayPos[(Drann<<2)|i]>3)&&(PlayPos[(Drann<<2)|i] < 44)) - for(char j = 1;j<=6;j++) - { - char temp = Field[(PlayPos[(Drann<<2)|i]- Steine + Feldgrose * Drann+j) % (Feldgrose*Steine)]; - if(temp>0) - { - temp--; //(Spieler<<2)|Stein - temp = (temp&0xC)>>2;//Spieler - if(temp!=Drann) - if(j<diceNum) - diceNum=j; - } - } - //PlayPos[(Drann<<2)|i] im Feld suchen, weiter setzen, wenn treffer, der kleiner als diceNum ->setzen von diceNum - }//DiceNum == 7 - if(diceNum==7) - diceNum=6; - port.printf("LForceDice:%d\n",diceNum); - DicePrint(); - GameCal(); -} -void DiceRun() +void dreh() { - if(diceTick) - { - diceTick=0; - if(dicePos<7) - dicePos++; - else - dicePos=0; - } + char temp = DD; + if(DD_last == 3) + { + if(temp == 0) + DD_last = 0; + } else - diceTick=1; - DicePrint(); -} - -void DicePrint() -{ - switch(diceEn) { - case 0: - myled=(myled&0xFF0); - port.printf("W%c%c\n",27,27); - break; - case 1: - char dice_help = 0xFF-(1<<dicePos); - myled=(myled&0xFF0)|(5)|(diceTick<<1); - //myled = (myled&0xF)|(dice_help<<4); - - port.printf("W%c%c\n" , 27 + diceTick+((dice_help&0x1F)<<1),27 + ((dice_help& 0xE0)>>5)); - break; - case 2: - myled=(myled&0xFF0)|(diceNum); - //myled=myled|0xFF0; - - port.printf("W%c%c\n" , 27 +(diceDecode[diceNum-1]&0x3F),27 + ((diceDecode[diceNum-1]&0x1C0)>>6)); - break; - case 3: - myled=(myled&0xFF0)|(diceNum)|8; - //myled=myled|0xFF0; - - port.printf("W%c%c\n" , 27 +(diceDecode[diceNum-1]&0x3F),27 + ((diceDecode[diceNum-1]&0x1C0)>>6)); - break; + if(temp == 3) + { + if(DD_last == 1) + up(); + if(DD_last == 2) + down(); + } + DD_last = temp; } } -void FieldGenerate() +void druck() { - for(char i = 0; i<Spieler*Feldgrose;i++) - Field[i]=0; //Feld zurücksetzen - - for(char i = 0; i<Spieler;i++) - for(char j = 0; j<Steine;j++) - { - if (PlayPos[(i<<2)|j] >= Steine) - { - if (PlayPos[(i<<2)|j] > Steine * Feldgrose+Steine-1) - { - if (PlayPos[(i<<2)|j] < Steine * Feldgrose+Steine*2) - Ziel[PlayPos[(i<<2)|j] - Steine * Feldgrose+Steine] = ((i<<2)|j) + 1; - //Ziel PlayPos[(i<<2)|j] - 44 - } - else - Field[(PlayPos[(i<<2)|j]- Steine + Feldgrose * i) % (Steine * Feldgrose)] = ((i<<2)|j) + 1; - //Feld (PlayPos[(i<<2)|j]- 4 + 10 * i) % 40 - } - else - Start[PlayPos[(i<<2)|j]] = ((i<<2)|j)+1; - //start PlayPos[(i<<2)|j] - } -} - -void FieldPrint() -{ - port.printf("F"); - for(char i = 0;i<Spieler*Steine;i++) - { - port.printf("%c",27+PlayPos[i]); - } - port.printf("\n"); -} - -void FeldPrint() -{ - __disable_irq(); - for(char i = 0;i<Spieler*Feldgrose;i++) - if(Field[i]>0) - Feld.WriteLed(Farben[((Field[i]- 1)&0x0C)>>2]); - else - Feld.WriteLed(0); - __enable_irq(); + if(DD_D==DD_d) + return; + else if(DD_D) + accept(); + DD_d=DD_D; } -/* -char PlayPos[Spieler*Steine]; //Zahl zwischen 0 & 47 ((0xC0 -> Spieler)>>2 / 0x03 -> Stein) -char PlayPosOld[Spieler*Steine]; -char Start[Spieler]; //Enthält den Index für PlayPos (nur das 'normale' Spielfend) -char Ziel[Spieler]; //Enthält den Index für PlayPos (nur das 'normale' Spielfend) -char Drann; //Spieler, der drann ist -char count; //Für 6er & mehrfaches Würfeln beim Ansetzen -char last[Spieler]; //zuletzt benutzte Spielstein, der zuletzt benutzt wurde -char moglich[Steine]; -char selected; //der aktuell ausgewählte Zug -char Field[Spieler*Feldgrose]; //Enthält den Index für PlayPos (nur das 'normale' Spielfend) -uint32_t Farben[Spieler]; //Berechnete Hellichkeiten der Speiler fertig zur Ausgabe... -void FieldPrint(); //Ausgabe auf Com-Port -void FieldGenerate(); //Berechnung von PlayPos auf Start, Ziel, Field -void FeldPrint(); //Ausgabe von Field auf den Led-Streifen (Feld) der Farben -void GameCal(); -void moveNext(); -void moveLast(); -Ticker MoveAnim; -void MoveRun(); -char MoveShow; -void MovePrint(); */ - -void MoveRun() +void up() { - if(MoveShow) - MoveShow=0; - else - MoveShow = 1; - if(MoveShow>0) + if(depth>0) { - __disable_irq(); - port.printf("F"); - for(char i = 0;i<Spieler*Steine;i++) - { - if(i==((Drann<<2)|selected)) - { - if(PlayPos[i]<Steine) - port.printf("%c",27+Steine); - else - port.printf("%c",27+PlayPos[i]+diceNum); - } - else - port.printf("%c",27+PlayPos[i]); - } - port.printf("\n"); - __enable_irq(); + if(selected[depth-1]<1) + selected[depth-1]=3; + else + selected[depth-1]--; } - else - FieldPrint(); + print_menu(); } - -void moveNext() +void down() { - selected = (selected+1)%Steine; - for(char i = 0;i<Steine;i++) - if(moglich[selected]>0) - break; - else - selected = (selected+1)%Steine; -} - -void moveLast() -{ - selected = (selected+3)%Steine; - for(char i = 0;i<Steine;i++) - if(moglich[selected]>0) - break; - else - selected = (selected+3)%Steine; -} - -void GameCal() -{ - char drausen = 0; //Ziel - char feld = 0; - char drinnen = 0; //start - char moglichAny = 1; - for(char i = 0;i<Steine;i++) + if(depth>0) { - if(PlayPos[(Drann<<2)|i]>3) - { - if(PlayPos[(Drann<<2)|i] > 43) - drausen++; - else - feld++; - } + if(selected[depth-1]>2) + selected[depth-1]=0; else - drinnen++; - moglich[i]=0; + selected[depth-1]++; } - //Berechnung - //Ausfahren: - //drinnen >0 (Noch Spieler drinnen?) - //Startfeld ist von Spieler belegt - //Ziel ist frei - if((drinnen>0)&&(moglichAny)) + print_menu(); +} +void accept() +{ + if(depth>0) { - //port.printf("LDrinnen\n"); - if(((((Field[Feldgrose*Drann]-1) &0x0C) >>2)==Drann)&&(Field[Feldgrose*Drann]>0)) + if(depth<=3) { - //port.printf("LAusfahrt Belegt\n"); - if(((((Field[(Feldgrose*Drann+diceNum)%(Feldgrose*Spieler)]-1) &0x0C) >>2)!=Drann)||(Field[(Feldgrose*Drann+diceNum)%(Feldgrose*Spieler)]==0)) + if(selected[depth-1]==0) + exit(); + else { - //port.printf("LZiel frei (Done)\n"); - moglich[(Field[Feldgrose*Drann]-1) &0x03] = 1; - moglichAny=0; + selected[depth]=1; + depth++; } } } - - //Ansetzen - // 6 gewürfelt - //drinnen>0 - //Start-feld ist nicht von Spieler belegt - if((drinnen>0)&&(moglichAny)&&(diceNum==6)) + else + depth=1; + print_menu(); +} +void exit() +{ + if(depth>0) { - //port.printf("LDrinnen & 6 \n"); - if(((((Field[Feldgrose*Drann]-1) &0x0C) >>2)!=Drann)||(Field[Feldgrose*Drann]==0)) - { - //port.printf("LAusfahrt frei (Done...Schleife)\n"); - moglichAny=0; - for(char i = 0;i<Steine;i++) - if(PlayPos[(Drann<<2)|i]<Steine) - moglich[i]=1; - } + depth--; + if(depth<=3) + selected[depth]=0; } - - //Fahren - if(moglichAny) + print_menu(); +} +void print_menu() +{ + if(depth>0) { - //port.printf("LNormal...\n"); - for(char i = 0;i<Steine;i++) + if(depth>3)// " " + { + port.printf("D%c%c Custom \n",27,27); + lcd.locate(0,0); + lcd.printf(" Custom "); + } + else { - if(PlayPos[(Drann<<2)|i]>Spieler-1) //Drausen + uint32_t _selected = 0; + for(char i = 0;i<depth-1;i++) + _selected = _selected|(selected[i]<<(i*2)); + //port.printf("L_selected:%d\n",_selected); + lcd.locate(1,0); + lcd.printf(text_ln0[_selected]); + port.printf("D%c%c%s\n",28,27,text_ln0[_selected]); + lcd.locate(1,1); + lcd.printf(text_ln1[_selected]); + port.printf("D%c%c%s\n",28,28,text_ln1[_selected]); + lcd.locate(1,2); + lcd.printf(text_ln2[_selected]); + port.printf("D%c%c%s\n",28,29,text_ln2[_selected]); + lcd.locate(1,3); + lcd.printf(text_ln3[_selected]); + port.printf("D%c%c%s\n",28,30,text_ln3[_selected]); + + for(char i=0;i<4;i++) { - if((PlayPos[(Drann<<2)|i]-Steine+diceNum) < Feldgrose*Spieler)//Zeil noch am Feld + lcd.locate(0,i); + if((selected[depth-1]+0)==i) { - char temp = Field[(PlayPos[(Drann<<2)|i]- Steine + Feldgrose * Drann+diceNum) % (Feldgrose*Steine)]; //zielfeld - if(temp>0) + if(i==0) { - //myled = myled|temp<<8; - temp--; //(Spieler<<2)|Stein - temp = (temp&0xC)>>2;//Spieler - if(temp!=Drann) //zielfeld ist nicht ich - moglich[i]=1; + port.printf("D%c%c<\n",27,i+27); + lcd.putc('<'); } - else//Feld ist leer - moglich[i]=1; + else + { + port.printf("D%c%c>\n",27,i+27); + lcd.putc('>'); + } } else - {//Kollisionsberechnung ins Ziel... - if((PlayPos[(Drann<<2)|i]+diceNum)<(Steine*2+ Feldgrose*Spieler))//Schiest nicht über das Ziel hinaus... - if(Ziel[PlayPos[(Drann<<2)|i]-Steine-Feldgrose*Spieler+diceNum]==0)//Zielfeld ist leer (enthält ja nur mich) - moglich[i]=1; + { + port.printf("D%c%c \n",27,i+27); + lcd.putc(' '); } } } } - - moglichAny=0; - myled = myled&0xF0F; - for(char i = 0;i<Steine;i++) - { - myled = myled|(moglich[i]<<i+4); - moglichAny = moglichAny | moglich[i]; - } - if(moglichAny) - { - selected = (last[Drann]+Steine-1)%Steine; - moveNext(); - MoveAnim.attach(&MoveRun,0.3); - } else { - if(feld) - diceEn = 1; - else - { - if(count<3) - { - diceEn=0; - count++; - port.printf("LCount: %d\n",count); - } - } + lcd.cls(); + lcd.printf(" Spiel lauft..."); + lcd.locate(0,3); + lcd.printf("12345678901234567890"); + port.printf("D%c%c Spiel lauft... \n",27,27); + port.printf("D%c%c \n",27,28); + port.printf("D%c%c \n",27,29); + port.printf("D%c%c12345678901234567890\n",27,30); } } -void MoveDo() -{ - if(diceEn>1) - { - if(PlayPos[(Drann<<2)|selected]<Steine) - { - PlayPos[(Drann<<2)|selected] = Steine; - char temp = Field[Drann*Feldgrose]; - if(temp>0) - { - //myled = myled|temp<<8; - temp--; //(Spieler<<2)|Stein - PlayPos[temp] = (temp & 0x03); //rücksetzung des Feldes... - } - } - else - { - PlayPos[(Drann<<2)|selected] += diceNum; - //PlayPos[(Drann<<2)|selected] - if((PlayPos[(Drann<<2)|selected]>=Steine)&&(PlayPos[(Drann<<2)|selected]<Steine+Spieler*Feldgrose)) - { - //Field>0 - char temp = Field[ ( PlayPos[(Drann<<2)|selected] - Steine + (Feldgrose * Drann) ) % (Feldgrose*Steine) ]; - if(temp>0) - { - //myled = myled|temp<<8; - temp--; //(Spieler<<2)|Stein - PlayPos[temp] = (temp & 0x03); //rücksetzung des Feldes... - } - } - } - MoveAnim.detach(); - last[Drann]=selected; - if(diceNum<6) - { - Drann = (Drann+1)%Spieler; - } - diceEn = 0; - count = 0; - DicePrint(); - myled = myled&0xF0F; - FieldGenerate(); - FieldPrint(); - FeldPrint(); - } -} -void ColorPrint(uint32_t color) -{ - port.printf("%c%c%c%c\n",27+((color&0xFC0000)>>18),27+((color&0x03f000)>>12),27+((color&0x000FC0)>>6),27+(color&0x00003F)); -} \ No newline at end of file