Avnet / WncControllerLibrary

Fork of WncControllerLibrary by Fred Kellerman

Committer:
fkellermavnet
Date:
Thu Sep 01 22:28:10 2016 +0000
Revision:
2:30d78cda6779
Parent:
1:ac2de545b981
Added a new method to K64F library to allow one to type in the debug serial port and send and receive commands to the WNC.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fkellermavnet 0:affdbb35faa4 1 /*
fkellermavnet 0:affdbb35faa4 2 Copyright (c) 2016 Fred Kellerman
fkellermavnet 0:affdbb35faa4 3
fkellermavnet 0:affdbb35faa4 4 Permission is hereby granted, free of charge, to any person obtaining a copy
fkellermavnet 0:affdbb35faa4 5 of this software and associated documentation files (the "Software"), to deal
fkellermavnet 0:affdbb35faa4 6 in the Software without restriction, including without limitation the rights
fkellermavnet 0:affdbb35faa4 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
fkellermavnet 0:affdbb35faa4 8 copies of the Software, and to permit persons to whom the Software is
fkellermavnet 0:affdbb35faa4 9 furnished to do so, subject to the following conditions:
fkellermavnet 0:affdbb35faa4 10
fkellermavnet 0:affdbb35faa4 11 The above copyright notice and this permission notice shall be included in
fkellermavnet 0:affdbb35faa4 12 all copies or substantial portions of the Software.
fkellermavnet 0:affdbb35faa4 13
fkellermavnet 0:affdbb35faa4 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
fkellermavnet 0:affdbb35faa4 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
fkellermavnet 0:affdbb35faa4 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
fkellermavnet 0:affdbb35faa4 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
fkellermavnet 0:affdbb35faa4 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
fkellermavnet 0:affdbb35faa4 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
fkellermavnet 0:affdbb35faa4 20 THE SOFTWARE.
fkellermavnet 0:affdbb35faa4 21
fkellermavnet 0:affdbb35faa4 22 @file WncController.cpp
fkellermavnet 0:affdbb35faa4 23 @purpose Controls WNC Cellular Modem
fkellermavnet 0:affdbb35faa4 24 @version 1.0
fkellermavnet 0:affdbb35faa4 25 @date July 2016
fkellermavnet 0:affdbb35faa4 26 @author Fred Kellerman
fkellermavnet 0:affdbb35faa4 27 */
fkellermavnet 0:affdbb35faa4 28
fkellermavnet 0:affdbb35faa4 29 #include "WncControllerK64F.h"
fkellermavnet 0:affdbb35faa4 30
fkellermavnet 0:affdbb35faa4 31 using namespace WncControllerK64F_fk;
fkellermavnet 0:affdbb35faa4 32
fkellermavnet 1:ac2de545b981 33 WncControllerK64F::WncControllerK64F(struct WncGpioPinListK64F * pPins, MODSERIAL * wnc_uart, MODSERIAL * debug_uart)
fkellermavnet 0:affdbb35faa4 34 {
fkellermavnet 0:affdbb35faa4 35 m_logTimer.start(); // Start the log timer now!
fkellermavnet 0:affdbb35faa4 36 m_pDbgUart = debug_uart;
fkellermavnet 0:affdbb35faa4 37 m_pWncUart = wnc_uart;
fkellermavnet 0:affdbb35faa4 38 m_gpioPinList = *pPins;
fkellermavnet 0:affdbb35faa4 39 }
fkellermavnet 0:affdbb35faa4 40
fkellermavnet 2:30d78cda6779 41 bool WncControllerK64F::enterWncTerminalMode(bool echoOn)
fkellermavnet 2:30d78cda6779 42 {
fkellermavnet 2:30d78cda6779 43 string * resp;
fkellermavnet 2:30d78cda6779 44 AtCmdErr_e r = sendWncCmd("AT", &resp, 500);
fkellermavnet 2:30d78cda6779 45 if (r == WNC_AT_CMD_TIMEOUT)
fkellermavnet 2:30d78cda6779 46 return (false);
fkellermavnet 2:30d78cda6779 47
fkellermavnet 2:30d78cda6779 48 m_pDbgUart->puts("\r\nEntering WNC Terminal Mode - press <CTRL>-Q to exit!\r\n");
fkellermavnet 2:30d78cda6779 49
fkellermavnet 2:30d78cda6779 50 while (1) {
fkellermavnet 2:30d78cda6779 51 if (m_pDbgUart->readable()) {
fkellermavnet 2:30d78cda6779 52 char c = m_pDbgUart->getc();
fkellermavnet 2:30d78cda6779 53 if (c == '\x11') {
fkellermavnet 2:30d78cda6779 54 m_pDbgUart->puts("\r\nExiting WNC Terminal Mode!\r\n");
fkellermavnet 2:30d78cda6779 55 // Cleanup in case user doesn't finish command:
fkellermavnet 2:30d78cda6779 56 sendWncCmd("AT", &resp, 300);
fkellermavnet 2:30d78cda6779 57 // Above AT may fail but should get WNC back in sync
fkellermavnet 2:30d78cda6779 58 return (sendWncCmd("AT", &resp, 500) == WNC_AT_CMD_OK);
fkellermavnet 2:30d78cda6779 59 }
fkellermavnet 2:30d78cda6779 60 if (echoOn == true) {
fkellermavnet 2:30d78cda6779 61 m_pDbgUart->putc(c);
fkellermavnet 2:30d78cda6779 62 }
fkellermavnet 2:30d78cda6779 63 m_pWncUart->putc(c);
fkellermavnet 2:30d78cda6779 64 }
fkellermavnet 2:30d78cda6779 65 if (m_pWncUart->readable())
fkellermavnet 2:30d78cda6779 66 m_pDbgUart->putc(m_pWncUart->getc());
fkellermavnet 2:30d78cda6779 67 }
fkellermavnet 2:30d78cda6779 68 }
fkellermavnet 2:30d78cda6779 69
fkellermavnet 2:30d78cda6779 70
fkellermavnet 0:affdbb35faa4 71 int WncControllerK64F::putc(char c)
fkellermavnet 0:affdbb35faa4 72 {
fkellermavnet 0:affdbb35faa4 73 return (m_pWncUart->putc(c));
fkellermavnet 0:affdbb35faa4 74 }
fkellermavnet 0:affdbb35faa4 75
fkellermavnet 0:affdbb35faa4 76 int WncControllerK64F::puts(const char * s)
fkellermavnet 0:affdbb35faa4 77 {
fkellermavnet 0:affdbb35faa4 78 return (m_pWncUart->puts(s));
fkellermavnet 0:affdbb35faa4 79 }
fkellermavnet 0:affdbb35faa4 80
fkellermavnet 0:affdbb35faa4 81 char WncControllerK64F::getc(void)
fkellermavnet 0:affdbb35faa4 82 {
fkellermavnet 0:affdbb35faa4 83 return (m_pWncUart->getc());
fkellermavnet 0:affdbb35faa4 84 }
fkellermavnet 0:affdbb35faa4 85
fkellermavnet 1:ac2de545b981 86 int WncControllerK64F::charReady(void)
fkellermavnet 0:affdbb35faa4 87 {
fkellermavnet 0:affdbb35faa4 88 return (m_pWncUart->readable());
fkellermavnet 0:affdbb35faa4 89 }
fkellermavnet 0:affdbb35faa4 90
fkellermavnet 1:ac2de545b981 91 int WncControllerK64F::dbgWriteChar(char b)
fkellermavnet 0:affdbb35faa4 92 {
fkellermavnet 0:affdbb35faa4 93 if (m_pDbgUart != NULL)
fkellermavnet 0:affdbb35faa4 94 return (m_pDbgUart->putc(b));
fkellermavnet 0:affdbb35faa4 95 else
fkellermavnet 0:affdbb35faa4 96 return (0);
fkellermavnet 0:affdbb35faa4 97 }
fkellermavnet 0:affdbb35faa4 98
fkellermavnet 1:ac2de545b981 99 int WncControllerK64F::dbgWriteChars(const char * b)
fkellermavnet 0:affdbb35faa4 100 {
fkellermavnet 0:affdbb35faa4 101 if (m_pDbgUart != NULL)
fkellermavnet 0:affdbb35faa4 102 return (m_pDbgUart->puts(b));
fkellermavnet 0:affdbb35faa4 103 else
fkellermavnet 0:affdbb35faa4 104 return (0);
fkellermavnet 0:affdbb35faa4 105 }
fkellermavnet 0:affdbb35faa4 106
fkellermavnet 0:affdbb35faa4 107 bool WncControllerK64F::initWncModem(uint8_t powerUpTimeoutSecs)
fkellermavnet 0:affdbb35faa4 108 {
fkellermavnet 0:affdbb35faa4 109 // Hard reset the modem (doesn't go through
fkellermavnet 0:affdbb35faa4 110 // the signal level translator)
fkellermavnet 0:affdbb35faa4 111 *m_gpioPinList.mdm_reset = 0;
fkellermavnet 0:affdbb35faa4 112
fkellermavnet 0:affdbb35faa4 113 // disable signal level translator (necessary
fkellermavnet 0:affdbb35faa4 114 // for the modem to boot properly). All signals
fkellermavnet 0:affdbb35faa4 115 // except mdm_reset go through the level translator
fkellermavnet 0:affdbb35faa4 116 // and have internal pull-up/down in the module. While
fkellermavnet 0:affdbb35faa4 117 // the level translator is disabled, these pins will
fkellermavnet 0:affdbb35faa4 118 // be in the correct state.
fkellermavnet 0:affdbb35faa4 119 *m_gpioPinList.shield_3v3_1v8_sig_trans_ena = 0;
fkellermavnet 0:affdbb35faa4 120
fkellermavnet 0:affdbb35faa4 121 // While the level translator is disabled and ouptut pins
fkellermavnet 0:affdbb35faa4 122 // are tristated, make sure the inputs are in the same state
fkellermavnet 0:affdbb35faa4 123 // as the WNC Module pins so that when the level translator is
fkellermavnet 0:affdbb35faa4 124 // enabled, there are no differences.
fkellermavnet 0:affdbb35faa4 125 *m_gpioPinList.mdm_uart2_rx_boot_mode_sel = 1; // UART2_RX should be high
fkellermavnet 0:affdbb35faa4 126 *m_gpioPinList.mdm_power_on = 0; // powr_on should be low
fkellermavnet 0:affdbb35faa4 127 *m_gpioPinList.mdm_wakeup_in = 1; // wake-up should be high
fkellermavnet 0:affdbb35faa4 128 *m_gpioPinList.mdm_uart1_cts = 0; // indicate that it is ok to send
fkellermavnet 0:affdbb35faa4 129
fkellermavnet 0:affdbb35faa4 130 // Now, wait for the WNC Module to perform its initial boot correctly
fkellermavnet 0:affdbb35faa4 131 waitMs(1000);
fkellermavnet 0:affdbb35faa4 132
fkellermavnet 0:affdbb35faa4 133 // The WNC module initializes comms at 115200 8N1 so set it up
fkellermavnet 0:affdbb35faa4 134 m_pWncUart->baud(115200);
fkellermavnet 0:affdbb35faa4 135
fkellermavnet 0:affdbb35faa4 136 //Now, enable the level translator, the input pins should now be the
fkellermavnet 0:affdbb35faa4 137 //same as how the M14A module is driving them with internal pull ups/downs.
fkellermavnet 0:affdbb35faa4 138 //When enabled, there will be no changes in these 4 pins...
fkellermavnet 0:affdbb35faa4 139 *m_gpioPinList.shield_3v3_1v8_sig_trans_ena = 1;
fkellermavnet 0:affdbb35faa4 140
fkellermavnet 0:affdbb35faa4 141 return (waitForPowerOnModemToRespond(powerUpTimeoutSecs));
fkellermavnet 0:affdbb35faa4 142 }
fkellermavnet 0:affdbb35faa4 143
fkellermavnet 0:affdbb35faa4 144 void WncControllerK64F::waitMs(int t)
fkellermavnet 0:affdbb35faa4 145 {
fkellermavnet 0:affdbb35faa4 146 wait_ms(t);
fkellermavnet 0:affdbb35faa4 147 }
fkellermavnet 0:affdbb35faa4 148
fkellermavnet 0:affdbb35faa4 149 void WncControllerK64F::waitUs(int t)
fkellermavnet 0:affdbb35faa4 150 {
fkellermavnet 0:affdbb35faa4 151 wait_ms(t);
fkellermavnet 0:affdbb35faa4 152 }
fkellermavnet 0:affdbb35faa4 153
fkellermavnet 0:affdbb35faa4 154 int WncControllerK64F::getLogTimerTicks(void)
fkellermavnet 0:affdbb35faa4 155 {
fkellermavnet 0:affdbb35faa4 156 return (m_logTimer.read_us());
fkellermavnet 0:affdbb35faa4 157 }
fkellermavnet 0:affdbb35faa4 158
fkellermavnet 0:affdbb35faa4 159 void WncControllerK64F::startTimerA(void)
fkellermavnet 0:affdbb35faa4 160 {
fkellermavnet 0:affdbb35faa4 161 m_timerA.start();
fkellermavnet 0:affdbb35faa4 162 m_timerA.reset();
fkellermavnet 0:affdbb35faa4 163 }
fkellermavnet 0:affdbb35faa4 164
fkellermavnet 0:affdbb35faa4 165 void WncControllerK64F::stopTimerA(void)
fkellermavnet 0:affdbb35faa4 166 {
fkellermavnet 0:affdbb35faa4 167 m_timerA.stop();
fkellermavnet 0:affdbb35faa4 168 }
fkellermavnet 0:affdbb35faa4 169
fkellermavnet 1:ac2de545b981 170 int WncControllerK64F::getTimerTicksA_mS(void)
fkellermavnet 0:affdbb35faa4 171 {
fkellermavnet 1:ac2de545b981 172 return (m_timerA.read_ms());
fkellermavnet 0:affdbb35faa4 173 }
fkellermavnet 0:affdbb35faa4 174
fkellermavnet 0:affdbb35faa4 175 void WncControllerK64F::startTimerB(void)
fkellermavnet 0:affdbb35faa4 176 {
fkellermavnet 0:affdbb35faa4 177 m_timerB.start();
fkellermavnet 0:affdbb35faa4 178 m_timerB.reset();
fkellermavnet 0:affdbb35faa4 179 }
fkellermavnet 0:affdbb35faa4 180
fkellermavnet 0:affdbb35faa4 181 void WncControllerK64F::stopTimerB(void)
fkellermavnet 0:affdbb35faa4 182 {
fkellermavnet 0:affdbb35faa4 183 m_timerB.stop();
fkellermavnet 0:affdbb35faa4 184 }
fkellermavnet 0:affdbb35faa4 185
fkellermavnet 1:ac2de545b981 186 int WncControllerK64F::getTimerTicksB_mS(void)
fkellermavnet 0:affdbb35faa4 187 {
fkellermavnet 1:ac2de545b981 188 return (m_timerB.read_ms());
fkellermavnet 0:affdbb35faa4 189 }