Host library for controlling a WiConnect enabled Wi-Fi module.

Dependents:   wiconnect-ota_example wiconnect-web_setup_example wiconnect-test-console wiconnect-tcp_server_example ... more

Committer:
dan_ackme
Date:
Mon Aug 11 09:58:24 2014 +0000
Revision:
0:ea85c4bb5e1f
Child:
1:6ec9998427ad
initial check-in

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dan_ackme 0:ea85c4bb5e1f 1 /*
dan_ackme 0:ea85c4bb5e1f 2 * Copyright 2014, ACKme Networks
dan_ackme 0:ea85c4bb5e1f 3 * All Rights Reserved.
dan_ackme 0:ea85c4bb5e1f 4 *
dan_ackme 0:ea85c4bb5e1f 5 * This is UNPUBLISHED PROPRIETARY SOURCE CODE of ACKme Networks;
dan_ackme 0:ea85c4bb5e1f 6 * the contents of this file may not be disclosed to third parties, copied
dan_ackme 0:ea85c4bb5e1f 7 * or duplicated in any form, in whole or in part, without the prior
dan_ackme 0:ea85c4bb5e1f 8 * written permission of ACKme Networks.
dan_ackme 0:ea85c4bb5e1f 9 */
dan_ackme 0:ea85c4bb5e1f 10
dan_ackme 0:ea85c4bb5e1f 11 #include <assert.h>
dan_ackme 0:ea85c4bb5e1f 12
dan_ackme 0:ea85c4bb5e1f 13 #include "Wiconnect.h"
dan_ackme 0:ea85c4bb5e1f 14 #include "types/ScanResult.h"
dan_ackme 0:ea85c4bb5e1f 15 #include "NetworkInterface.h"
dan_ackme 0:ea85c4bb5e1f 16 #include "internal/common.h"
dan_ackme 0:ea85c4bb5e1f 17
dan_ackme 0:ea85c4bb5e1f 18
dan_ackme 0:ea85c4bb5e1f 19 static inline bool floatToFixedPointInt(const char *str, uint32_t *res);
dan_ackme 0:ea85c4bb5e1f 20
dan_ackme 0:ea85c4bb5e1f 21
dan_ackme 0:ea85c4bb5e1f 22
dan_ackme 0:ea85c4bb5e1f 23 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 24 ScanResult::ScanResult()
dan_ackme 0:ea85c4bb5e1f 25 {
dan_ackme 0:ea85c4bb5e1f 26 next = NULL;
dan_ackme 0:ea85c4bb5e1f 27 previous = NULL;
dan_ackme 0:ea85c4bb5e1f 28 channel = 0xff;
dan_ackme 0:ea85c4bb5e1f 29 rssi = -9999;
dan_ackme 0:ea85c4bb5e1f 30 rate = 0;
dan_ackme 0:ea85c4bb5e1f 31 security = NETWORK_SECURITY_UNKNOWN;
dan_ackme 0:ea85c4bb5e1f 32 memset(&mac, 0, (uint32_t)sizeof(mac));
dan_ackme 0:ea85c4bb5e1f 33 memset(&ssid, 0, (uint32_t)sizeof(ssid));
dan_ackme 0:ea85c4bb5e1f 34 }
dan_ackme 0:ea85c4bb5e1f 35
dan_ackme 0:ea85c4bb5e1f 36 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 37 WiconnectResult ScanResult::init(const char *channelStr, const char *rssiStr, const char* macStr, const char *rateStr, const char *secStr, const char *ssidStr)
dan_ackme 0:ea85c4bb5e1f 38 {
dan_ackme 0:ea85c4bb5e1f 39 intmax_t r;
dan_ackme 0:ea85c4bb5e1f 40 if(!StringUtil::parseInt(channelStr, &r, 0, 15))
dan_ackme 0:ea85c4bb5e1f 41 {
dan_ackme 0:ea85c4bb5e1f 42 return WICONNECT_RESPONSE_PARSE_ERROR;
dan_ackme 0:ea85c4bb5e1f 43 }
dan_ackme 0:ea85c4bb5e1f 44 channel = (int)r;
dan_ackme 0:ea85c4bb5e1f 45 if(!StringUtil::parseInt(rssiStr, &r, -200, 100))
dan_ackme 0:ea85c4bb5e1f 46 {
dan_ackme 0:ea85c4bb5e1f 47 return WICONNECT_RESPONSE_PARSE_ERROR;
dan_ackme 0:ea85c4bb5e1f 48 }
dan_ackme 0:ea85c4bb5e1f 49 rssi = (int)r;
dan_ackme 0:ea85c4bb5e1f 50
dan_ackme 0:ea85c4bb5e1f 51 if(!Wiconnect::strToMacAddress(macStr, &mac))
dan_ackme 0:ea85c4bb5e1f 52 {
dan_ackme 0:ea85c4bb5e1f 53 return WICONNECT_RESPONSE_PARSE_ERROR;
dan_ackme 0:ea85c4bb5e1f 54 }
dan_ackme 0:ea85c4bb5e1f 55
dan_ackme 0:ea85c4bb5e1f 56 if(!floatToFixedPointInt(rateStr, &rate))
dan_ackme 0:ea85c4bb5e1f 57 {
dan_ackme 0:ea85c4bb5e1f 58 return WICONNECT_RESPONSE_PARSE_ERROR;
dan_ackme 0:ea85c4bb5e1f 59 }
dan_ackme 0:ea85c4bb5e1f 60 security = Wiconnect::strToNetworkSecurity(secStr);
dan_ackme 0:ea85c4bb5e1f 61
dan_ackme 0:ea85c4bb5e1f 62 if(!Wiconnect::strToSsid(ssidStr, &ssid))
dan_ackme 0:ea85c4bb5e1f 63 {
dan_ackme 0:ea85c4bb5e1f 64 return WICONNECT_RESPONSE_PARSE_ERROR;
dan_ackme 0:ea85c4bb5e1f 65 }
dan_ackme 0:ea85c4bb5e1f 66
dan_ackme 0:ea85c4bb5e1f 67 return WICONNECT_SUCCESS;
dan_ackme 0:ea85c4bb5e1f 68 }
dan_ackme 0:ea85c4bb5e1f 69
dan_ackme 0:ea85c4bb5e1f 70 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 71 void* ScanResult::operator new(size_t size)
dan_ackme 0:ea85c4bb5e1f 72 {
dan_ackme 0:ea85c4bb5e1f 73 assert(Wiconnect::getInstance()->_malloc != NULL);
dan_ackme 0:ea85c4bb5e1f 74 return Wiconnect::getInstance()->_malloc(size);
dan_ackme 0:ea85c4bb5e1f 75 }
dan_ackme 0:ea85c4bb5e1f 76
dan_ackme 0:ea85c4bb5e1f 77 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 78 void ScanResult::operator delete(void* ptr)
dan_ackme 0:ea85c4bb5e1f 79 {
dan_ackme 0:ea85c4bb5e1f 80 assert(Wiconnect::getInstance()->_free != NULL);
dan_ackme 0:ea85c4bb5e1f 81 Wiconnect::getInstance()->_free(ptr);
dan_ackme 0:ea85c4bb5e1f 82 }
dan_ackme 0:ea85c4bb5e1f 83
dan_ackme 0:ea85c4bb5e1f 84 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 85 uint8_t ScanResult::getChannel() const
dan_ackme 0:ea85c4bb5e1f 86 {
dan_ackme 0:ea85c4bb5e1f 87 return channel;
dan_ackme 0:ea85c4bb5e1f 88 }
dan_ackme 0:ea85c4bb5e1f 89 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 90 NetworkSignalStrength ScanResult::getSignalStrength() const
dan_ackme 0:ea85c4bb5e1f 91 {
dan_ackme 0:ea85c4bb5e1f 92 return Wiconnect::rssiToSignalStrength(rssi);
dan_ackme 0:ea85c4bb5e1f 93 }
dan_ackme 0:ea85c4bb5e1f 94 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 95 const MacAddress* ScanResult::getMacAddress() const
dan_ackme 0:ea85c4bb5e1f 96 {
dan_ackme 0:ea85c4bb5e1f 97 return &mac;
dan_ackme 0:ea85c4bb5e1f 98 }
dan_ackme 0:ea85c4bb5e1f 99 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 100 uint32_t ScanResult::getRate() const
dan_ackme 0:ea85c4bb5e1f 101 {
dan_ackme 0:ea85c4bb5e1f 102 return rate;
dan_ackme 0:ea85c4bb5e1f 103 }
dan_ackme 0:ea85c4bb5e1f 104 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 105 const char* ScanResult::getRateStr(char *buffer) const
dan_ackme 0:ea85c4bb5e1f 106 {
dan_ackme 0:ea85c4bb5e1f 107 SET_STR_BUFFER(buffer, 16);
dan_ackme 0:ea85c4bb5e1f 108 uint32_t i = rate / 10;
dan_ackme 0:ea85c4bb5e1f 109 uint32_t f = rate % 10;
dan_ackme 0:ea85c4bb5e1f 110 sprintf(ptr, "%u.%u", i, f);
dan_ackme 0:ea85c4bb5e1f 111 return ptr;
dan_ackme 0:ea85c4bb5e1f 112 }
dan_ackme 0:ea85c4bb5e1f 113 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 114 NetworkSecurity ScanResult::getSecurityType() const
dan_ackme 0:ea85c4bb5e1f 115 {
dan_ackme 0:ea85c4bb5e1f 116 return security;
dan_ackme 0:ea85c4bb5e1f 117 }
dan_ackme 0:ea85c4bb5e1f 118 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 119 const Ssid* ScanResult::getSsid() const
dan_ackme 0:ea85c4bb5e1f 120 {
dan_ackme 0:ea85c4bb5e1f 121 return &ssid;
dan_ackme 0:ea85c4bb5e1f 122 }
dan_ackme 0:ea85c4bb5e1f 123
dan_ackme 0:ea85c4bb5e1f 124 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 125 const ScanResult* ScanResult::getNext() const
dan_ackme 0:ea85c4bb5e1f 126 {
dan_ackme 0:ea85c4bb5e1f 127 return next;
dan_ackme 0:ea85c4bb5e1f 128 }
dan_ackme 0:ea85c4bb5e1f 129
dan_ackme 0:ea85c4bb5e1f 130 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 131 const ScanResult* ScanResult::getPrevious() const
dan_ackme 0:ea85c4bb5e1f 132 {
dan_ackme 0:ea85c4bb5e1f 133 return previous;
dan_ackme 0:ea85c4bb5e1f 134 }
dan_ackme 0:ea85c4bb5e1f 135
dan_ackme 0:ea85c4bb5e1f 136
dan_ackme 0:ea85c4bb5e1f 137 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 138 static inline bool floatToFixedPointInt(const char *str, uint32_t *res)
dan_ackme 0:ea85c4bb5e1f 139 {
dan_ackme 0:ea85c4bb5e1f 140 intmax_t i;
dan_ackme 0:ea85c4bb5e1f 141 intmax_t f = 0;
dan_ackme 0:ea85c4bb5e1f 142 char buffer[32];
dan_ackme 0:ea85c4bb5e1f 143
dan_ackme 0:ea85c4bb5e1f 144 strcpy(buffer, str);
dan_ackme 0:ea85c4bb5e1f 145
dan_ackme 0:ea85c4bb5e1f 146 char* frac = strchr(buffer, '.');
dan_ackme 0:ea85c4bb5e1f 147 if(frac != NULL)
dan_ackme 0:ea85c4bb5e1f 148 {
dan_ackme 0:ea85c4bb5e1f 149 *frac = 0;
dan_ackme 0:ea85c4bb5e1f 150 ++frac;
dan_ackme 0:ea85c4bb5e1f 151 }
dan_ackme 0:ea85c4bb5e1f 152
dan_ackme 0:ea85c4bb5e1f 153 if(!StringUtil::parseInt(buffer, &i, 0, 1000))
dan_ackme 0:ea85c4bb5e1f 154 {
dan_ackme 0:ea85c4bb5e1f 155 return false;
dan_ackme 0:ea85c4bb5e1f 156 }
dan_ackme 0:ea85c4bb5e1f 157 if(frac != NULL && !StringUtil::parseInt(frac, &f, 0, 9))
dan_ackme 0:ea85c4bb5e1f 158 {
dan_ackme 0:ea85c4bb5e1f 159 return false;
dan_ackme 0:ea85c4bb5e1f 160 }
dan_ackme 0:ea85c4bb5e1f 161
dan_ackme 0:ea85c4bb5e1f 162 *res = (((uint32_t)i) * 10) + (uint32_t)f;
dan_ackme 0:ea85c4bb5e1f 163
dan_ackme 0:ea85c4bb5e1f 164 return true;
dan_ackme 0:ea85c4bb5e1f 165 }
dan_ackme 0:ea85c4bb5e1f 166
dan_ackme 0:ea85c4bb5e1f 167