Karl Zweimüller / TextLCDScroll

Dependents:   RF22_MAX_test_Send

Committer:
charly
Date:
Tue Mar 12 20:00:04 2013 +0000
Revision:
4:92a07dbc9222
Parent:
3:1d7a7a249647
Child:
5:e3b565c4190c
Strings with  length = columns() can be displayed without scolling.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
charly 3:1d7a7a249647 1 #include <string.h>
charly 0:0ae9963c4e06 2 #include "TextLCDScroll.h"
charly 0:0ae9963c4e06 3 #include "mbed.h"
charly 0:0ae9963c4e06 4
charly 2:66723c542cef 5 TextLCDScroll::TextLCDScroll(PinName rs, PinName e, PinName d4, PinName d5,
charly 3:1d7a7a249647 6 PinName d6, PinName d7, TextLCD::LCDType type): TextLCD(rs,e,d4,d5,d6,d7,type)
charly 3:1d7a7a249647 7 {
charly 0:0ae9963c4e06 8
charly 2:66723c542cef 9 _direction = new int[rows()];
charly 2:66723c542cef 10 _actPos = new int[rows()];
charly 3:1d7a7a249647 11
charly 2:66723c542cef 12 //_mode = leftright;
charly 2:66723c542cef 13 _mode = left;
charly 0:0ae9963c4e06 14
charly 2:66723c542cef 15 setSpeed(5);
charly 3:1d7a7a249647 16 cls();
charly 0:0ae9963c4e06 17
charly 2:66723c542cef 18 // reduce interrupt level for the ticker timers. so other things (RF22 ) come first
charly 3:1d7a7a249647 19 //NVIC_SetPriority(TIMER3_IRQn, 10);
charly 2:66723c542cef 20
charly 2:66723c542cef 21 }
charly 0:0ae9963c4e06 22
charly 3:1d7a7a249647 23 void TextLCDScroll::cls()
charly 3:1d7a7a249647 24 {
charly 3:1d7a7a249647 25 for (int i=0; i<rows(); i++) {
charly 3:1d7a7a249647 26 _direction[i]=1;
charly 3:1d7a7a249647 27 _actPos[i] = 0;
charly 3:1d7a7a249647 28 setLine(i,"");
charly 3:1d7a7a249647 29 TextLCD::cls();
charly 3:1d7a7a249647 30 }
charly 3:1d7a7a249647 31 }
charly 0:0ae9963c4e06 32
charly 3:1d7a7a249647 33 bool TextLCDScroll::setLine( int Line, char *str)
charly 3:1d7a7a249647 34 {
charly 2:66723c542cef 35 if (Line >= 0 && Line < rows()) {
charly 3:1d7a7a249647 36 // free the old memory
charly 3:1d7a7a249647 37 if (line[Line] != NULL) {
charly 3:1d7a7a249647 38 free(line[Line]);
charly 3:1d7a7a249647 39 }
charly 3:1d7a7a249647 40 // malloc new space for string
charly 3:1d7a7a249647 41 line[Line] = (char*)malloc((strlen(str)+1)*sizeof(char));
charly 3:1d7a7a249647 42 //copy the string
charly 3:1d7a7a249647 43 strcpy(line[Line], str);
charly 2:66723c542cef 44 // be sure to refresh the display
charly 3:1d7a7a249647 45 TextLCD::cls();
charly 2:66723c542cef 46 // start at beginning again
charly 2:66723c542cef 47 _actPos[Line] = 0;
charly 2:66723c542cef 48 _direction[Line] =1;
charly 2:66723c542cef 49 return(true);
charly 2:66723c542cef 50 } else {
charly 2:66723c542cef 51 return (false);
charly 2:66723c542cef 52 }
charly 2:66723c542cef 53 }
charly 0:0ae9963c4e06 54
charly 3:1d7a7a249647 55 bool TextLCDScroll::setSpeed( int speed)
charly 3:1d7a7a249647 56 {
charly 2:66723c542cef 57 if ((speed >= 0.1) && (speed <= 10)) {
charly 2:66723c542cef 58 tick.detach();
charly 2:66723c542cef 59 if (_mode == leftright)
charly 2:66723c542cef 60 tick.attach(this,&TextLCDScroll::ScrollRightLeft, 1.0/speed);
charly 2:66723c542cef 61 else
charly 2:66723c542cef 62 tick.attach(this,&TextLCDScroll::ScrollLeft, 1.0/speed);
charly 2:66723c542cef 63 return(true);
charly 2:66723c542cef 64 } else {
charly 2:66723c542cef 65 return(false);
charly 2:66723c542cef 66 }
charly 2:66723c542cef 67 }
charly 2:66723c542cef 68
charly 3:1d7a7a249647 69 bool TextLCDScroll::setScrollMode( ScrollModes mode)
charly 3:1d7a7a249647 70 {
charly 2:66723c542cef 71 _mode = mode;
charly 2:66723c542cef 72 return(true);
charly 2:66723c542cef 73 }
charly 2:66723c542cef 74
charly 3:1d7a7a249647 75 void TextLCDScroll::ScrollRightLeft()
charly 3:1d7a7a249647 76 {
charly 3:1d7a7a249647 77 int i, j;
charly 3:1d7a7a249647 78 //all rows
charly 2:66723c542cef 79 for (i=0; i<rows(); i++) {
charly 3:1d7a7a249647 80 // all columns
charly 3:1d7a7a249647 81 for (j=0; j<columns(); j++) {
charly 3:1d7a7a249647 82
charly 3:1d7a7a249647 83 locate(j,i);
charly 3:1d7a7a249647 84 // is string shorter than width of display
charly 4:92a07dbc9222 85 if (strlen(line[i]) <= columns()) {
charly 3:1d7a7a249647 86 if (j < strlen(line[i])) {
charly 3:1d7a7a249647 87 putc(line[i][j]);
charly 2:66723c542cef 88 } else {
charly 3:1d7a7a249647 89 putc(' ');
charly 2:66723c542cef 90 }
charly 3:1d7a7a249647 91 } else { // sting is longer -> scroll
charly 3:1d7a7a249647 92 if ((_actPos[i]+j < columns()) || (_actPos[i]+j >= columns()+strlen(line[i]))) {
charly 3:1d7a7a249647 93 putc(' ');
charly 2:66723c542cef 94 } else {
charly 3:1d7a7a249647 95 putc(line[i][_actPos[i]-columns()+j]);
charly 2:66723c542cef 96 }
charly 2:66723c542cef 97 }
charly 0:0ae9963c4e06 98 }
charly 3:1d7a7a249647 99 // shift start-position of string
charly 3:1d7a7a249647 100 // left = ++
charly 3:1d7a7a249647 101 if (_direction[i] == 1) {
charly 3:1d7a7a249647 102 if (_actPos[i] < (strlen(line[i])+(columns()))) {
charly 3:1d7a7a249647 103 _actPos[i]++;
charly 3:1d7a7a249647 104 } else {
charly 3:1d7a7a249647 105 _direction[i] = 0; // reverse direction
charly 3:1d7a7a249647 106 _actPos[i]--;
charly 3:1d7a7a249647 107 }
charly 3:1d7a7a249647 108 } else { //right = --
charly 3:1d7a7a249647 109 if (_actPos[i] > 1 ) {
charly 3:1d7a7a249647 110 _actPos[i]--;
charly 3:1d7a7a249647 111 } else {
charly 3:1d7a7a249647 112 _direction[i] = 1; // reverse direction
charly 3:1d7a7a249647 113 _actPos[i]++;
charly 3:1d7a7a249647 114 }
charly 3:1d7a7a249647 115 }
charly 3:1d7a7a249647 116
charly 0:0ae9963c4e06 117 }
charly 3:1d7a7a249647 118
charly 2:66723c542cef 119 }
charly 0:0ae9963c4e06 120
charly 3:1d7a7a249647 121 void TextLCDScroll::ScrollLeft()
charly 3:1d7a7a249647 122 {
charly 3:1d7a7a249647 123 int i, j;
charly 3:1d7a7a249647 124 //all rows
charly 2:66723c542cef 125 for (i=0; i<rows(); i++) {
charly 3:1d7a7a249647 126 // all columns
charly 3:1d7a7a249647 127 for (j=0; j<columns(); j++) {
charly 3:1d7a7a249647 128
charly 3:1d7a7a249647 129 locate(j,i);
charly 3:1d7a7a249647 130 // is string shorter than width of display
charly 4:92a07dbc9222 131 if (strlen(line[i]) <= columns()) {
charly 3:1d7a7a249647 132 if (j < strlen(line[i])) {
charly 3:1d7a7a249647 133 putc(line[i][j]);
charly 0:0ae9963c4e06 134 } else {
charly 3:1d7a7a249647 135 putc(' ');
charly 3:1d7a7a249647 136 }
charly 3:1d7a7a249647 137 } else { // sting is longer -> scroll
charly 3:1d7a7a249647 138 if ((_actPos[i]+j < columns()) || (_actPos[i]+j >= columns()+strlen(line[i]))) {
charly 3:1d7a7a249647 139 putc(' ');
charly 3:1d7a7a249647 140 } else {
charly 3:1d7a7a249647 141 putc(line[i][_actPos[i]-columns()+j]);
charly 0:0ae9963c4e06 142 }
charly 0:0ae9963c4e06 143 }
charly 3:1d7a7a249647 144 }
charly 3:1d7a7a249647 145 // shift start-position of string
charly 3:1d7a7a249647 146 if (_actPos[i] < (strlen(line[i])+(columns()))) {
charly 3:1d7a7a249647 147 _actPos[i]++;
charly 2:66723c542cef 148 } else {
charly 3:1d7a7a249647 149 _actPos[i]=0;
charly 0:0ae9963c4e06 150 }
charly 0:0ae9963c4e06 151 }
charly 3:1d7a7a249647 152
charly 2:66723c542cef 153 }