A lampost demo program - it takes in SMS commands to control a light using the shiftbrite LED.

Dependencies:   VodafoneUSBModem_bleedingedge mbed-rtos mbed

Fork of 3GShiftBrite by Ashley Mills

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #define __DEBUG__ 4 //Maximum verbosity
00002 #ifndef __MODULE__
00003 #define __MODULE__ "net_3g_basic_http_test.cpp"
00004 #endif
00005 
00006 #include "mbed.h"
00007 #include "rtos.h"
00008 #include "VodafoneUSBModem.h"
00009 #include "socket/bsd_socket.h"
00010 
00011 DigitalOut led1(LED1);
00012 DigitalOut led2(LED2);
00013 DigitalOut led3(LED3);
00014 DigitalOut led4(LED4);
00015 
00016 DigitalOut latch(p15);
00017 DigitalOut enable(p16);
00018 SPI spi(p11, p12, p13);
00019 
00020 void setLEDColor(int red, int green, int blue) {
00021     unsigned int low_color=0;
00022     unsigned int high_color=0;
00023     high_color=(blue<<4)|((red&0x3C0)>>6);
00024     low_color=(((red&0x3F)<<10)|(green));
00025     spi.write(high_color);
00026     spi.write(low_color);
00027     latch=1;
00028     latch=0;
00029 }
00030 
00031 void setupShifty() {
00032    spi.format(16,0);
00033    spi.frequency(500000);
00034    enable=0;
00035    latch=0;
00036 }
00037 
00038 void doRainbow() {
00039    for(int r=0; r<500; r++) {
00040       for(int g=0; g<500; g++) {
00041          for(int b=0; b<500; b++) {
00042             setLEDColor(r,g,b);
00043          }
00044       }
00045    }
00046    setLEDColor(500,500,500);
00047    Thread::wait(1000);
00048    setLEDColor(0,0,0);
00049 }
00050 
00051 void doFlash() {
00052    int interval = 100;
00053    for(int i=0; i<5; i++) {
00054       setLEDColor(500,0,0);
00055       Thread::wait(interval);
00056       setLEDColor(0,0,0);
00057       Thread::wait(interval);
00058       setLEDColor(500,500,500);
00059       Thread::wait(interval);
00060       setLEDColor(0,0,0);
00061       Thread::wait(interval);
00062       setLEDColor(0,0,500);
00063       Thread::wait(interval);
00064       setLEDColor(0,0,0);
00065       Thread::wait(interval);
00066    }
00067    setLEDColor(500,0,0);
00068 }
00069 
00070 
00071 void lightListener(void const*) {
00072   VodafoneUSBModem modem;
00073   // socket stuff
00074   int sockfd,ret = OK;
00075   uint16_t port = 3232;
00076   struct sockaddr_in serverAddress;
00077   struct hostent *server;
00078   char urlBuffer[128];
00079   int urlBufferLength = 128;
00080 
00081   // declare space for phone number and message storage
00082   char numBuffer[20], msgBuffer[256];
00083   size_t numSMS; // variable to track number of received messages
00084 
00085   //int ret = modem.connect("internet","web","web");
00086  
00087   if(ret == OK) {
00088     int count = 30;
00089     int rssi;
00090     int r=0,g=0,b=0;
00091     LinkMonitor::REGISTRATION_STATE regState;
00092     LinkMonitor::BEARER bearer;
00093     while(1) {    
00094         
00095         //modem.getLinkState(&rssi, &regState, &bearer);
00096         //DBG("RSSI: %d dBm; Reg state: %d; Bearer: %d", rssi, regState, bearer);
00097 
00098         // retrieve the short message count into numSMS
00099         if(modem.getSMCount(&numSMS)==OK) {
00100             // check if any short messages have been received
00101             if(numSMS>0) {
00102                 DBG("SM count > 0");
00103                 // get the oldest short message in the queue
00104                 if(modem.getSM(numBuffer,msgBuffer,256)==OK) {
00105                     if(strcmp(msgBuffer,"flash")==0) {
00106                        doFlash();
00107                        continue;
00108                     } else if(strcmp(msgBuffer,"rainbow")==0) {
00109                        doRainbow();
00110                        continue;
00111                     } else if(strcmp(msgBuffer,"red")==0) {
00112                        setLEDColor(1000,0,0);
00113                        continue;
00114                     } else if(strcmp(msgBuffer,"green")==0) {
00115                        setLEDColor(0,1000,0);
00116                        continue;
00117                     } else if(strcmp(msgBuffer,"blue")==0) {
00118                        setLEDColor(0,0,1000);
00119                        continue;
00120                     } else if(strcmp(msgBuffer,"purple")==0) {
00121                        setLEDColor(1000,0,1000);
00122                        continue;
00123                     } else if(strcmp(msgBuffer,"off")==0) {
00124                        setLEDColor(0,0,0);
00125                        continue;
00126                     }
00127                     
00128                     if(sscanf(msgBuffer,"%d,%d,%d",&r,&g,&b)!=3) {
00129                        continue;
00130                     }
00131                     DBG("Setting light to: %d,%d,%d",r,g,b);
00132                     
00133                     if(r<256) {
00134                        r *= 4;
00135                     }
00136                     
00137                     if(g<256) {
00138                        g *= 4;
00139                     }
00140                     
00141                     if(b<256) {
00142                        b *= 4;  
00143                     }
00144                     
00145                     if(r>1023) {
00146                        r = 1023;
00147                     }
00148                     
00149                     if(g>1023) {
00150                        g = 1023;
00151                     }
00152                     
00153                     if(b>1023) {
00154                        b = 1023;
00155                     }
00156                     
00157                     setLEDColor(r,g,b);
00158                     
00159                     
00160                     // connect to socket and push message
00161                     /*
00162                     // create the socket
00163                     if((sockfd=::socket(AF_INET,SOCK_STREAM,0))<0) { DBG("Error opening socket\r\n"); } else { DBG("Socket open\r\n"); }
00164                          
00165                     // create the socket address
00166                     std::memset(&serverAddress, 0, sizeof(struct sockaddr_in));
00167                     if((server=::gethostbyname("m2mthings.com"))==NULL)  {
00168                          DBG("Error resolving address, setting manually.");
00169                          serverAddress.sin_addr.s_addr = inet_addr("109.74.199.96");
00170                     } else {
00171                          DBG("Address resolved OK");
00172                          memcpy((char*)&serverAddress.sin_addr.s_addr, (char*)server->h_addr_list[0], server->h_length);
00173                     }
00174                     // set server address family
00175                     serverAddress.sin_family = AF_INET;
00176                     // set server port
00177                     serverAddress.sin_port = htons(port);
00178          
00179                     // do socket connect
00180                     DBG("Connecting socket to %s:%d", inet_ntoa(serverAddress.sin_addr), ntohs(serverAddress.sin_port));
00181                     if((ret=::connect(sockfd, (const struct sockaddr *)&serverAddress, sizeof(serverAddress)))<0) {
00182                          ::close(sockfd);
00183                          DBG("Could not connect");
00184                     } else {
00185                          DBG("Connection OK");
00186                     }
00187                     
00188                     DBG("Sending password");
00189                     ::write(sockfd,"hi3h892!",8);
00190                     
00191                     ret = ::recv(sockfd,urlBuffer,urlBufferLength,0);
00192                     if (ret<0) {
00193                         DBG("Error receiving ACK.");
00194                     } else {
00195                         DBG("Received(%d): %s",urlBufferLength,urlBuffer);
00196                         modem.sendSM(numBuffer,urlBuffer);
00197                     }
00198                     
00199                     ::close(sockfd);
00200                     */
00201 
00202                 }
00203             }
00204         }
00205         // wait 500ms
00206         Thread::wait(500);
00207     }
00208     
00209   }
00210   
00211   //modem.disconnect();
00212   //DBG("Disconnected");
00213 
00214   while (1) {
00215     Thread::wait(100);
00216   }
00217 }
00218 
00219 void keepAlive(void const*) {
00220   while (1) {
00221     led1 = !led1;
00222     Thread::wait(250);
00223     led1 = !led1;
00224     Thread::wait(750);
00225   }
00226 }
00227 
00228 int main() {
00229    DBG_INIT();
00230    DBG_SET_SPEED(115200);
00231    DBG_SET_NEWLINE("\r\n");
00232    int red=0;
00233    int green=0;
00234    int blue=0;
00235    setupShifty();
00236    setLEDColor(500,200,200);
00237    
00238    Thread lightTask(lightListener, NULL, osPriorityNormal, 1024 * 6);
00239    keepAlive(NULL);
00240 }