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!
TextLCDScroll.cpp@5:e3b565c4190c, 2013-04-04 (annotated)
- 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?
User | Revision | Line number | New 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 | } |