A shiftbrite controlled by a Vodafone USB modem

Dependencies:   VodafoneUSBModem_bleedingedge mbed-rtos mbed

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 
00039 void lightListener(void const*) {
00040   VodafoneUSBModem modem;
00041   // socket stuff
00042   int sockfd,ret = OK;
00043   uint16_t port = 3232;
00044   struct sockaddr_in serverAddress;
00045   struct hostent *server;
00046   char urlBuffer[128];
00047   int urlBufferLength = 128;
00048 
00049   // declare space for phone number and message storage
00050   char numBuffer[20], msgBuffer[512];
00051   size_t numSMS; // variable to track number of received messages
00052 
00053   //int ret = modem.connect("internet","web","web");
00054  
00055   if(ret == OK) {
00056     int count = 30;
00057     int rssi;
00058     int r=0,g=0,b=0;
00059     LinkMonitor::REGISTRATION_STATE regState;
00060     LinkMonitor::BEARER bearer;
00061     while(1) {    
00062         
00063         //modem.getLinkState(&rssi, &regState, &bearer);
00064         //DBG("RSSI: %d dBm; Reg state: %d; Bearer: %d", rssi, regState, bearer);
00065 
00066         // retrieve the short message count into numSMS
00067         if(modem.getSMCount(&numSMS)==OK) {
00068             // check if any short messages have been received
00069             if(numSMS>0) {
00070                 DBG("SM count > 0");
00071                 // get the oldest short message in the queue
00072                 if(modem.getSM(numBuffer,msgBuffer,256)==OK) {
00073                     sscanf(msgBuffer,"%d,%d,%d",&r,&g,&b);
00074                     DBG("Setting light to: %d,%d,%d",r,g,b);
00075                     setLEDColor(r*4,g*4,b*4);
00076                     // connect to socket and push message
00077                     /*
00078                     // create the socket
00079                     if((sockfd=::socket(AF_INET,SOCK_STREAM,0))<0) { DBG("Error opening socket\r\n"); } else { DBG("Socket open\r\n"); }
00080                          
00081                     // create the socket address
00082                     std::memset(&serverAddress, 0, sizeof(struct sockaddr_in));
00083                     if((server=::gethostbyname("m2mthings.com"))==NULL)  {
00084                          DBG("Error resolving address, setting manually.");
00085                          serverAddress.sin_addr.s_addr = inet_addr("109.74.199.96");
00086                     } else {
00087                          DBG("Address resolved OK");
00088                          memcpy((char*)&serverAddress.sin_addr.s_addr, (char*)server->h_addr_list[0], server->h_length);
00089                     }
00090                     // set server address family
00091                     serverAddress.sin_family = AF_INET;
00092                     // set server port
00093                     serverAddress.sin_port = htons(port);
00094          
00095                     // do socket connect
00096                     DBG("Connecting socket to %s:%d", inet_ntoa(serverAddress.sin_addr), ntohs(serverAddress.sin_port));
00097                     if((ret=::connect(sockfd, (const struct sockaddr *)&serverAddress, sizeof(serverAddress)))<0) {
00098                          ::close(sockfd);
00099                          DBG("Could not connect");
00100                     } else {
00101                          DBG("Connection OK");
00102                     }
00103                     
00104                     DBG("Sending password");
00105                     ::write(sockfd,"hi3h892!",8);
00106                     
00107                     ret = ::recv(sockfd,urlBuffer,urlBufferLength,0);
00108                     if (ret<0) {
00109                         DBG("Error receiving ACK.");
00110                     } else {
00111                         DBG("Received(%d): %s",urlBufferLength,urlBuffer);
00112                         modem.sendSM(numBuffer,urlBuffer);
00113                     }
00114                     
00115                     ::close(sockfd);
00116                     */
00117 
00118                 }
00119             }
00120         }
00121         // wait 500ms
00122         Thread::wait(500);
00123     }
00124     
00125   }
00126   
00127   modem.disconnect();
00128   DBG("Disconnected");
00129 
00130   while (1) {
00131     Thread::wait(100);
00132   }
00133 }
00134 
00135 void keepAlive(void const*) {
00136   while (1) {
00137     led1 = !led1;
00138     Thread::wait(250);
00139     led1 = !led1;
00140     Thread::wait(25000);
00141   }
00142 }
00143 
00144 int main() {
00145    DBG_INIT();
00146    DBG_SET_SPEED(115200);
00147    DBG_SET_NEWLINE("\r\n");
00148    int red=0;
00149    int green=0;
00150    int blue=0;
00151    setupShifty();
00152    setLEDColor(500,200,200);
00153    
00154    Thread lightTask(lightListener, NULL, osPriorityNormal, 1024 * 6);
00155    keepAlive(NULL);
00156 }