Data reception demo.

Dependencies:   modem_ref_helper CRC

Committer:
Jeej
Date:
Thu Oct 11 14:46:39 2018 +0000
Revision:
11:7df24b241621
Parent:
1:55636c88cd5e
Activate stack errors. Relaxed modem version check.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 1:55636c88cd5e 1 /* ============================================
Jeej 1:55636c88cd5e 2 Modified Code from Crius
Jeej 1:55636c88cd5e 3 The CriusOLED Hardware MUST be modified for correct function of ACK
Jeej 1:55636c88cd5e 4 Copyright (c) 2014 Michael Ruck michael@ruck.com
Jeej 1:55636c88cd5e 5
Jeej 1:55636c88cd5e 6 Permission is hereby granted, free of charge, to any person obtaining a copy
Jeej 1:55636c88cd5e 7 of this software and associated documentation files (the "Software"), to deal
Jeej 1:55636c88cd5e 8 in the Software without restriction, including without limitation the rights
Jeej 1:55636c88cd5e 9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
Jeej 1:55636c88cd5e 10 copies of the Software, and to permit persons to whom the Software is
Jeej 1:55636c88cd5e 11 furnished to do so, subject to the following conditions:
Jeej 1:55636c88cd5e 12
Jeej 1:55636c88cd5e 13 The above copyright notice and this permission notice shall be included in
Jeej 1:55636c88cd5e 14 all copies or substantial portions of the Software.
Jeej 1:55636c88cd5e 15
Jeej 1:55636c88cd5e 16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Jeej 1:55636c88cd5e 17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Jeej 1:55636c88cd5e 18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Jeej 1:55636c88cd5e 19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Jeej 1:55636c88cd5e 20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Jeej 1:55636c88cd5e 21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
Jeej 1:55636c88cd5e 22 THE SOFTWARE.
Jeej 1:55636c88cd5e 23 ===============================================
Jeej 1:55636c88cd5e 24 */
Jeej 1:55636c88cd5e 25 #include "./data.h"
Jeej 1:55636c88cd5e 26 #include "hwcfg.h"
Jeej 1:55636c88cd5e 27 #define OLED_ADDR (0x78)
Jeej 1:55636c88cd5e 28
Jeej 1:55636c88cd5e 29 I2C i2c(SENSOR_I2C_SDA, SENSOR_I2C_SCL);
Jeej 1:55636c88cd5e 30
Jeej 1:55636c88cd5e 31 void displayOn(void);
Jeej 1:55636c88cd5e 32 void displayOff(void);
Jeej 1:55636c88cd5e 33 void SendByte(unsigned char data);
Jeej 1:55636c88cd5e 34 void sendcommand(unsigned char com);
Jeej 1:55636c88cd5e 35 void SendByte(unsigned char com);
Jeej 1:55636c88cd5e 36 void printBigNumber(unsigned char s, int X, int Y);
Jeej 1:55636c88cd5e 37 void SendByteXY(unsigned char data, int X, int Y);
Jeej 1:55636c88cd5e 38
Jeej 1:55636c88cd5e 39
Jeej 1:55636c88cd5e 40 //==========================================================//
Jeej 1:55636c88cd5e 41 // Turns display on.
Jeej 1:55636c88cd5e 42 void displayOn(void)
Jeej 1:55636c88cd5e 43 {
Jeej 1:55636c88cd5e 44 sendcommand(0xaf); //display on
Jeej 1:55636c88cd5e 45 }
Jeej 1:55636c88cd5e 46
Jeej 1:55636c88cd5e 47 //==========================================================//
Jeej 1:55636c88cd5e 48 // Turns display off.
Jeej 1:55636c88cd5e 49 void displayOff(void)
Jeej 1:55636c88cd5e 50 {
Jeej 1:55636c88cd5e 51 sendcommand(0xae); //display off
Jeej 1:55636c88cd5e 52 }
Jeej 1:55636c88cd5e 53 //==========================================================//
Jeej 1:55636c88cd5e 54 // Actually this sends a byte, not a char to draw in the display.
Jeej 1:55636c88cd5e 55 // Display's chars uses 8 byte font the small ones and 96 bytes
Jeej 1:55636c88cd5e 56 // for the big number font.
Jeej 1:55636c88cd5e 57 void SendByte(unsigned char data)
Jeej 1:55636c88cd5e 58 {
Jeej 1:55636c88cd5e 59 //Create a temporary buffer
Jeej 1:55636c88cd5e 60 char buff[2];
Jeej 1:55636c88cd5e 61
Jeej 1:55636c88cd5e 62 //Load the control byte and 8-bit data
Jeej 1:55636c88cd5e 63 buff[0] = (0x40);
Jeej 1:55636c88cd5e 64 buff[1] = data;
Jeej 1:55636c88cd5e 65
Jeej 1:55636c88cd5e 66 //Write the data
Jeej 1:55636c88cd5e 67 i2c.write(OLED_ADDR, buff, 2);
Jeej 1:55636c88cd5e 68
Jeej 1:55636c88cd5e 69 }
Jeej 1:55636c88cd5e 70
Jeej 1:55636c88cd5e 71 //==========================================================//
Jeej 1:55636c88cd5e 72 // Used to send commands to the display.
Jeej 1:55636c88cd5e 73 void sendcommand(unsigned char com)
Jeej 1:55636c88cd5e 74 {
Jeej 1:55636c88cd5e 75 //Create a temporary buffer
Jeej 1:55636c88cd5e 76 char buff[2];
Jeej 1:55636c88cd5e 77
Jeej 1:55636c88cd5e 78 //Load the control byte and 8-bit command
Jeej 1:55636c88cd5e 79 buff[0] = 0x00;
Jeej 1:55636c88cd5e 80 buff[1] = com;
Jeej 1:55636c88cd5e 81
Jeej 1:55636c88cd5e 82 //Write the command
Jeej 1:55636c88cd5e 83 i2c.write(OLED_ADDR, buff, 2);
Jeej 1:55636c88cd5e 84 }
Jeej 1:55636c88cd5e 85 //==========================================================//
Jeej 1:55636c88cd5e 86 // Set the cursor position in a 16 COL * 8 ROW map.
Jeej 1:55636c88cd5e 87 void setXY(unsigned char row,unsigned char col)
Jeej 1:55636c88cd5e 88 {
Jeej 1:55636c88cd5e 89 sendcommand(0xb0+row); //set page address
Jeej 1:55636c88cd5e 90 sendcommand(0x00+(8*col&0x0f)); //set low col address
Jeej 1:55636c88cd5e 91 sendcommand(0x10+((8*col>>4)&0x0f)); //set high col address
Jeej 1:55636c88cd5e 92 }
Jeej 1:55636c88cd5e 93 //==========================================================//
Jeej 1:55636c88cd5e 94 // Clears the display by sendind 0 to all the screen map.
Jeej 1:55636c88cd5e 95 void clear_display(void)
Jeej 1:55636c88cd5e 96 {
Jeej 1:55636c88cd5e 97 unsigned char i,k;
Jeej 1:55636c88cd5e 98 for(k=0; k<8; k++) {
Jeej 1:55636c88cd5e 99 setXY(k,0);
Jeej 1:55636c88cd5e 100 {
Jeej 1:55636c88cd5e 101 for(i=0; i<128; i++) { //clear all COL
Jeej 1:55636c88cd5e 102 SendByte(0); //clear all COL
Jeej 1:55636c88cd5e 103 //delay(10);
Jeej 1:55636c88cd5e 104 }
Jeej 1:55636c88cd5e 105 }
Jeej 1:55636c88cd5e 106 }
Jeej 1:55636c88cd5e 107 }
Jeej 1:55636c88cd5e 108 //==========================================================//
Jeej 1:55636c88cd5e 109 // Resets display depending on the actual mode.
Jeej 1:55636c88cd5e 110 void reset_display(void)
Jeej 1:55636c88cd5e 111 {
Jeej 1:55636c88cd5e 112 displayOff();
Jeej 1:55636c88cd5e 113 clear_display();
Jeej 1:55636c88cd5e 114
Jeej 1:55636c88cd5e 115
Jeej 1:55636c88cd5e 116 displayOn();
Jeej 1:55636c88cd5e 117 }
Jeej 1:55636c88cd5e 118 //==========================================================//
Jeej 1:55636c88cd5e 119
Jeej 1:55636c88cd5e 120 void sendImage()
Jeej 1:55636c88cd5e 121 {
Jeej 1:55636c88cd5e 122 reset_display();
Jeej 1:55636c88cd5e 123 for(int i=0; i<128*8; i++) // show 128* 64 Logo
Jeej 1:55636c88cd5e 124 SendByte(logo[i]);
Jeej 1:55636c88cd5e 125
Jeej 1:55636c88cd5e 126 }
Jeej 1:55636c88cd5e 127 //==========================================================//
Jeej 1:55636c88cd5e 128 void printBigTime(char *s)
Jeej 1:55636c88cd5e 129 {
Jeej 1:55636c88cd5e 130
Jeej 1:55636c88cd5e 131 int Y=0;
Jeej 1:55636c88cd5e 132 int lon = strlen(s);
Jeej 1:55636c88cd5e 133 if(lon == 3) {
Jeej 1:55636c88cd5e 134 Y = 0;
Jeej 1:55636c88cd5e 135 } else if (lon == 2) {
Jeej 1:55636c88cd5e 136 Y = 3;
Jeej 1:55636c88cd5e 137 } else if (lon == 1) {
Jeej 1:55636c88cd5e 138 Y = 6;
Jeej 1:55636c88cd5e 139 }
Jeej 1:55636c88cd5e 140
Jeej 1:55636c88cd5e 141 int X = 2;
Jeej 1:55636c88cd5e 142 while(*s) {
Jeej 1:55636c88cd5e 143 printBigNumber(*s, X, Y);
Jeej 1:55636c88cd5e 144
Jeej 1:55636c88cd5e 145 Y+=3;
Jeej 1:55636c88cd5e 146 X=2;
Jeej 1:55636c88cd5e 147 setXY(X,Y);
Jeej 1:55636c88cd5e 148 *s++;
Jeej 1:55636c88cd5e 149 }
Jeej 1:55636c88cd5e 150 }
Jeej 1:55636c88cd5e 151
Jeej 1:55636c88cd5e 152
Jeej 1:55636c88cd5e 153 //==========================================================//
Jeej 1:55636c88cd5e 154 // Prints a display big number (96 bytes) in coordinates X Y,
Jeej 1:55636c88cd5e 155 // being multiples of 8. This means we have 16 COLS (0-15)
Jeej 1:55636c88cd5e 156 // and 8 ROWS (0-7).
Jeej 1:55636c88cd5e 157 void printBigNumber(unsigned char s, int X, int Y)
Jeej 1:55636c88cd5e 158 {
Jeej 1:55636c88cd5e 159 setXY(X,Y);
Jeej 1:55636c88cd5e 160 int salto=0;
Jeej 1:55636c88cd5e 161 for(int i=0; i<96; i++) {
Jeej 1:55636c88cd5e 162 if(s == ' ') {
Jeej 1:55636c88cd5e 163 SendByte(0);
Jeej 1:55636c88cd5e 164 } else
Jeej 1:55636c88cd5e 165 SendByte(bigNumbers[s-0x30][i]);
Jeej 1:55636c88cd5e 166
Jeej 1:55636c88cd5e 167 if(salto == 23) {
Jeej 1:55636c88cd5e 168 salto = 0;
Jeej 1:55636c88cd5e 169 X++;
Jeej 1:55636c88cd5e 170 setXY(X,Y);
Jeej 1:55636c88cd5e 171 } else {
Jeej 1:55636c88cd5e 172 salto++;
Jeej 1:55636c88cd5e 173 }
Jeej 1:55636c88cd5e 174 }
Jeej 1:55636c88cd5e 175 }
Jeej 1:55636c88cd5e 176 //==========================================================//
Jeej 1:55636c88cd5e 177 // Prints a display char (not just a byte) in coordinates X Y,
Jeej 1:55636c88cd5e 178 // being multiples of 8. This means we have 16 COLS (0-15)
Jeej 1:55636c88cd5e 179 // and 8 ROWS (0-7).
Jeej 1:55636c88cd5e 180 void SendByteXY(unsigned char data, int X, int Y)
Jeej 1:55636c88cd5e 181 {
Jeej 1:55636c88cd5e 182 i2c.start();
Jeej 1:55636c88cd5e 183 i2c.write(OLED_ADDR);
Jeej 1:55636c88cd5e 184 i2c.write(0x40);
Jeej 1:55636c88cd5e 185
Jeej 1:55636c88cd5e 186 for(int i=0; i<8; i++)
Jeej 1:55636c88cd5e 187 i2c.write((int)(myFont[data-0x20]+i)); // <<-------------------------------------
Jeej 1:55636c88cd5e 188
Jeej 1:55636c88cd5e 189 i2c.stop(); // stop transmitting
Jeej 1:55636c88cd5e 190 }
Jeej 1:55636c88cd5e 191 //==========================================================//
Jeej 1:55636c88cd5e 192 // Prints a string regardless the cursor position.
Jeej 1:55636c88cd5e 193 void sendStr(unsigned char *s)
Jeej 1:55636c88cd5e 194 {
Jeej 1:55636c88cd5e 195 unsigned char i=0;
Jeej 1:55636c88cd5e 196 while(*s) {
Jeej 1:55636c88cd5e 197 for(i=0; i<8; i++) {
Jeej 1:55636c88cd5e 198 SendByte(myFont[*s-0x20][i]);
Jeej 1:55636c88cd5e 199 }
Jeej 1:55636c88cd5e 200 *s++;
Jeej 1:55636c88cd5e 201 }
Jeej 1:55636c88cd5e 202 }
Jeej 1:55636c88cd5e 203 //==========================================================//
Jeej 1:55636c88cd5e 204 // Prints a string in coordinates X Y, being multiples of 8.
Jeej 1:55636c88cd5e 205 // This means we have 16 COLS (0-15) and 8 ROWS (0-7).
Jeej 1:55636c88cd5e 206 void sendStrXY( char *s, int X, int Y)
Jeej 1:55636c88cd5e 207 {
Jeej 1:55636c88cd5e 208 setXY(X,Y);
Jeej 1:55636c88cd5e 209 unsigned char i=0;
Jeej 1:55636c88cd5e 210 while(*s) {
Jeej 1:55636c88cd5e 211 for(i=0; i<8; i++) {
Jeej 1:55636c88cd5e 212 SendByte(myFont[*s-0x20][i]);
Jeej 1:55636c88cd5e 213 }
Jeej 1:55636c88cd5e 214 *s++;
Jeej 1:55636c88cd5e 215 }
Jeej 1:55636c88cd5e 216 }
Jeej 1:55636c88cd5e 217
Jeej 1:55636c88cd5e 218
Jeej 1:55636c88cd5e 219 //==========================================================//
Jeej 1:55636c88cd5e 220 // Inits oled and draws logo at startup
Jeej 1:55636c88cd5e 221 void init_OLED(void)
Jeej 1:55636c88cd5e 222 {
Jeej 1:55636c88cd5e 223 sendcommand(0xae); //display off
Jeej 1:55636c88cd5e 224 sendcommand(0xa6); //Set Normal Display (default)
Jeej 1:55636c88cd5e 225 // Adafruit Init sequence for 128x64 OLED module
Jeej 1:55636c88cd5e 226 sendcommand(0xAE); //DISPLAYOFF
Jeej 1:55636c88cd5e 227 sendcommand(0xD5); //SETDISPLAYCLOCKDIV
Jeej 1:55636c88cd5e 228 sendcommand(0x80); // the suggested ratio 0x80
Jeej 1:55636c88cd5e 229 sendcommand(0xA8); //SSD1306_SETMULTIPLEX
Jeej 1:55636c88cd5e 230 sendcommand(0x3F);
Jeej 1:55636c88cd5e 231 sendcommand(0xD3); //SETDISPLAYOFFSET
Jeej 1:55636c88cd5e 232 sendcommand(0x0); //no offset
Jeej 1:55636c88cd5e 233 sendcommand(0x40 | 0x0); //SETSTARTLINE
Jeej 1:55636c88cd5e 234 sendcommand(0x8D); //CHARGEPUMP
Jeej 1:55636c88cd5e 235 sendcommand(0x14);
Jeej 1:55636c88cd5e 236 sendcommand(0x20); //MEMORYMODE
Jeej 1:55636c88cd5e 237 sendcommand(0x00); //0x0 act like ks0108
Jeej 1:55636c88cd5e 238
Jeej 1:55636c88cd5e 239 sendcommand(0xA0 | 0x1); //SEGREMAP //Rotate screen 180 deg
Jeej 1:55636c88cd5e 240 //sendcommand(0xA0);
Jeej 1:55636c88cd5e 241
Jeej 1:55636c88cd5e 242 sendcommand(0xC8); //COMSCANDEC Rotate screen 180 Deg
Jeej 1:55636c88cd5e 243 //sendcommand(0xC0);
Jeej 1:55636c88cd5e 244
Jeej 1:55636c88cd5e 245 sendcommand(0xDA); //0xDA
Jeej 1:55636c88cd5e 246 sendcommand(0x12); //COMSCANDEC
Jeej 1:55636c88cd5e 247 sendcommand(0x81); //SETCONTRAS
Jeej 1:55636c88cd5e 248 sendcommand(0xCF); //
Jeej 1:55636c88cd5e 249 sendcommand(0xd9); //SETPRECHARGE
Jeej 1:55636c88cd5e 250 sendcommand(0xF1);
Jeej 1:55636c88cd5e 251 sendcommand(0xDB); //SETVCOMDETECT
Jeej 1:55636c88cd5e 252 sendcommand(0x40);
Jeej 1:55636c88cd5e 253 sendcommand(0xA4); //DISPLAYALLON_RESUME
Jeej 1:55636c88cd5e 254 sendcommand(0xA6); //NORMALDISPLAY
Jeej 1:55636c88cd5e 255
Jeej 1:55636c88cd5e 256 clear_display();
Jeej 1:55636c88cd5e 257 sendcommand(0x2e); // stop scroll
Jeej 1:55636c88cd5e 258 //----------------------------REVERSE comments----------------------------//
Jeej 1:55636c88cd5e 259 // sendcommand(0xa0); //seg re-map 0->127(default)
Jeej 1:55636c88cd5e 260 // sendcommand(0xa1); //seg re-map 127->0
Jeej 1:55636c88cd5e 261 // sendcommand(0xc8);
Jeej 1:55636c88cd5e 262 // delay(1000);
Jeej 1:55636c88cd5e 263 //----------------------------REVERSE comments----------------------------//
Jeej 1:55636c88cd5e 264 // sendcommand(0xa7); //Set Inverse Display
Jeej 1:55636c88cd5e 265 // sendcommand(0xae); //display off
Jeej 1:55636c88cd5e 266 sendcommand(0x20); //Set Memory Addressing Mode
Jeej 1:55636c88cd5e 267 sendcommand(0x00); //Set Memory Addressing Mode ab Horizontal addressing mode
Jeej 1:55636c88cd5e 268 // sendcommand(0x02); // Set Memory Addressing Mode ab Page addressing mode(RESET)
Jeej 1:55636c88cd5e 269
Jeej 1:55636c88cd5e 270 setXY(0,0);
Jeej 1:55636c88cd5e 271
Jeej 1:55636c88cd5e 272 sendcommand(0xaf); //display on
Jeej 1:55636c88cd5e 273 }