private fork
Fork of GSwifiInterface by
GSwifi/GSwifi_util.cpp@12:057089026a20, 2013-11-22 (annotated)
- Committer:
- gsfan
- Date:
- Fri Nov 22 14:03:07 2013 +0000
- Revision:
- 12:057089026a20
- Parent:
- 11:71d67fea5ace
add more function (smtp, http, httpd, websocket); fix some function;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
gsfan | 8:64184a968e3b | 1 | /* Copyright (C) 2013 gsfan, MIT License |
gsfan | 8:64184a968e3b | 2 | * |
gsfan | 8:64184a968e3b | 3 | * Permission is hereby granted, free of charge, to any person obtaining a copy of this software |
gsfan | 8:64184a968e3b | 4 | * and associated documentation files (the "Software"), to deal in the Software without restriction, |
gsfan | 8:64184a968e3b | 5 | * including without limitation the rights to use, copy, modify, merge, publish, distribute, |
gsfan | 8:64184a968e3b | 6 | * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is |
gsfan | 8:64184a968e3b | 7 | * furnished to do so, subject to the following conditions: |
gsfan | 8:64184a968e3b | 8 | * |
gsfan | 8:64184a968e3b | 9 | * The above copyright notice and this permission notice shall be included in all copies or |
gsfan | 8:64184a968e3b | 10 | * substantial portions of the Software. |
gsfan | 8:64184a968e3b | 11 | * |
gsfan | 8:64184a968e3b | 12 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING |
gsfan | 8:64184a968e3b | 13 | * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
gsfan | 8:64184a968e3b | 14 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
gsfan | 8:64184a968e3b | 15 | * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
gsfan | 8:64184a968e3b | 16 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
gsfan | 8:64184a968e3b | 17 | */ |
gsfan | 8:64184a968e3b | 18 | |
gsfan | 8:64184a968e3b | 19 | #include "GSwifi.h" |
gsfan | 8:64184a968e3b | 20 | |
gsfan | 8:64184a968e3b | 21 | int GSwifi::x2i (char c) { |
gsfan | 8:64184a968e3b | 22 | if (c >= '0' && c <= '9') { |
gsfan | 8:64184a968e3b | 23 | return c - '0'; |
gsfan | 8:64184a968e3b | 24 | } else |
gsfan | 8:64184a968e3b | 25 | if (c >= 'A' && c <= 'F') { |
gsfan | 8:64184a968e3b | 26 | return c - 'A' + 10; |
gsfan | 8:64184a968e3b | 27 | } else |
gsfan | 8:64184a968e3b | 28 | if (c >= 'a' && c <= 'f') { |
gsfan | 8:64184a968e3b | 29 | return c - 'a' + 10; |
gsfan | 8:64184a968e3b | 30 | } |
gsfan | 8:64184a968e3b | 31 | return 0; |
gsfan | 8:64184a968e3b | 32 | } |
gsfan | 8:64184a968e3b | 33 | |
gsfan | 8:64184a968e3b | 34 | char GSwifi::i2x (int i) { |
gsfan | 8:64184a968e3b | 35 | if (i >= 0 && i <= 9) { |
gsfan | 8:64184a968e3b | 36 | return i + '0'; |
gsfan | 8:64184a968e3b | 37 | } else |
gsfan | 8:64184a968e3b | 38 | if (i >= 10 && i <= 15) { |
gsfan | 8:64184a968e3b | 39 | return i - 10 + 'A'; |
gsfan | 8:64184a968e3b | 40 | } |
gsfan | 8:64184a968e3b | 41 | return 0; |
gsfan | 8:64184a968e3b | 42 | } |
gsfan | 8:64184a968e3b | 43 | |
gsfan | 8:64184a968e3b | 44 | int GSwifi::from_hex (int ch) { |
gsfan | 8:64184a968e3b | 45 | return isdigit(ch) ? ch - '0' : tolower(ch) - 'a' + 10; |
gsfan | 8:64184a968e3b | 46 | } |
gsfan | 8:64184a968e3b | 47 | |
gsfan | 8:64184a968e3b | 48 | int GSwifi::to_hex (int code) { |
gsfan | 8:64184a968e3b | 49 | static char hex[] = "0123456789abcdef"; |
gsfan | 8:64184a968e3b | 50 | return hex[code & 15]; |
gsfan | 8:64184a968e3b | 51 | } |
gsfan | 8:64184a968e3b | 52 | |
gsfan | 8:64184a968e3b | 53 | |
gsfan | 8:64184a968e3b | 54 | int GSwifi::setRegion (int reg) { |
gsfan | 8:64184a968e3b | 55 | return cmdWREGDOMAIN(reg); |
gsfan | 8:64184a968e3b | 56 | } |
gsfan | 8:64184a968e3b | 57 | |
gsfan | 8:64184a968e3b | 58 | int GSwifi::getRssi () { |
gsfan | 8:64184a968e3b | 59 | cmdWRSSI(); |
gsfan | 8:64184a968e3b | 60 | return _state.rssi; |
gsfan | 8:64184a968e3b | 61 | } |
gsfan | 8:64184a968e3b | 62 | |
gsfan | 8:64184a968e3b | 63 | int GSwifi::powerSave (int active, int save) { |
gsfan | 8:64184a968e3b | 64 | cmdWRXACTIVE(active); |
gsfan | 8:64184a968e3b | 65 | return cmdWRXPS(save); |
gsfan | 8:64184a968e3b | 66 | } |
gsfan | 8:64184a968e3b | 67 | |
gsfan | 8:64184a968e3b | 68 | int GSwifi::setRfPower (int power) { |
gsfan | 8:64184a968e3b | 69 | if (power < 0 || power > 7) return false; |
gsfan | 8:64184a968e3b | 70 | return cmdWP(power); |
gsfan | 8:64184a968e3b | 71 | } |
gsfan | 8:64184a968e3b | 72 | |
gsfan | 8:64184a968e3b | 73 | int GSwifi::setTime (time_t time) { |
gsfan | 8:64184a968e3b | 74 | char dmy[16], hms[16]; |
gsfan | 8:64184a968e3b | 75 | struct tm *t = localtime(&time); |
gsfan | 8:64184a968e3b | 76 | |
gsfan | 8:64184a968e3b | 77 | sprintf(dmy, "%d/%d/%d", t->tm_mday, t->tm_mon + 1, t->tm_year + 1900); |
gsfan | 8:64184a968e3b | 78 | sprintf(hms, "%d:%d:%d", t->tm_hour, t->tm_min, t->tm_sec); |
gsfan | 8:64184a968e3b | 79 | return cmdSETTIME(dmy, hms); |
gsfan | 8:64184a968e3b | 80 | } |
gsfan | 8:64184a968e3b | 81 | |
gsfan | 8:64184a968e3b | 82 | time_t GSwifi::getTime () { |
gsfan | 8:64184a968e3b | 83 | cmdGETTIME(); |
gsfan | 8:64184a968e3b | 84 | return _state.time; |
gsfan | 8:64184a968e3b | 85 | } |
gsfan | 8:64184a968e3b | 86 | |
gsfan | 8:64184a968e3b | 87 | int GSwifi::ntpdate (char *host, int sec) { |
gsfan | 8:64184a968e3b | 88 | char ip[17]; |
gsfan | 8:64184a968e3b | 89 | |
gsfan | 12:057089026a20 | 90 | if (!isAssociated() || _state.status != STAT_READY) return -1; |
gsfan | 11:71d67fea5ace | 91 | |
gsfan | 8:64184a968e3b | 92 | if (getHostByName(host, ip)) return -1; |
gsfan | 8:64184a968e3b | 93 | return cmdNTIMESYNC(true, ip, sec); |
gsfan | 8:64184a968e3b | 94 | } |
gsfan | 8:64184a968e3b | 95 | |
gsfan | 8:64184a968e3b | 96 | int GSwifi::setGpio (int port, int out) { |
gsfan | 8:64184a968e3b | 97 | return cmdDGPIO(port, out); |
gsfan | 8:64184a968e3b | 98 | } |
gsfan | 8:64184a968e3b | 99 | |
gsfan | 8:64184a968e3b | 100 | int GSwifi::provisioning (char *user, char *pass) { |
gsfan | 11:71d67fea5ace | 101 | |
gsfan | 12:057089026a20 | 102 | if (!isAssociated() || _state.status != STAT_READY) return -1; |
gsfan | 11:71d67fea5ace | 103 | |
gsfan | 8:64184a968e3b | 104 | return cmdWEBPROV(user, pass); |
gsfan | 8:64184a968e3b | 105 | } |
gsfan | 11:71d67fea5ace | 106 | |
gsfan | 11:71d67fea5ace | 107 | int GSwifi::standby (int msec) { |
gsfan | 11:71d67fea5ace | 108 | switch (_state.status) { |
gsfan | 11:71d67fea5ace | 109 | case STAT_READY: |
gsfan | 11:71d67fea5ace | 110 | cmdNCLOSEALL(); |
gsfan | 11:71d67fea5ace | 111 | for (int i = 0; i < 16; i ++) { |
gsfan | 11:71d67fea5ace | 112 | _con[i].connected = false; |
gsfan | 11:71d67fea5ace | 113 | } |
gsfan | 11:71d67fea5ace | 114 | cmdSTORENWCONN(); |
gsfan | 11:71d67fea5ace | 115 | // cmdWRXACTIVE(false); |
gsfan | 11:71d67fea5ace | 116 | break; |
gsfan | 11:71d67fea5ace | 117 | case STAT_WAKEUP: |
gsfan | 11:71d67fea5ace | 118 | if (cmdE(false)) return -1; |
gsfan | 11:71d67fea5ace | 119 | if (_flow) { |
gsfan | 11:71d67fea5ace | 120 | cmdR(true); |
gsfan | 11:71d67fea5ace | 121 | } |
gsfan | 11:71d67fea5ace | 122 | break; |
gsfan | 11:71d67fea5ace | 123 | default: |
gsfan | 11:71d67fea5ace | 124 | return -1; |
gsfan | 11:71d67fea5ace | 125 | } |
gsfan | 11:71d67fea5ace | 126 | |
gsfan | 11:71d67fea5ace | 127 | _state.status = STAT_STANDBY; |
gsfan | 11:71d67fea5ace | 128 | return cmdPSSTBY(msec, 0); |
gsfan | 11:71d67fea5ace | 129 | } |
gsfan | 11:71d67fea5ace | 130 | |
gsfan | 11:71d67fea5ace | 131 | |
gsfan | 11:71d67fea5ace | 132 | int GSwifi::deepSleep () { |
gsfan | 11:71d67fea5ace | 133 | if (_state.status != STAT_READY) return -1; |
gsfan | 11:71d67fea5ace | 134 | |
gsfan | 11:71d67fea5ace | 135 | _state.status = STAT_DEEPSLEEP; |
gsfan | 11:71d67fea5ace | 136 | return cmdPSDPSLEEP(); // go deep sleep |
gsfan | 11:71d67fea5ace | 137 | } |
gsfan | 11:71d67fea5ace | 138 | |
gsfan | 11:71d67fea5ace | 139 | int GSwifi::wakeup () { |
gsfan | 11:71d67fea5ace | 140 | int r; |
gsfan | 11:71d67fea5ace | 141 | |
gsfan | 11:71d67fea5ace | 142 | if (_state.status == STAT_STANDBY) { |
gsfan | 11:71d67fea5ace | 143 | Timer timeout; |
gsfan | 11:71d67fea5ace | 144 | setAlarm(true); |
gsfan | 11:71d67fea5ace | 145 | timeout.start(); |
gsfan | 11:71d67fea5ace | 146 | while (timeout.read() < CFG_TIMEOUT) { |
gsfan | 11:71d67fea5ace | 147 | if (_state.status == STAT_WAKEUP) break; |
gsfan | 11:71d67fea5ace | 148 | } |
gsfan | 11:71d67fea5ace | 149 | timeout.stop(); |
gsfan | 11:71d67fea5ace | 150 | setAlarm(false); |
gsfan | 11:71d67fea5ace | 151 | } |
gsfan | 11:71d67fea5ace | 152 | |
gsfan | 11:71d67fea5ace | 153 | switch (_state.status) { |
gsfan | 11:71d67fea5ace | 154 | case STAT_WAKEUP: |
gsfan | 11:71d67fea5ace | 155 | if (cmdE(false)) return -1; |
gsfan | 11:71d67fea5ace | 156 | if (_flow) { |
gsfan | 11:71d67fea5ace | 157 | cmdR(true); |
gsfan | 11:71d67fea5ace | 158 | } |
gsfan | 11:71d67fea5ace | 159 | cmdBDATA(true); |
gsfan | 11:71d67fea5ace | 160 | r = cmdRESTORENWCONN(); |
gsfan | 11:71d67fea5ace | 161 | if (!r) { |
gsfan | 11:71d67fea5ace | 162 | wait_ms(100); |
gsfan | 11:71d67fea5ace | 163 | // cmdWRXACTIVE(true); |
gsfan | 11:71d67fea5ace | 164 | _state.status = STAT_READY; |
gsfan | 11:71d67fea5ace | 165 | } |
gsfan | 11:71d67fea5ace | 166 | return r; |
gsfan | 11:71d67fea5ace | 167 | case STAT_DEEPSLEEP: |
gsfan | 11:71d67fea5ace | 168 | r = cmdAT(); |
gsfan | 11:71d67fea5ace | 169 | if (!r) { |
gsfan | 11:71d67fea5ace | 170 | _state.status = STAT_READY; |
gsfan | 11:71d67fea5ace | 171 | } |
gsfan | 11:71d67fea5ace | 172 | return r; |
gsfan | 11:71d67fea5ace | 173 | default: |
gsfan | 11:71d67fea5ace | 174 | break; |
gsfan | 11:71d67fea5ace | 175 | } |
gsfan | 11:71d67fea5ace | 176 | return -1; |
gsfan | 11:71d67fea5ace | 177 | } |