1
0
mirror of https://github.com/arduino/Arduino.git synced 2024-12-01 12:24:14 +01:00
Arduino/libraries/Robot_Control/utility/RobotTextManager.cpp
2013-05-15 10:47:17 +02:00

193 lines
4.1 KiB
C++

#include <avr/pgmspace.h>
#include <ArduinoRobot.h>
#include "VirtualKeyboard.h"
#include "RobotTextManager.h"
#include "scripts_Hello_User.h"
const int TextManager::lineHeight=10;
const int TextManager::charWidth=6;
void TextManager::setMargin(int margin_left,int margin_top){
this->margin_left=margin_left;
this->margin_top=margin_top;
}
int TextManager::getLin(int lineNum){
return lineNum*lineHeight+margin_top;
}
int TextManager::getCol(int colNum){
return colNum*charWidth+margin_left;
}
void TextManager::writeText(int lineNum, int colNum, char* txt, bool onOff){
if(!onOff)
Robot.setTextColor(WHITE);
Robot.setCursor(getCol(colNum),getLin(lineNum));
Robot.print(txt);
Robot.setTextColor(BLACK);
}
void TextManager::drawInput(bool onOff){
if(!onOff)
Robot.setTextColor(WHITE);
Robot.setCursor(getCol(inputCol),getLin(inputLin)+1);
Robot.print('_');
Robot.setTextColor(BLACK);
}
void TextManager::mvInput(int dire){
drawInput(0);
if(dire<0){
if(inputPos>0){
inputPos--;
inputCol--;
}
}else{
if(inputPos<16){
inputPos++;
inputCol++;
}
}
drawInput(1);
}
char TextManager::selectLetter(){
static int oldVal;
char val=map(Robot.knobRead(),0,1023,32,125);
if(val==oldVal){
return 0; //No changes
}else{
oldVal=val;
return val; //Current letter
}
}
void TextManager::refreshCurrentLetter(char letter){
if(letter){
writeText(inputLin,inputCol,inputPool+inputPos,false);//erase
inputPool[inputPos]=letter;
writeText(inputLin,inputCol,inputPool+inputPos,true);//write
}
}
void TextManager::getInput(int lin, int col){
writeText(lin,col,">"); //Input indicator
writeText(lin, col+1, inputPool);
inputLin=lin; //Ini input cursor
inputCol=col+1;
inputPos=0;
drawInput(true);
Vkey.display(100);//Vkey is a object of VirtualKeyboard class
while(true){
switch(Robot.keyboardRead()){
case BUTTON_LEFT:
//Robot.beep(BEEP_SIMPLE);
mvInput(-1);
break;
case BUTTON_RIGHT:
//Robot.beep(BEEP_SIMPLE);
mvInput(1);
break;
case BUTTON_MIDDLE:
//Robot.beep(BEEP_DOUBLE);
char selection=Vkey.getSelection();
if(selection!='\0'){
refreshCurrentLetter(selection);
mvInput(1);
}else{
drawInput(false);
return;
}
}
Vkey.run();
delay(10);
}
}
void TextManager::setInputPool(int code){
switch(code){
case USERNAME:
Robot.userNameRead(inputPool);
break;
case ROBOTNAME:
Robot.robotNameRead(inputPool);
break;
case CITYNAME:
Robot.cityNameRead(inputPool);
break;
case COUNTRYNAME:
Robot.countryNameRead(inputPool);
break;
}
for(int i=0;i<18;i++){
if(inputPool[i]=='\0'){
for(int j=i;j<18;j++){
inputPool[j]='\0';
}
break;
}
}
}
void TextManager::pushInput(int code){
switch(code){
case USERNAME:
Robot.userNameWrite(inputPool);
break;
case ROBOTNAME:
Robot.robotNameWrite(inputPool);
break;
case CITYNAME:
Robot.cityNameWrite(inputPool);
break;
case COUNTRYNAME:
Robot.countryNameWrite(inputPool);
break;
}
for(int i=0;i<18;i++){
inputPool[i]='\0';
}
}
void TextManager::input(int lin,int col, int code){
setInputPool(code);
getInput(lin,col);
pushInput(code);
}
void TextManager::showPicture(char * filename, int posX, int posY){
Robot.pause();
Robot._drawBMP(filename,posX,posY);
Robot.play();
}
void TextManager::getPGMtext(int seq){
//It takes a string from program space, and fill it
//in the buffer
//if(in hello user example){
if(true){
strcpy_P(PGMbuffer,(char*)pgm_read_word(&(::scripts_Hello_User[seq])));
}
}
void TextManager::writeScript(int seq, int line, int col){
//print a string from program space to a specific line,
//column on the LCD
//first fill the buffer with text from program space
getPGMtext(seq);
//then print it to the screen
textManager.writeText(line,col,PGMbuffer);
}
TextManager textManager=TextManager();