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

Committer:
ashleymills
Date:
Fri Sep 28 09:27:18 2012 +0000
Revision:
0:9a2bd692bc95
Child:
1:662b59c2ce3a
Shiftbrite controlled by RGB messages over USB dongle

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ashleymills 0:9a2bd692bc95 1 #define __DEBUG__ 4 //Maximum verbosity
ashleymills 0:9a2bd692bc95 2 #ifndef __MODULE__
ashleymills 0:9a2bd692bc95 3 #define __MODULE__ "net_3g_basic_http_test.cpp"
ashleymills 0:9a2bd692bc95 4 #endif
ashleymills 0:9a2bd692bc95 5
ashleymills 0:9a2bd692bc95 6 #include "mbed.h"
ashleymills 0:9a2bd692bc95 7 #include "rtos.h"
ashleymills 0:9a2bd692bc95 8 #include "VodafoneUSBModem.h"
ashleymills 0:9a2bd692bc95 9 #include "socket/bsd_socket.h"
ashleymills 0:9a2bd692bc95 10
ashleymills 0:9a2bd692bc95 11 DigitalOut led1(LED1);
ashleymills 0:9a2bd692bc95 12 DigitalOut led2(LED2);
ashleymills 0:9a2bd692bc95 13 DigitalOut led3(LED3);
ashleymills 0:9a2bd692bc95 14 DigitalOut led4(LED4);
ashleymills 0:9a2bd692bc95 15
ashleymills 0:9a2bd692bc95 16 DigitalOut latch(p15);
ashleymills 0:9a2bd692bc95 17 DigitalOut enable(p16);
ashleymills 0:9a2bd692bc95 18 SPI spi(p11, p12, p13);
ashleymills 0:9a2bd692bc95 19
ashleymills 0:9a2bd692bc95 20 void setLEDColor(int red, int green, int blue) {
ashleymills 0:9a2bd692bc95 21 unsigned int low_color=0;
ashleymills 0:9a2bd692bc95 22 unsigned int high_color=0;
ashleymills 0:9a2bd692bc95 23 high_color=(blue<<4)|((red&0x3C0)>>6);
ashleymills 0:9a2bd692bc95 24 low_color=(((red&0x3F)<<10)|(green));
ashleymills 0:9a2bd692bc95 25 spi.write(high_color);
ashleymills 0:9a2bd692bc95 26 spi.write(low_color);
ashleymills 0:9a2bd692bc95 27 latch=1;
ashleymills 0:9a2bd692bc95 28 latch=0;
ashleymills 0:9a2bd692bc95 29 }
ashleymills 0:9a2bd692bc95 30
ashleymills 0:9a2bd692bc95 31 void setupShifty() {
ashleymills 0:9a2bd692bc95 32 spi.format(16,0);
ashleymills 0:9a2bd692bc95 33 spi.frequency(500000);
ashleymills 0:9a2bd692bc95 34 enable=0;
ashleymills 0:9a2bd692bc95 35 latch=0;
ashleymills 0:9a2bd692bc95 36 }
ashleymills 0:9a2bd692bc95 37
ashleymills 0:9a2bd692bc95 38
ashleymills 0:9a2bd692bc95 39 void lightListener(void const*) {
ashleymills 0:9a2bd692bc95 40 VodafoneUSBModem modem;
ashleymills 0:9a2bd692bc95 41 // socket stuff
ashleymills 0:9a2bd692bc95 42 int sockfd,ret = OK;
ashleymills 0:9a2bd692bc95 43 uint16_t port = 3232;
ashleymills 0:9a2bd692bc95 44 struct sockaddr_in serverAddress;
ashleymills 0:9a2bd692bc95 45 struct hostent *server;
ashleymills 0:9a2bd692bc95 46 char urlBuffer[128];
ashleymills 0:9a2bd692bc95 47 int urlBufferLength = 128;
ashleymills 0:9a2bd692bc95 48
ashleymills 0:9a2bd692bc95 49 // declare space for phone number and message storage
ashleymills 0:9a2bd692bc95 50 char numBuffer[20], msgBuffer[512];
ashleymills 0:9a2bd692bc95 51 size_t numSMS; // variable to track number of received messages
ashleymills 0:9a2bd692bc95 52
ashleymills 0:9a2bd692bc95 53 //int ret = modem.connect("internet","web","web");
ashleymills 0:9a2bd692bc95 54
ashleymills 0:9a2bd692bc95 55 if(ret == OK) {
ashleymills 0:9a2bd692bc95 56 int count = 30;
ashleymills 0:9a2bd692bc95 57 int rssi;
ashleymills 0:9a2bd692bc95 58 int r=0,g=0,b=0;
ashleymills 0:9a2bd692bc95 59 LinkMonitor::REGISTRATION_STATE regState;
ashleymills 0:9a2bd692bc95 60 LinkMonitor::BEARER bearer;
ashleymills 0:9a2bd692bc95 61 while(1) {
ashleymills 0:9a2bd692bc95 62
ashleymills 0:9a2bd692bc95 63 //modem.getLinkState(&rssi, &regState, &bearer);
ashleymills 0:9a2bd692bc95 64 //DBG("RSSI: %d dBm; Reg state: %d; Bearer: %d", rssi, regState, bearer);
ashleymills 0:9a2bd692bc95 65
ashleymills 0:9a2bd692bc95 66 // retrieve the short message count into numSMS
ashleymills 0:9a2bd692bc95 67 if(modem.getSMCount(&numSMS)==OK) {
ashleymills 0:9a2bd692bc95 68 // check if any short messages have been received
ashleymills 0:9a2bd692bc95 69 if(numSMS>0) {
ashleymills 0:9a2bd692bc95 70 DBG("SM count > 0");
ashleymills 0:9a2bd692bc95 71 // get the oldest short message in the queue
ashleymills 0:9a2bd692bc95 72 if(modem.getSM(numBuffer,msgBuffer,256)==OK) {
ashleymills 0:9a2bd692bc95 73 sscanf(msgBuffer,"%d,%d,%d",&r,&g,&b);
ashleymills 0:9a2bd692bc95 74 DBG("Setting light to: %d,%d,%d",r,g,b);
ashleymills 0:9a2bd692bc95 75 setLEDColor(r*4,g*4,b*4);
ashleymills 0:9a2bd692bc95 76 // connect to socket and push message
ashleymills 0:9a2bd692bc95 77 /*
ashleymills 0:9a2bd692bc95 78 // create the socket
ashleymills 0:9a2bd692bc95 79 if((sockfd=::socket(AF_INET,SOCK_STREAM,0))<0) { DBG("Error opening socket\r\n"); } else { DBG("Socket open\r\n"); }
ashleymills 0:9a2bd692bc95 80
ashleymills 0:9a2bd692bc95 81 // create the socket address
ashleymills 0:9a2bd692bc95 82 std::memset(&serverAddress, 0, sizeof(struct sockaddr_in));
ashleymills 0:9a2bd692bc95 83 if((server=::gethostbyname("m2mthings.com"))==NULL) {
ashleymills 0:9a2bd692bc95 84 DBG("Error resolving address, setting manually.");
ashleymills 0:9a2bd692bc95 85 serverAddress.sin_addr.s_addr = inet_addr("109.74.199.96");
ashleymills 0:9a2bd692bc95 86 } else {
ashleymills 0:9a2bd692bc95 87 DBG("Address resolved OK");
ashleymills 0:9a2bd692bc95 88 memcpy((char*)&serverAddress.sin_addr.s_addr, (char*)server->h_addr_list[0], server->h_length);
ashleymills 0:9a2bd692bc95 89 }
ashleymills 0:9a2bd692bc95 90 // set server address family
ashleymills 0:9a2bd692bc95 91 serverAddress.sin_family = AF_INET;
ashleymills 0:9a2bd692bc95 92 // set server port
ashleymills 0:9a2bd692bc95 93 serverAddress.sin_port = htons(port);
ashleymills 0:9a2bd692bc95 94
ashleymills 0:9a2bd692bc95 95 // do socket connect
ashleymills 0:9a2bd692bc95 96 DBG("Connecting socket to %s:%d", inet_ntoa(serverAddress.sin_addr), ntohs(serverAddress.sin_port));
ashleymills 0:9a2bd692bc95 97 if((ret=::connect(sockfd, (const struct sockaddr *)&serverAddress, sizeof(serverAddress)))<0) {
ashleymills 0:9a2bd692bc95 98 ::close(sockfd);
ashleymills 0:9a2bd692bc95 99 DBG("Could not connect");
ashleymills 0:9a2bd692bc95 100 } else {
ashleymills 0:9a2bd692bc95 101 DBG("Connection OK");
ashleymills 0:9a2bd692bc95 102 }
ashleymills 0:9a2bd692bc95 103
ashleymills 0:9a2bd692bc95 104 DBG("Sending password");
ashleymills 0:9a2bd692bc95 105 ::write(sockfd,"hi3h892!",8);
ashleymills 0:9a2bd692bc95 106
ashleymills 0:9a2bd692bc95 107 ret = ::recv(sockfd,urlBuffer,urlBufferLength,0);
ashleymills 0:9a2bd692bc95 108 if (ret<0) {
ashleymills 0:9a2bd692bc95 109 DBG("Error receiving ACK.");
ashleymills 0:9a2bd692bc95 110 } else {
ashleymills 0:9a2bd692bc95 111 DBG("Received(%d): %s",urlBufferLength,urlBuffer);
ashleymills 0:9a2bd692bc95 112 modem.sendSM(numBuffer,urlBuffer);
ashleymills 0:9a2bd692bc95 113 }
ashleymills 0:9a2bd692bc95 114
ashleymills 0:9a2bd692bc95 115 ::close(sockfd);
ashleymills 0:9a2bd692bc95 116 */
ashleymills 0:9a2bd692bc95 117
ashleymills 0:9a2bd692bc95 118 }
ashleymills 0:9a2bd692bc95 119 }
ashleymills 0:9a2bd692bc95 120 }
ashleymills 0:9a2bd692bc95 121 // wait 500ms
ashleymills 0:9a2bd692bc95 122 Thread::wait(500);
ashleymills 0:9a2bd692bc95 123 }
ashleymills 0:9a2bd692bc95 124
ashleymills 0:9a2bd692bc95 125 }
ashleymills 0:9a2bd692bc95 126
ashleymills 0:9a2bd692bc95 127 modem.disconnect();
ashleymills 0:9a2bd692bc95 128 DBG("Disconnected");
ashleymills 0:9a2bd692bc95 129
ashleymills 0:9a2bd692bc95 130 while (1) {
ashleymills 0:9a2bd692bc95 131 Thread::wait(100);
ashleymills 0:9a2bd692bc95 132 }
ashleymills 0:9a2bd692bc95 133 }
ashleymills 0:9a2bd692bc95 134
ashleymills 0:9a2bd692bc95 135 void keepAlive(void const*) {
ashleymills 0:9a2bd692bc95 136 while (1) {
ashleymills 0:9a2bd692bc95 137 led1 = !led1;
ashleymills 0:9a2bd692bc95 138 Thread::wait(250);
ashleymills 0:9a2bd692bc95 139 led1 = !led1;
ashleymills 0:9a2bd692bc95 140 Thread::wait(25000);
ashleymills 0:9a2bd692bc95 141 }
ashleymills 0:9a2bd692bc95 142 }
ashleymills 0:9a2bd692bc95 143
ashleymills 0:9a2bd692bc95 144 int main() {
ashleymills 0:9a2bd692bc95 145 DBG_INIT();
ashleymills 0:9a2bd692bc95 146 DBG_SET_SPEED(115200);
ashleymills 0:9a2bd692bc95 147 DBG_SET_NEWLINE("\r\n");
ashleymills 0:9a2bd692bc95 148 int red=0;
ashleymills 0:9a2bd692bc95 149 int green=0;
ashleymills 0:9a2bd692bc95 150 int blue=0;
ashleymills 0:9a2bd692bc95 151 setupShifty();
ashleymills 0:9a2bd692bc95 152 setLEDColor(500,200,200);
ashleymills 0:9a2bd692bc95 153
ashleymills 0:9a2bd692bc95 154 Thread lightTask(lightListener, NULL, osPriorityNormal, 1024 * 6);
ashleymills 0:9a2bd692bc95 155 keepAlive(NULL);
ashleymills 0:9a2bd692bc95 156 }