Avnet / WncControllerLibrary

Fork of WncControllerLibrary by Fred Kellerman

Committer:
fkellermavnet
Date:
Wed Aug 31 02:06:26 2016 +0000
Revision:
0:affdbb35faa4
Child:
1:ac2de545b981
Create a library for the WNC controller.

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 0:affdbb35faa4 33 WncControllerK64F::WncControllerK64F(const char * const apnStr, struct WncGpioPinListK64F * pPins, Serial * wnc_uart, Serial * debug_uart)
fkellermavnet 0:affdbb35faa4 34 : WncController(apnStr)
fkellermavnet 0:affdbb35faa4 35 {
fkellermavnet 0:affdbb35faa4 36 m_logTimer.start(); // Start the log timer now!
fkellermavnet 0:affdbb35faa4 37 m_pDbgUart = debug_uart;
fkellermavnet 0:affdbb35faa4 38 m_pWncUart = wnc_uart;
fkellermavnet 0:affdbb35faa4 39 m_gpioPinList = *pPins;
fkellermavnet 0:affdbb35faa4 40 }
fkellermavnet 0:affdbb35faa4 41
fkellermavnet 0:affdbb35faa4 42 int WncControllerK64F::putc(char c)
fkellermavnet 0:affdbb35faa4 43 {
fkellermavnet 0:affdbb35faa4 44 return (m_pWncUart->putc(c));
fkellermavnet 0:affdbb35faa4 45 }
fkellermavnet 0:affdbb35faa4 46
fkellermavnet 0:affdbb35faa4 47 int WncControllerK64F::puts(const char * s)
fkellermavnet 0:affdbb35faa4 48 {
fkellermavnet 0:affdbb35faa4 49 return (m_pWncUart->puts(s));
fkellermavnet 0:affdbb35faa4 50 }
fkellermavnet 0:affdbb35faa4 51
fkellermavnet 0:affdbb35faa4 52 char WncControllerK64F::getc(void)
fkellermavnet 0:affdbb35faa4 53 {
fkellermavnet 0:affdbb35faa4 54 return (m_pWncUart->getc());
fkellermavnet 0:affdbb35faa4 55 }
fkellermavnet 0:affdbb35faa4 56
fkellermavnet 0:affdbb35faa4 57 int WncControllerK64F::byteReady(void)
fkellermavnet 0:affdbb35faa4 58 {
fkellermavnet 0:affdbb35faa4 59 return (m_pWncUart->readable());
fkellermavnet 0:affdbb35faa4 60 }
fkellermavnet 0:affdbb35faa4 61
fkellermavnet 0:affdbb35faa4 62 int WncControllerK64F::dbgWriteByte(char b)
fkellermavnet 0:affdbb35faa4 63 {
fkellermavnet 0:affdbb35faa4 64 if (m_pDbgUart != NULL)
fkellermavnet 0:affdbb35faa4 65 return (m_pDbgUart->putc(b));
fkellermavnet 0:affdbb35faa4 66 else
fkellermavnet 0:affdbb35faa4 67 return (0);
fkellermavnet 0:affdbb35faa4 68 }
fkellermavnet 0:affdbb35faa4 69
fkellermavnet 0:affdbb35faa4 70 int WncControllerK64F::dbgWriteBytes(const char * b)
fkellermavnet 0:affdbb35faa4 71 {
fkellermavnet 0:affdbb35faa4 72 if (m_pDbgUart != NULL)
fkellermavnet 0:affdbb35faa4 73 return (m_pDbgUart->puts(b));
fkellermavnet 0:affdbb35faa4 74 else
fkellermavnet 0:affdbb35faa4 75 return (0);
fkellermavnet 0:affdbb35faa4 76 }
fkellermavnet 0:affdbb35faa4 77
fkellermavnet 0:affdbb35faa4 78 bool WncControllerK64F::initWncModem(uint8_t powerUpTimeoutSecs)
fkellermavnet 0:affdbb35faa4 79 {
fkellermavnet 0:affdbb35faa4 80 // Hard reset the modem (doesn't go through
fkellermavnet 0:affdbb35faa4 81 // the signal level translator)
fkellermavnet 0:affdbb35faa4 82 *m_gpioPinList.mdm_reset = 0;
fkellermavnet 0:affdbb35faa4 83
fkellermavnet 0:affdbb35faa4 84 // disable signal level translator (necessary
fkellermavnet 0:affdbb35faa4 85 // for the modem to boot properly). All signals
fkellermavnet 0:affdbb35faa4 86 // except mdm_reset go through the level translator
fkellermavnet 0:affdbb35faa4 87 // and have internal pull-up/down in the module. While
fkellermavnet 0:affdbb35faa4 88 // the level translator is disabled, these pins will
fkellermavnet 0:affdbb35faa4 89 // be in the correct state.
fkellermavnet 0:affdbb35faa4 90 *m_gpioPinList.shield_3v3_1v8_sig_trans_ena = 0;
fkellermavnet 0:affdbb35faa4 91
fkellermavnet 0:affdbb35faa4 92 // While the level translator is disabled and ouptut pins
fkellermavnet 0:affdbb35faa4 93 // are tristated, make sure the inputs are in the same state
fkellermavnet 0:affdbb35faa4 94 // as the WNC Module pins so that when the level translator is
fkellermavnet 0:affdbb35faa4 95 // enabled, there are no differences.
fkellermavnet 0:affdbb35faa4 96 *m_gpioPinList.mdm_uart2_rx_boot_mode_sel = 1; // UART2_RX should be high
fkellermavnet 0:affdbb35faa4 97 *m_gpioPinList.mdm_power_on = 0; // powr_on should be low
fkellermavnet 0:affdbb35faa4 98 *m_gpioPinList.mdm_wakeup_in = 1; // wake-up should be high
fkellermavnet 0:affdbb35faa4 99 *m_gpioPinList.mdm_uart1_cts = 0; // indicate that it is ok to send
fkellermavnet 0:affdbb35faa4 100
fkellermavnet 0:affdbb35faa4 101 // Now, wait for the WNC Module to perform its initial boot correctly
fkellermavnet 0:affdbb35faa4 102 waitMs(1000);
fkellermavnet 0:affdbb35faa4 103
fkellermavnet 0:affdbb35faa4 104 // The WNC module initializes comms at 115200 8N1 so set it up
fkellermavnet 0:affdbb35faa4 105 m_pWncUart->baud(115200);
fkellermavnet 0:affdbb35faa4 106
fkellermavnet 0:affdbb35faa4 107 //Now, enable the level translator, the input pins should now be the
fkellermavnet 0:affdbb35faa4 108 //same as how the M14A module is driving them with internal pull ups/downs.
fkellermavnet 0:affdbb35faa4 109 //When enabled, there will be no changes in these 4 pins...
fkellermavnet 0:affdbb35faa4 110 *m_gpioPinList.shield_3v3_1v8_sig_trans_ena = 1;
fkellermavnet 0:affdbb35faa4 111
fkellermavnet 0:affdbb35faa4 112 return (waitForPowerOnModemToRespond(powerUpTimeoutSecs));
fkellermavnet 0:affdbb35faa4 113 }
fkellermavnet 0:affdbb35faa4 114
fkellermavnet 0:affdbb35faa4 115 void WncControllerK64F::waitMs(int t)
fkellermavnet 0:affdbb35faa4 116 {
fkellermavnet 0:affdbb35faa4 117 wait_ms(t);
fkellermavnet 0:affdbb35faa4 118 }
fkellermavnet 0:affdbb35faa4 119
fkellermavnet 0:affdbb35faa4 120 void WncControllerK64F::waitUs(int t)
fkellermavnet 0:affdbb35faa4 121 {
fkellermavnet 0:affdbb35faa4 122 wait_ms(t);
fkellermavnet 0:affdbb35faa4 123 }
fkellermavnet 0:affdbb35faa4 124
fkellermavnet 0:affdbb35faa4 125 int WncControllerK64F::getLogTimerTicks(void)
fkellermavnet 0:affdbb35faa4 126 {
fkellermavnet 0:affdbb35faa4 127 return (m_logTimer.read_us());
fkellermavnet 0:affdbb35faa4 128 }
fkellermavnet 0:affdbb35faa4 129
fkellermavnet 0:affdbb35faa4 130 void WncControllerK64F::startTimerA(void)
fkellermavnet 0:affdbb35faa4 131 {
fkellermavnet 0:affdbb35faa4 132 m_timerA.start();
fkellermavnet 0:affdbb35faa4 133 m_timerA.reset();
fkellermavnet 0:affdbb35faa4 134 }
fkellermavnet 0:affdbb35faa4 135
fkellermavnet 0:affdbb35faa4 136 void WncControllerK64F::stopTimerA(void)
fkellermavnet 0:affdbb35faa4 137 {
fkellermavnet 0:affdbb35faa4 138 m_timerA.stop();
fkellermavnet 0:affdbb35faa4 139 }
fkellermavnet 0:affdbb35faa4 140
fkellermavnet 0:affdbb35faa4 141 int WncControllerK64F::getUsTimerTicksA(void)
fkellermavnet 0:affdbb35faa4 142 {
fkellermavnet 0:affdbb35faa4 143 return (m_timerA.read_us());
fkellermavnet 0:affdbb35faa4 144 }
fkellermavnet 0:affdbb35faa4 145
fkellermavnet 0:affdbb35faa4 146 void WncControllerK64F::startTimerB(void)
fkellermavnet 0:affdbb35faa4 147 {
fkellermavnet 0:affdbb35faa4 148 m_timerB.start();
fkellermavnet 0:affdbb35faa4 149 m_timerB.reset();
fkellermavnet 0:affdbb35faa4 150 }
fkellermavnet 0:affdbb35faa4 151
fkellermavnet 0:affdbb35faa4 152 void WncControllerK64F::stopTimerB(void)
fkellermavnet 0:affdbb35faa4 153 {
fkellermavnet 0:affdbb35faa4 154 m_timerB.stop();
fkellermavnet 0:affdbb35faa4 155 }
fkellermavnet 0:affdbb35faa4 156
fkellermavnet 0:affdbb35faa4 157 int WncControllerK64F::getUsTimerTicksB(void)
fkellermavnet 0:affdbb35faa4 158 {
fkellermavnet 0:affdbb35faa4 159 return (m_timerB.read_us());
fkellermavnet 0:affdbb35faa4 160 }