Program that uses Adafruit FONA 800h and resistive touch uLCD display to track roommates and send and receive text messages.

Dependencies:   mbed-rtos mbed uLCD_4D_Picaso

Committer:
coleandbrandon
Date:
Sun May 01 21:31:25 2016 +0000
Revision:
0:0b0487606b13
program complete JB GT

Who changed what in which revision?

UserRevisionLine numberNew contents of line
coleandbrandon 0:0b0487606b13 1 #include "mbed.h"
coleandbrandon 0:0b0487606b13 2 #include "uLCD_4D_Picaso.h"
coleandbrandon 0:0b0487606b13 3 #include "Adafruit_FONA.h"
coleandbrandon 0:0b0487606b13 4 #include "rtos.h"
coleandbrandon 0:0b0487606b13 5 #include <string>
coleandbrandon 0:0b0487606b13 6 #include <vector>
coleandbrandon 0:0b0487606b13 7 #include <ctype.h>
coleandbrandon 0:0b0487606b13 8
coleandbrandon 0:0b0487606b13 9 #define FONA_RST p12
coleandbrandon 0:0b0487606b13 10 #define FONA_TX p13
coleandbrandon 0:0b0487606b13 11 #define FONA_RX p14
coleandbrandon 0:0b0487606b13 12 #define FONA_RI p11
coleandbrandon 0:0b0487606b13 13
coleandbrandon 0:0b0487606b13 14 //using namespace std;
coleandbrandon 0:0b0487606b13 15 Serial pcSerial(USBTX, USBRX);
coleandbrandon 0:0b0487606b13 16 Adafruit_FONA fona(FONA_TX, FONA_RX, FONA_RST, FONA_RI);
coleandbrandon 0:0b0487606b13 17
coleandbrandon 0:0b0487606b13 18 Mutex mut;
coleandbrandon 0:0b0487606b13 19 uLCD_4D_Picaso lcd(p28, p27, p30);
coleandbrandon 0:0b0487606b13 20
coleandbrandon 0:0b0487606b13 21 // this is a large buffer for replies
coleandbrandon 0:0b0487606b13 22 char replybuffer[255];
coleandbrandon 0:0b0487606b13 23
coleandbrandon 0:0b0487606b13 24 // Turn on a LED when somebody calls the FONA (we need to somehow make this apply to texts instead of call
coleandbrandon 0:0b0487606b13 25 // Ok so this works!! just change where indicated
coleandbrandon 0:0b0487606b13 26 DigitalOut led1(LED1);
coleandbrandon 0:0b0487606b13 27 DigitalOut led2(LED2);
coleandbrandon 0:0b0487606b13 28 volatile bool newText = false;
coleandbrandon 0:0b0487606b13 29 class FonaEventListener : public Adafruit_FONA::EventListener {
coleandbrandon 0:0b0487606b13 30 virtual void onRing() { //<- Upon arrival of new text here is what happens
coleandbrandon 0:0b0487606b13 31 //this is what should happen when a text comes in
coleandbrandon 0:0b0487606b13 32
coleandbrandon 0:0b0487606b13 33 led1 = 1;
coleandbrandon 0:0b0487606b13 34 wait_ms(500);
coleandbrandon 0:0b0487606b13 35 led1 = 0;
coleandbrandon 0:0b0487606b13 36 newText = true; //global
coleandbrandon 0:0b0487606b13 37 }
coleandbrandon 0:0b0487606b13 38
coleandbrandon 0:0b0487606b13 39 virtual void onNoCarrier() {
coleandbrandon 0:0b0487606b13 40 led1 = 0;
coleandbrandon 0:0b0487606b13 41 }
coleandbrandon 0:0b0487606b13 42 };
coleandbrandon 0:0b0487606b13 43 FonaEventListener fonaEventListener;
coleandbrandon 0:0b0487606b13 44
coleandbrandon 0:0b0487606b13 45 // Functions defined after main()
coleandbrandon 0:0b0487606b13 46 uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout = 0);
coleandbrandon 0:0b0487606b13 47 void flushSerial();
coleandbrandon 0:0b0487606b13 48 char readBlocking();
coleandbrandon 0:0b0487606b13 49 uint16_t readnumber();
coleandbrandon 0:0b0487606b13 50 long map(long x, long in_min, long in_max, long out_min, long out_max);
coleandbrandon 0:0b0487606b13 51
coleandbrandon 0:0b0487606b13 52 // I don't think this global variable is defined correctly
coleandbrandon 0:0b0487606b13 53 volatile bool whoshome[4] = {0}; // Cole = whoshome[0], brandon = whoshome[1], George = whoshome[2], Jesse = whoshome[3]
coleandbrandon 0:0b0487606b13 54
coleandbrandon 0:0b0487606b13 55 // This member function needs to run when a text message has been received by the FONA module.
coleandbrandon 0:0b0487606b13 56 // textout() reads the phone number of the person who sent the text message from text message slot 1,
coleandbrandon 0:0b0487606b13 57 // deletes that text message, checks the boolean array that indicates who is home and then sends out a text
coleandbrandon 0:0b0487606b13 58 // message for each person that is home.
coleandbrandon 0:0b0487606b13 59
coleandbrandon 0:0b0487606b13 60 void textout();
coleandbrandon 0:0b0487606b13 61
coleandbrandon 0:0b0487606b13 62 // The ___home() member functions below should be called when the ____home buttons on the LCD touchscreen are pressed.
coleandbrandon 0:0b0487606b13 63 // For example, when cole comes in the house he will push his button to indicate that he is home. This will update his
coleandbrandon 0:0b0487606b13 64 // status from away (0) to home (1) and text everyone that is HOME the text message "Cole is home." The functionality is
coleandbrandon 0:0b0487606b13 65 // the same for brandonshome, georgeshome, jesseshome
coleandbrandon 0:0b0487606b13 66
coleandbrandon 0:0b0487606b13 67 void coleshome();
coleandbrandon 0:0b0487606b13 68 void brandonshome();
coleandbrandon 0:0b0487606b13 69 void georgeshome();
coleandbrandon 0:0b0487606b13 70 void jesseshome();
coleandbrandon 0:0b0487606b13 71
coleandbrandon 0:0b0487606b13 72 // These functions should be called when one of the roommates pushes the ____away button on the lcd touchscreen.
coleandbrandon 0:0b0487606b13 73 // For example, if Cole is leaving the house, then he would touch the COLE away box and it would change his value
coleandbrandon 0:0b0487606b13 74 // in the boolean array whoshome from home (1) to away (0). Then, the next time the LCD DISPLAY thread is run,
coleandbrandon 0:0b0487606b13 75 // Cole's name would disappear from the display because he is away.
coleandbrandon 0:0b0487606b13 76
coleandbrandon 0:0b0487606b13 77 void colesaway(void);
coleandbrandon 0:0b0487606b13 78 void brandonsaway(void);
coleandbrandon 0:0b0487606b13 79 void georgesaway(void);
coleandbrandon 0:0b0487606b13 80 void jessesaway(void);
coleandbrandon 0:0b0487606b13 81
coleandbrandon 0:0b0487606b13 82 // This is the display function that updates the names based on the boolean array whoshome. Let me know if you
coleandbrandon 0:0b0487606b13 83 // have questions about this.
coleandbrandon 0:0b0487606b13 84
coleandbrandon 0:0b0487606b13 85 void update_display(){
coleandbrandon 0:0b0487606b13 86 mut.lock();
coleandbrandon 0:0b0487606b13 87
coleandbrandon 0:0b0487606b13 88 //print names - if home, print name, if not, print blank spaces
coleandbrandon 0:0b0487606b13 89
coleandbrandon 0:0b0487606b13 90 lcd.txt_MoveCursor(4, 0);
coleandbrandon 0:0b0487606b13 91 lcd.txt_Attributes(Picaso::UNDERLINED);
coleandbrandon 0:0b0487606b13 92
coleandbrandon 0:0b0487606b13 93 if (whoshome[0]) { //cole
coleandbrandon 0:0b0487606b13 94 lcd.putStr("Cole\r\n");
coleandbrandon 0:0b0487606b13 95 }
coleandbrandon 0:0b0487606b13 96 else lcd.putStr(" \r\n");
coleandbrandon 0:0b0487606b13 97 if (whoshome[1]) { //Brandon
coleandbrandon 0:0b0487606b13 98 lcd.putStr("Brandon\r\n");
coleandbrandon 0:0b0487606b13 99 }
coleandbrandon 0:0b0487606b13 100 else lcd.putStr(" \r\n");
coleandbrandon 0:0b0487606b13 101 if (whoshome[2]) { //george
coleandbrandon 0:0b0487606b13 102 lcd.putStr("George\r\n");
coleandbrandon 0:0b0487606b13 103 }
coleandbrandon 0:0b0487606b13 104 else lcd.putStr(" \r\n");
coleandbrandon 0:0b0487606b13 105 if (whoshome[3]) { //Jesse
coleandbrandon 0:0b0487606b13 106 lcd.putStr("Jesse\r\n");
coleandbrandon 0:0b0487606b13 107 }
coleandbrandon 0:0b0487606b13 108 else lcd.putStr(" \r\n");
coleandbrandon 0:0b0487606b13 109
coleandbrandon 0:0b0487606b13 110 mut.unlock();
coleandbrandon 0:0b0487606b13 111 }
coleandbrandon 0:0b0487606b13 112
coleandbrandon 0:0b0487606b13 113 void display_func(void const *args){ //this is what is going to be responsible for updating to the screen
coleandbrandon 0:0b0487606b13 114
coleandbrandon 0:0b0487606b13 115 // this may need to be in a separate thread, i'm not sure. we also may need to use a mutex
coleandbrandon 0:0b0487606b13 116 mut.lock();
coleandbrandon 0:0b0487606b13 117 pcSerial.printf("i'm in the display function\r\n");
coleandbrandon 0:0b0487606b13 118 mut.unlock();
coleandbrandon 0:0b0487606b13 119 int status = 0;
coleandbrandon 0:0b0487606b13 120 int x = 0;
coleandbrandon 0:0b0487606b13 121 int y = 0;
coleandbrandon 0:0b0487606b13 122 while (1) {
coleandbrandon 0:0b0487606b13 123 status = lcd.touch_Get(0);
coleandbrandon 0:0b0487606b13 124 if (status) {
coleandbrandon 0:0b0487606b13 125 mut.lock();
coleandbrandon 0:0b0487606b13 126 pcSerial.printf("i got touched\r\n");
coleandbrandon 0:0b0487606b13 127 mut.unlock();
coleandbrandon 0:0b0487606b13 128 x = lcd.touch_Get(1);
coleandbrandon 0:0b0487606b13 129 y = lcd.touch_Get(2);
coleandbrandon 0:0b0487606b13 130
coleandbrandon 0:0b0487606b13 131 if (status == 1 && y >= 180 && y <= 240 && x >= 0 && x <= 55) {
coleandbrandon 0:0b0487606b13 132 //update_display();
coleandbrandon 0:0b0487606b13 133 coleshome();
coleandbrandon 0:0b0487606b13 134 }
coleandbrandon 0:0b0487606b13 135 if (status == 1 && y >= 180 && y <= 240 && x >= 65 && x <= 115) {
coleandbrandon 0:0b0487606b13 136 //update_display();
coleandbrandon 0:0b0487606b13 137 brandonshome();
coleandbrandon 0:0b0487606b13 138 }
coleandbrandon 0:0b0487606b13 139 if (status == 1 && y >= 180 && y <= 240 && x >= 125 && x <= 175) {
coleandbrandon 0:0b0487606b13 140 //update_display();
coleandbrandon 0:0b0487606b13 141 georgeshome();
coleandbrandon 0:0b0487606b13 142 }
coleandbrandon 0:0b0487606b13 143 if (status == 1 && y >= 180 && y <= 240 && x >= 185 && x <= 240) {
coleandbrandon 0:0b0487606b13 144 //update_display();
coleandbrandon 0:0b0487606b13 145 jesseshome();
coleandbrandon 0:0b0487606b13 146 }
coleandbrandon 0:0b0487606b13 147
coleandbrandon 0:0b0487606b13 148 // AWAY
coleandbrandon 0:0b0487606b13 149
coleandbrandon 0:0b0487606b13 150 if (status == 1 && y >= 250 && x >= 0 && x <= 55) {
coleandbrandon 0:0b0487606b13 151 //update_display();
coleandbrandon 0:0b0487606b13 152 colesaway();
coleandbrandon 0:0b0487606b13 153 }
coleandbrandon 0:0b0487606b13 154 if (status == 1 && y >= 250 && x >= 65 && x <= 115) {
coleandbrandon 0:0b0487606b13 155 //update_display();
coleandbrandon 0:0b0487606b13 156 brandonsaway();
coleandbrandon 0:0b0487606b13 157 }
coleandbrandon 0:0b0487606b13 158 if (status == 1 && y >= 250 && x >= 125 && x <= 175) {
coleandbrandon 0:0b0487606b13 159 //update_display();
coleandbrandon 0:0b0487606b13 160 georgesaway();
coleandbrandon 0:0b0487606b13 161 }
coleandbrandon 0:0b0487606b13 162 if (status == 1 && y >= 250 && x >= 185 && x <= 240) {
coleandbrandon 0:0b0487606b13 163 jessesaway();
coleandbrandon 0:0b0487606b13 164 //update_display();
coleandbrandon 0:0b0487606b13 165 }
coleandbrandon 0:0b0487606b13 166 }
coleandbrandon 0:0b0487606b13 167 }
coleandbrandon 0:0b0487606b13 168 }
coleandbrandon 0:0b0487606b13 169
coleandbrandon 0:0b0487606b13 170 void textout(void const *args){ // this is responsible for texting a list of people who are home
coleandbrandon 0:0b0487606b13 171
coleandbrandon 0:0b0487606b13 172 while(true) {
coleandbrandon 0:0b0487606b13 173 while (!newText) Thread::yield(); //GEORGE!!!
coleandbrandon 0:0b0487606b13 174 mut.lock();
coleandbrandon 0:0b0487606b13 175 pcSerial.printf("i received a text message\r\n");
coleandbrandon 0:0b0487606b13 176 mut.unlock();
coleandbrandon 0:0b0487606b13 177 newText = false; //update global variable
coleandbrandon 0:0b0487606b13 178 //read in txt message
coleandbrandon 0:0b0487606b13 179 fona.getSMSSender(1, replybuffer, 250); // store phone number in reply buffer
coleandbrandon 0:0b0487606b13 180
coleandbrandon 0:0b0487606b13 181 fona.deleteSMS(1); // delete text message to free up sms #1
coleandbrandon 0:0b0487606b13 182 mut.lock();
coleandbrandon 0:0b0487606b13 183 pcSerial.printf("text message deleted\r\n");
coleandbrandon 0:0b0487606b13 184 mut.unlock();
coleandbrandon 0:0b0487606b13 185 //reply to number with texts of who is home
coleandbrandon 0:0b0487606b13 186 if (whoshome[0]) { //cole
coleandbrandon 0:0b0487606b13 187 fona.sendSMS(replybuffer, "Cole is home");
coleandbrandon 0:0b0487606b13 188 //wait_ms(250);
coleandbrandon 0:0b0487606b13 189 }
coleandbrandon 0:0b0487606b13 190 if (whoshome[1]) { //brandon
coleandbrandon 0:0b0487606b13 191 fona.sendSMS(replybuffer, "Brandon is home");
coleandbrandon 0:0b0487606b13 192 //wait_ms(250);
coleandbrandon 0:0b0487606b13 193 }
coleandbrandon 0:0b0487606b13 194 if (whoshome[2]) { //george
coleandbrandon 0:0b0487606b13 195 fona.sendSMS(replybuffer, "George is home");
coleandbrandon 0:0b0487606b13 196 //wait_ms(250);
coleandbrandon 0:0b0487606b13 197 }
coleandbrandon 0:0b0487606b13 198 if (whoshome[3]) { //jesse
coleandbrandon 0:0b0487606b13 199 fona.sendSMS(replybuffer, "Jesse is home");
coleandbrandon 0:0b0487606b13 200 //wait_ms(250);
coleandbrandon 0:0b0487606b13 201 }
coleandbrandon 0:0b0487606b13 202 if (whoshome[0] == 0 && whoshome[1] == 0 && whoshome[2] == 0 && whoshome[3] == 0) {
coleandbrandon 0:0b0487606b13 203 fona.sendSMS(replybuffer, "No one is home :(");
coleandbrandon 0:0b0487606b13 204 //wait_ms(250);
coleandbrandon 0:0b0487606b13 205 }
coleandbrandon 0:0b0487606b13 206 }
coleandbrandon 0:0b0487606b13 207 }
coleandbrandon 0:0b0487606b13 208
coleandbrandon 0:0b0487606b13 209 void coleshome(){
coleandbrandon 0:0b0487606b13 210 // update bool array
coleandbrandon 0:0b0487606b13 211 whoshome[0] = 1;
coleandbrandon 0:0b0487606b13 212 update_display();
coleandbrandon 0:0b0487606b13 213 if (whoshome[1]) {
coleandbrandon 0:0b0487606b13 214 fona.sendSMS("6789936332", "Cole is home."); //text brandon
coleandbrandon 0:0b0487606b13 215 //wait_ms(250);
coleandbrandon 0:0b0487606b13 216 }
coleandbrandon 0:0b0487606b13 217 if (whoshome[2]) {
coleandbrandon 0:0b0487606b13 218 fona.sendSMS("4045189567", "Cole is home."); //text george
coleandbrandon 0:0b0487606b13 219 //wait_ms(250);
coleandbrandon 0:0b0487606b13 220 }
coleandbrandon 0:0b0487606b13 221 if (whoshome[3]) {
coleandbrandon 0:0b0487606b13 222 fona.sendSMS("7067664360", "Cole is home."); //text jesse
coleandbrandon 0:0b0487606b13 223 //wait_ms(250);
coleandbrandon 0:0b0487606b13 224 }
coleandbrandon 0:0b0487606b13 225 }
coleandbrandon 0:0b0487606b13 226
coleandbrandon 0:0b0487606b13 227 void brandonshome(){
coleandbrandon 0:0b0487606b13 228 // update bool array
coleandbrandon 0:0b0487606b13 229 whoshome[1] = 1;
coleandbrandon 0:0b0487606b13 230 update_display();
coleandbrandon 0:0b0487606b13 231 if (whoshome[0]) {
coleandbrandon 0:0b0487606b13 232 fona.sendSMS("8476022588", "Brandon is home."); //text cole
coleandbrandon 0:0b0487606b13 233 //wait_ms(250);
coleandbrandon 0:0b0487606b13 234 }
coleandbrandon 0:0b0487606b13 235 if (whoshome[2]) {
coleandbrandon 0:0b0487606b13 236 fona.sendSMS("4045189567", "Brandon is home."); //text george
coleandbrandon 0:0b0487606b13 237 //wait_ms(250);
coleandbrandon 0:0b0487606b13 238 }
coleandbrandon 0:0b0487606b13 239 if (whoshome[3]) {
coleandbrandon 0:0b0487606b13 240 fona.sendSMS("7067664360", "Brandon is home."); //text jesse
coleandbrandon 0:0b0487606b13 241 //wait_ms(250);
coleandbrandon 0:0b0487606b13 242 }
coleandbrandon 0:0b0487606b13 243 }
coleandbrandon 0:0b0487606b13 244
coleandbrandon 0:0b0487606b13 245 void georgeshome(){
coleandbrandon 0:0b0487606b13 246 // update bool array
coleandbrandon 0:0b0487606b13 247 whoshome[2] = 1;
coleandbrandon 0:0b0487606b13 248 update_display();
coleandbrandon 0:0b0487606b13 249 if (whoshome[0]) {
coleandbrandon 0:0b0487606b13 250 fona.sendSMS("8476022588", "George is home."); //text cole
coleandbrandon 0:0b0487606b13 251 //wait_ms(250);
coleandbrandon 0:0b0487606b13 252 }
coleandbrandon 0:0b0487606b13 253 if (whoshome[1]) {
coleandbrandon 0:0b0487606b13 254 fona.sendSMS("6789936332", "George is home."); //text brandon
coleandbrandon 0:0b0487606b13 255 //wait_ms(250);
coleandbrandon 0:0b0487606b13 256 }
coleandbrandon 0:0b0487606b13 257 if (whoshome[3]) {
coleandbrandon 0:0b0487606b13 258 fona.sendSMS("7067664360", "George is home."); //text jesse
coleandbrandon 0:0b0487606b13 259 //wait_ms(250);
coleandbrandon 0:0b0487606b13 260 }
coleandbrandon 0:0b0487606b13 261 }
coleandbrandon 0:0b0487606b13 262
coleandbrandon 0:0b0487606b13 263 void jesseshome(){
coleandbrandon 0:0b0487606b13 264 // update bool array
coleandbrandon 0:0b0487606b13 265 whoshome[3] = 1;
coleandbrandon 0:0b0487606b13 266 update_display();
coleandbrandon 0:0b0487606b13 267 if (whoshome[0]) {
coleandbrandon 0:0b0487606b13 268 fona.sendSMS("8476022588", "Jesse is home."); //text cole
coleandbrandon 0:0b0487606b13 269 //wait_ms(250);
coleandbrandon 0:0b0487606b13 270 }
coleandbrandon 0:0b0487606b13 271 if (whoshome[1]) {
coleandbrandon 0:0b0487606b13 272 fona.sendSMS("6789936332", "Jesse is home."); //text brandon
coleandbrandon 0:0b0487606b13 273 //wait_ms(250);
coleandbrandon 0:0b0487606b13 274 }
coleandbrandon 0:0b0487606b13 275 if (whoshome[2]) {
coleandbrandon 0:0b0487606b13 276 fona.sendSMS("4045189567", "Jesse is home."); //text george
coleandbrandon 0:0b0487606b13 277 //wait_ms(250);
coleandbrandon 0:0b0487606b13 278 }
coleandbrandon 0:0b0487606b13 279 }
coleandbrandon 0:0b0487606b13 280
coleandbrandon 0:0b0487606b13 281 void colesaway(){
coleandbrandon 0:0b0487606b13 282 whoshome[0] = 0;
coleandbrandon 0:0b0487606b13 283 update_display();
coleandbrandon 0:0b0487606b13 284 }
coleandbrandon 0:0b0487606b13 285
coleandbrandon 0:0b0487606b13 286 void brandonsaway(){
coleandbrandon 0:0b0487606b13 287 whoshome[1] = 0;
coleandbrandon 0:0b0487606b13 288 update_display();
coleandbrandon 0:0b0487606b13 289 }
coleandbrandon 0:0b0487606b13 290
coleandbrandon 0:0b0487606b13 291 void georgesaway(){
coleandbrandon 0:0b0487606b13 292 whoshome[2] = 0;
coleandbrandon 0:0b0487606b13 293 update_display();
coleandbrandon 0:0b0487606b13 294 }
coleandbrandon 0:0b0487606b13 295
coleandbrandon 0:0b0487606b13 296 void jessesaway(){
coleandbrandon 0:0b0487606b13 297 whoshome[3] = 0;
coleandbrandon 0:0b0487606b13 298 update_display();
coleandbrandon 0:0b0487606b13 299 }
coleandbrandon 0:0b0487606b13 300
coleandbrandon 0:0b0487606b13 301
coleandbrandon 0:0b0487606b13 302 void flushSerial() {
coleandbrandon 0:0b0487606b13 303 while (pcSerial.readable())
coleandbrandon 0:0b0487606b13 304 pcSerial.getc();
coleandbrandon 0:0b0487606b13 305 }
coleandbrandon 0:0b0487606b13 306
coleandbrandon 0:0b0487606b13 307 char readBlocking() {
coleandbrandon 0:0b0487606b13 308 while (!pcSerial.readable());
coleandbrandon 0:0b0487606b13 309 return pcSerial.getc();
coleandbrandon 0:0b0487606b13 310 }
coleandbrandon 0:0b0487606b13 311
coleandbrandon 0:0b0487606b13 312 uint16_t readnumber() {
coleandbrandon 0:0b0487606b13 313 uint16_t x = 0;
coleandbrandon 0:0b0487606b13 314 char c;
coleandbrandon 0:0b0487606b13 315 while (! isdigit(c = readBlocking())) {
coleandbrandon 0:0b0487606b13 316 //pcSerial.putc(c);
coleandbrandon 0:0b0487606b13 317 }
coleandbrandon 0:0b0487606b13 318 pcSerial.putc(c);
coleandbrandon 0:0b0487606b13 319 x = c - '0';
coleandbrandon 0:0b0487606b13 320 while (isdigit(c = readBlocking())) {
coleandbrandon 0:0b0487606b13 321 pcSerial.putc(c);
coleandbrandon 0:0b0487606b13 322 x *= 10;
coleandbrandon 0:0b0487606b13 323 x += c - '0';
coleandbrandon 0:0b0487606b13 324 }
coleandbrandon 0:0b0487606b13 325 return x;
coleandbrandon 0:0b0487606b13 326 }
coleandbrandon 0:0b0487606b13 327
coleandbrandon 0:0b0487606b13 328 uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout) {
coleandbrandon 0:0b0487606b13 329 uint16_t buffidx = 0;
coleandbrandon 0:0b0487606b13 330 bool timeoutvalid = true;
coleandbrandon 0:0b0487606b13 331 if (timeout == 0) timeoutvalid = false;
coleandbrandon 0:0b0487606b13 332
coleandbrandon 0:0b0487606b13 333 while (true) {
coleandbrandon 0:0b0487606b13 334 if (buffidx > maxbuff) {
coleandbrandon 0:0b0487606b13 335 //pcSerial.printf("SPACE\r\n");
coleandbrandon 0:0b0487606b13 336 break;
coleandbrandon 0:0b0487606b13 337 }
coleandbrandon 0:0b0487606b13 338
coleandbrandon 0:0b0487606b13 339 while(pcSerial.readable()) {
coleandbrandon 0:0b0487606b13 340 char c = pcSerial.getc();
coleandbrandon 0:0b0487606b13 341
coleandbrandon 0:0b0487606b13 342 //pcSerial.printf("%02x#%c\r\n", c, c);
coleandbrandon 0:0b0487606b13 343
coleandbrandon 0:0b0487606b13 344 if (c == '\r') continue;
coleandbrandon 0:0b0487606b13 345 if (c == 0xA) {
coleandbrandon 0:0b0487606b13 346 if (buffidx == 0) // the first 0x0A is ignored
coleandbrandon 0:0b0487606b13 347 continue;
coleandbrandon 0:0b0487606b13 348
coleandbrandon 0:0b0487606b13 349 timeout = 0; // the second 0x0A is the end of the line
coleandbrandon 0:0b0487606b13 350 timeoutvalid = true;
coleandbrandon 0:0b0487606b13 351 break;
coleandbrandon 0:0b0487606b13 352 }
coleandbrandon 0:0b0487606b13 353 buff[buffidx] = c;
coleandbrandon 0:0b0487606b13 354 buffidx++;
coleandbrandon 0:0b0487606b13 355 }
coleandbrandon 0:0b0487606b13 356
coleandbrandon 0:0b0487606b13 357 if (timeoutvalid && timeout == 0) {
coleandbrandon 0:0b0487606b13 358 //pcSerial.printf("TIMEOUT\r\n");
coleandbrandon 0:0b0487606b13 359 break;
coleandbrandon 0:0b0487606b13 360 }
coleandbrandon 0:0b0487606b13 361 wait_ms(1);
coleandbrandon 0:0b0487606b13 362 }
coleandbrandon 0:0b0487606b13 363 buff[buffidx] = 0; // null term
coleandbrandon 0:0b0487606b13 364 return buffidx;
coleandbrandon 0:0b0487606b13 365 }
coleandbrandon 0:0b0487606b13 366
coleandbrandon 0:0b0487606b13 367 long map(long x, long in_min, long in_max, long out_min, long out_max)
coleandbrandon 0:0b0487606b13 368 {
coleandbrandon 0:0b0487606b13 369 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
coleandbrandon 0:0b0487606b13 370 }
coleandbrandon 0:0b0487606b13 371
coleandbrandon 0:0b0487606b13 372 void initialize_everything(){
coleandbrandon 0:0b0487606b13 373 //initiate whatever
coleandbrandon 0:0b0487606b13 374
coleandbrandon 0:0b0487606b13 375 // LCD touchscreen
coleandbrandon 0:0b0487606b13 376 lcd.setbaudWait(Picaso::BAUD_600000);
coleandbrandon 0:0b0487606b13 377 lcd.touch_Set(0);
coleandbrandon 0:0b0487606b13 378 lcd.txt_Opacity(Picaso::OPAQUE);
coleandbrandon 0:0b0487606b13 379
coleandbrandon 0:0b0487606b13 380 //Set up header
coleandbrandon 0:0b0487606b13 381
coleandbrandon 0:0b0487606b13 382 lcd.txt_MoveCursor(0, 6);
coleandbrandon 0:0b0487606b13 383 lcd.txt_Attributes(Picaso::BOLD);
coleandbrandon 0:0b0487606b13 384 lcd.txt_FGcolour(Picaso::RED);
coleandbrandon 0:0b0487606b13 385 lcd.putStr("mbed Roomate Tracker");
coleandbrandon 0:0b0487606b13 386 lcd.txt_MoveCursor(2, 0);
coleandbrandon 0:0b0487606b13 387 lcd.txt_FGcolour(Picaso::CYAN);
coleandbrandon 0:0b0487606b13 388 lcd.putStr("Who's home?");
coleandbrandon 0:0b0487606b13 389
coleandbrandon 0:0b0487606b13 390 //Set up touch boxes
coleandbrandon 0:0b0487606b13 391 lcd.gfx_Rectangle(0, 180, 55, 240, Picaso::RED);
coleandbrandon 0:0b0487606b13 392 lcd.gfx_RectangleFilled(1, 181, 54, 239, Picaso::WHITE);
coleandbrandon 0:0b0487606b13 393 lcd.gfx_Rectangle(65, 180, 115, 240, Picaso::RED);
coleandbrandon 0:0b0487606b13 394 lcd.gfx_RectangleFilled(66, 181, 114, 239, Picaso::WHITE);
coleandbrandon 0:0b0487606b13 395 lcd.gfx_Rectangle(125, 180, 175, 240, Picaso::RED);
coleandbrandon 0:0b0487606b13 396 lcd.gfx_RectangleFilled(126, 181, 174, 239, Picaso::WHITE);
coleandbrandon 0:0b0487606b13 397 lcd.gfx_Rectangle(185, 180, 240, 240, Picaso::RED);
coleandbrandon 0:0b0487606b13 398 lcd.gfx_RectangleFilled(186, 181, 239, 239, Picaso::WHITE);
coleandbrandon 0:0b0487606b13 399 lcd.txt_MoveCursor(17, 2);
coleandbrandon 0:0b0487606b13 400 lcd.putStr("COLE\r\nhome");
coleandbrandon 0:0b0487606b13 401 lcd.txt_MoveCursor(17, 8);
coleandbrandon 0:0b0487606b13 402 lcd.putStr("BRANDON\r\nhome");
coleandbrandon 0:0b0487606b13 403 lcd.txt_MoveCursor(17, 16);
coleandbrandon 0:0b0487606b13 404 lcd.putStr("GEORGE\r\nhome");
coleandbrandon 0:0b0487606b13 405 lcd.txt_MoveCursor(17, 24);
coleandbrandon 0:0b0487606b13 406 lcd.putStr("JESSE\r\nhome");
coleandbrandon 0:0b0487606b13 407
coleandbrandon 0:0b0487606b13 408 lcd.gfx_Rectangle(0, 250, 55, 310, Picaso::RED);
coleandbrandon 0:0b0487606b13 409 lcd.gfx_RectangleFilled(1, 251, 54, 309, Picaso::WHITE);
coleandbrandon 0:0b0487606b13 410 lcd.gfx_Rectangle(65, 250, 115, 310, Picaso::RED);
coleandbrandon 0:0b0487606b13 411 lcd.gfx_RectangleFilled(66, 251, 114, 309, Picaso::WHITE);
coleandbrandon 0:0b0487606b13 412 lcd.gfx_Rectangle(125, 250, 175, 310, Picaso::RED);
coleandbrandon 0:0b0487606b13 413 lcd.gfx_RectangleFilled(126, 251, 174, 309, Picaso::WHITE);
coleandbrandon 0:0b0487606b13 414 lcd.gfx_Rectangle(185, 250, 240, 310, Picaso::RED);
coleandbrandon 0:0b0487606b13 415 lcd.gfx_RectangleFilled(186, 251, 239, 309, Picaso::WHITE);
coleandbrandon 0:0b0487606b13 416 lcd.txt_FGcolour(Picaso::WHITE);
coleandbrandon 0:0b0487606b13 417 lcd.txt_Attributes(Picaso::UNDERLINED);
coleandbrandon 0:0b0487606b13 418 lcd.txt_MoveCursor(23, 2);
coleandbrandon 0:0b0487606b13 419 lcd.putStr("COLE\r\naway");
coleandbrandon 0:0b0487606b13 420 lcd.txt_MoveCursor(23, 8);
coleandbrandon 0:0b0487606b13 421 lcd.putStr("BRANDON\r\naway");
coleandbrandon 0:0b0487606b13 422 lcd.txt_MoveCursor(23, 16);
coleandbrandon 0:0b0487606b13 423 lcd.putStr("GEORGE\r\naway");
coleandbrandon 0:0b0487606b13 424 lcd.txt_MoveCursor(23, 24);
coleandbrandon 0:0b0487606b13 425 lcd.putStr("JESSE\r\naway");
coleandbrandon 0:0b0487606b13 426
coleandbrandon 0:0b0487606b13 427
coleandbrandon 0:0b0487606b13 428 flushSerial();
coleandbrandon 0:0b0487606b13 429 //FONA initialization (copied from FONA code (may only need the fona.begin(9600) but all of this stuff won't hurt to have
coleandbrandon 0:0b0487606b13 430 pcSerial.baud(9600);
coleandbrandon 0:0b0487606b13 431 wait(1);
coleandbrandon 0:0b0487606b13 432 mut.lock();
coleandbrandon 0:0b0487606b13 433 pcSerial.printf("\r\n");
coleandbrandon 0:0b0487606b13 434
coleandbrandon 0:0b0487606b13 435 pcSerial.printf("FONA basic test\r\n");
coleandbrandon 0:0b0487606b13 436 pcSerial.printf("Initializing....(May take 3 seconds)\r\n");
coleandbrandon 0:0b0487606b13 437 wait(2);
coleandbrandon 0:0b0487606b13 438 // See if the FONA is responding
coleandbrandon 0:0b0487606b13 439 if (! fona.begin(9600)) {
coleandbrandon 0:0b0487606b13 440 pcSerial.printf("Couldn't find FONA\r\n");
coleandbrandon 0:0b0487606b13 441 while (1);
coleandbrandon 0:0b0487606b13 442 }
coleandbrandon 0:0b0487606b13 443 pcSerial.printf("Can I get an Amen\r\n");
coleandbrandon 0:0b0487606b13 444 fona.setEventListener(&fonaEventListener);
coleandbrandon 0:0b0487606b13 445 pcSerial.printf("FONA is OK\r\n");
coleandbrandon 0:0b0487606b13 446 for( int i = 1; i < 10; i++){
coleandbrandon 0:0b0487606b13 447 fona.deleteSMS(i);
coleandbrandon 0:0b0487606b13 448 wait_ms(10);
coleandbrandon 0:0b0487606b13 449 }
coleandbrandon 0:0b0487606b13 450
coleandbrandon 0:0b0487606b13 451 // Print SIM card IMEI number.
coleandbrandon 0:0b0487606b13 452 char imei[15] = {0}; // MUST use a 16 character buffer for IMEI!
coleandbrandon 0:0b0487606b13 453 uint8_t imeiLen = fona.getIMEI(imei);
coleandbrandon 0:0b0487606b13 454 if (imeiLen > 0) {
coleandbrandon 0:0b0487606b13 455 pcSerial.printf("SIM card IMEI: %s\r\n", imei);
coleandbrandon 0:0b0487606b13 456 }
coleandbrandon 0:0b0487606b13 457 mut.unlock();
coleandbrandon 0:0b0487606b13 458 }
coleandbrandon 0:0b0487606b13 459
coleandbrandon 0:0b0487606b13 460
coleandbrandon 0:0b0487606b13 461 int main() {
coleandbrandon 0:0b0487606b13 462
coleandbrandon 0:0b0487606b13 463 initialize_everything(); //does all the setup stuff
coleandbrandon 0:0b0487606b13 464 /// //start threads
coleandbrandon 0:0b0487606b13 465 pcSerial.printf("everything is initialized\r\n");
coleandbrandon 0:0b0487606b13 466 Thread thread1(display_func); //this is what waits for something to touch it
coleandbrandon 0:0b0487606b13 467 pcSerial.printf("display thread good\r\n");
coleandbrandon 0:0b0487606b13 468 Thread thread2(textout);
coleandbrandon 0:0b0487606b13 469 pcSerial.printf("textout thread good\r\n");
coleandbrandon 0:0b0487606b13 470 //Thread thread3(texting);
coleandbrandon 0:0b0487606b13 471 while (true){
coleandbrandon 0:0b0487606b13 472 led2 = !led2;
coleandbrandon 0:0b0487606b13 473 Thread::wait(500);
coleandbrandon 0:0b0487606b13 474 }
coleandbrandon 0:0b0487606b13 475
coleandbrandon 0:0b0487606b13 476 //wait
coleandbrandon 0:0b0487606b13 477
coleandbrandon 0:0b0487606b13 478 }