Extendes Version of TextLCD which scrolls oversized lines.

Dependents:   RF22_MAX_test_Send

Extended version of TextLCD, which can scoll oversized lines. Uses a ticker!

Committer:
charly
Date:
Thu Apr 04 19:07:26 2013 +0000
Revision:
5:e3b565c4190c
Parent:
4:92a07dbc9222
Disable Ticker while changing settings. realloc instead of malloc

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