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
main.cpp@0:0b0487606b13, 2016-05-01 (annotated)
- Committer:
- coleandbrandon
- Date:
- Sun May 01 21:31:25 2016 +0000
- Revision:
- 0:0b0487606b13
program complete JB GT
Who changed what in which revision?
User | Revision | Line number | New 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 | } |