A shiftbrite controlled by a Vodafone USB modem
Dependencies: VodafoneUSBModem_bleedingedge mbed-rtos mbed
main.cpp@0:9a2bd692bc95, 2012-09-28 (annotated)
- Committer:
- ashleymills
- Date:
- Fri Sep 28 09:27:18 2012 +0000
- Revision:
- 0:9a2bd692bc95
Shiftbrite controlled by RGB messages over USB dongle
Who changed what in which revision?
User | Revision | Line number | New 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, ®State, &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 | } |