Guest User

Untitled

a guest
Jul 21st, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.23 KB | None | 0 0
  1. #include "KeyInWifi.hpp"
  2. #include <cassert>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <vector>
  6. #include <WiFi.h>
  7. #include <WString.h>
  8. #include <U8x8lib.h>
  9.  
  10. #define DELAY_CHOICE 250
  11. #define DELAY_STEP 1500
  12.  
  13. KeyInWifi::KeyInWifi(U8X8& u8x8, int btnPin, ButtonMode btnMode)
  14. : m_debug(nullptr)
  15. , m_u8x8(u8x8)
  16. , m_btnPin(btnPin)
  17. , m_btnMode(btnMode)
  18. {
  19. }
  20.  
  21. void
  22. KeyInWifi::enableDebug(Print& debug)
  23. {
  24. m_debug = &debug;
  25. }
  26.  
  27. #define DEBUGF(fmt, ...) do { if (m_debug != nullptr) { m_debug->printf_P(PSTR("%d [KeyInWifi] " fmt "\n"), millis(), ##__VA_ARGS__); } } while (false)
  28.  
  29. bool
  30. KeyInWifi::execute()
  31. {
  32. WiFi.persistent(false);
  33. WiFi.mode(WIFI_STA);
  34. WiFi.disconnect();
  35.  
  36. switch (m_btnMode) {
  37. case ButtonMode::NORMAL_LOW:
  38. pinMode(m_btnPin, INPUT_PULLDOWN);
  39. break;
  40. case ButtonMode::NORMAL_HIGH:
  41. pinMode(m_btnPin, INPUT_PULLUP);
  42. break;
  43. }
  44.  
  45. int nNetworks = WiFi.scanNetworks();
  46. nNetworks = std::min(nNetworks, static_cast<int>(m_u8x8.getRows()));
  47. std::vector<String> ssids;
  48. ssids.resize(nNetworks);
  49. std::vector<const char*> cssids;
  50. cssids.resize(nNetworks);
  51. for (int i = 0; i < nNetworks; ++i) {
  52. ssids[i] = WiFi.SSID(i);
  53. cssids[i] = ssids[i].c_str();
  54. }
  55. WiFi.scanDelete();
  56. int ssidIndex = this->promptMenu(cssids.data(), nNetworks);
  57. String ssid = ssids[ssidIndex];
  58. ssids.clear();
  59. cssids.clear();
  60.  
  61. m_u8x8.clear();
  62. m_u8x8.drawString(0, 0, "SSID is");
  63. m_u8x8.drawString(0, 1, ssid.c_str());
  64. m_u8x8.drawString(0, 2, "Enter password");
  65. delay(DELAY_STEP);
  66. String password = this->promptString();
  67.  
  68. m_u8x8.clear();
  69. m_u8x8.drawString(0, 0, "Connecting to");
  70. m_u8x8.drawString(0, 1, ssid.c_str());
  71. m_u8x8.drawString(0, 2, "using password");
  72. m_u8x8.drawString(0, 3, password.c_str());
  73. m_u8x8.drawString(0, 4, "status=");
  74.  
  75. WiFi.begin(ssid.c_str(), password.c_str());
  76. while (!WiFi.isConnected()) {
  77. m_u8x8.drawGlyph(8, 4, '0' + WiFi.status());
  78. }
  79. m_u8x8.drawString(0, 4, "IP=");
  80. m_u8x8.drawString(4, 4, WiFi.localIP().toString().c_str());
  81. return true;
  82. }
  83.  
  84. int
  85. KeyInWifi::promptMenu(char const* const* choices, int nChoices)
  86. {
  87. assert(nChoices > 0);
  88. assert(nChoices <= m_u8x8.getRows());
  89.  
  90. m_u8x8.clear();
  91. for (int i = 0; i < nChoices; ++i) {
  92. m_u8x8.drawString(1, i, choices[i]);
  93. }
  94.  
  95. while (true) {
  96. for (int i = 0; i < nChoices; ++i) {
  97. m_u8x8.drawGlyph(0, (i - 1 + nChoices) % nChoices, ' ');
  98. m_u8x8.drawGlyph(0, i, '>');
  99. for (int t = 0; t < DELAY_CHOICE; ++t) {
  100. if (digitalRead(m_btnPin) != static_cast<int>(m_btnMode)) {
  101. return i;
  102. }
  103. delay(1);
  104. }
  105. }
  106. }
  107. }
  108.  
  109. String
  110. KeyInWifi::promptString()
  111. {
  112. String s;
  113. while (true) {
  114. char const* const choices[] = {
  115. s.c_str(),
  116. "<-",
  117. "0123456789 +._-",
  118. "ABCDEFGHIJKLM",
  119. "NOPQRSTUVWXYZ",
  120. "abcdefghijklm",
  121. "nopqrstuvwxyz",
  122. "~!@#$%^&*()",
  123. };
  124. int choice = this->promptMenu(choices, 8);
  125. switch (choice) {
  126. case 0:
  127. return s;
  128. case 1:
  129. s.remove(s.length() - 1);
  130. break;
  131. case 2:
  132. s += this->promptChar("0123456789 +._-");
  133. break;
  134. case 3:
  135. s += this->promptChar("ABCDEFGHIJKLM");
  136. break;
  137. case 4:
  138. s += this->promptChar("NOPQRSTUVWXYZ");
  139. break;
  140. case 5:
  141. s += this->promptChar("abcdefghijklm");
  142. break;
  143. case 6:
  144. s += this->promptChar("nopqrstuvwxyz");
  145. break;
  146. case 7:
  147. s += this->promptChar("!\"#$%&'()*,/:;<=>?@[\\]^`{|}~");
  148. }
  149. }
  150. }
  151.  
  152. char
  153. KeyInWifi::promptChar(const char* chars)
  154. {
  155. int nChars = std::strlen(chars);
  156. int nRows = m_u8x8.getRows();
  157. int nCols = m_u8x8.getCols();
  158. assert(nChars <= nRows * nCols / 2);
  159.  
  160. m_u8x8.clear();
  161. for (int i = 0; i < nChars; ++i) {
  162. std::div_t xy = std::div(i, nRows);
  163. m_u8x8.drawGlyph(xy.quot * 2 + 1, xy.rem, chars[i]);
  164. }
  165.  
  166. while (true) {
  167. for (int i = 0; i < nChars; ++i) {
  168. std::div_t xy = std::div((i - 1 + nChars) % nChars, nRows);
  169. m_u8x8.drawGlyph(xy.quot * 2, xy.rem, ' ');
  170. xy = std::div(i, nRows);
  171. m_u8x8.drawGlyph(xy.quot * 2, xy.rem, '>');
  172. for (int t = 0; t < DELAY_CHOICE; ++t) {
  173. if (digitalRead(m_btnPin) != static_cast<int>(m_btnMode)) {
  174. return chars[i];
  175. }
  176. delay(1);
  177. }
  178. }
  179. }
  180. }
Add Comment
Please, Sign In to add comment