MAX3421E-based USB Host Shield Library

Dependents:   UsbHostMAX3421E_Hello

Committer:
hudakz
Date:
Mon Jul 13 07:03:06 2020 +0000
Revision:
1:2263e77400e9
Parent:
0:84353c479782
MAX3421E-based USB Host Shield Library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hudakz 0:84353c479782 1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
hudakz 0:84353c479782 2
hudakz 0:84353c479782 3 This program is free software; you can redistribute it and/or modify
hudakz 0:84353c479782 4 it under the terms of the GNU General Public License as published by
hudakz 0:84353c479782 5 the Free Software Foundation; either version 2 of the License, or
hudakz 0:84353c479782 6 (at your option) any later version.
hudakz 0:84353c479782 7
hudakz 0:84353c479782 8 This program is distributed in the hope that it will be useful,
hudakz 0:84353c479782 9 but WITHOUT ANY WARRANTY; without even the implied warranty of
hudakz 0:84353c479782 10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
hudakz 0:84353c479782 11 GNU General Public License for more details.
hudakz 0:84353c479782 12
hudakz 0:84353c479782 13 You should have received a copy of the GNU General Public License
hudakz 0:84353c479782 14 along with this program; if not, write to the Free Software
hudakz 0:84353c479782 15 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
hudakz 0:84353c479782 16
hudakz 0:84353c479782 17 Contact information
hudakz 0:84353c479782 18 -------------------
hudakz 0:84353c479782 19
hudakz 0:84353c479782 20 Circuits At Home, LTD
hudakz 0:84353c479782 21 Web : http://www.circuitsathome.com
hudakz 0:84353c479782 22 e-mail : support@circuitsathome.com
hudakz 0:84353c479782 23 */
hudakz 0:84353c479782 24
hudakz 0:84353c479782 25 #if !defined(_usb_h_) || defined(__PARSETOOLS_H__)
hudakz 0:84353c479782 26 #error "Never include parsetools.h directly; include Usb.h instead"
hudakz 0:84353c479782 27 #else
hudakz 0:84353c479782 28 #define __PARSETOOLS_H__
hudakz 0:84353c479782 29
hudakz 0:84353c479782 30 struct MultiValueBuffer {
hudakz 0:84353c479782 31 uint8_t valueSize;
hudakz 0:84353c479782 32 void *pValue;
hudakz 0:84353c479782 33
hudakz 0:84353c479782 34 public:
hudakz 0:84353c479782 35
hudakz 0:84353c479782 36 MultiValueBuffer() : valueSize(0), pValue(NULL) {
hudakz 0:84353c479782 37 };
hudakz 0:84353c479782 38 } __attribute__((packed));
hudakz 0:84353c479782 39
hudakz 0:84353c479782 40 class MultiByteValueParser {
hudakz 0:84353c479782 41 uint8_t * pBuf;
hudakz 0:84353c479782 42 uint8_t countDown;
hudakz 0:84353c479782 43 uint8_t valueSize;
hudakz 0:84353c479782 44
hudakz 0:84353c479782 45 public:
hudakz 0:84353c479782 46
hudakz 0:84353c479782 47 MultiByteValueParser() : pBuf(NULL), countDown(0), valueSize(0) {
hudakz 0:84353c479782 48 };
hudakz 0:84353c479782 49
hudakz 0:84353c479782 50 const uint8_t* GetBuffer() {
hudakz 0:84353c479782 51 return pBuf;
hudakz 0:84353c479782 52 };
hudakz 0:84353c479782 53
hudakz 0:84353c479782 54 void Initialize(MultiValueBuffer * const pbuf) {
hudakz 0:84353c479782 55 pBuf = (uint8_t*)pbuf->pValue;
hudakz 0:84353c479782 56 countDown = valueSize = pbuf->valueSize;
hudakz 0:84353c479782 57 };
hudakz 0:84353c479782 58
hudakz 0:84353c479782 59 bool Parse(uint8_t **pp, uint16_t *pcntdn);
hudakz 0:84353c479782 60 };
hudakz 0:84353c479782 61
hudakz 0:84353c479782 62 class ByteSkipper {
hudakz 0:84353c479782 63 uint8_t *pBuf;
hudakz 0:84353c479782 64 uint8_t nStage;
hudakz 0:84353c479782 65 uint16_t countDown;
hudakz 0:84353c479782 66
hudakz 0:84353c479782 67 public:
hudakz 0:84353c479782 68
hudakz 0:84353c479782 69 ByteSkipper() : pBuf(NULL), nStage(0), countDown(0) {
hudakz 0:84353c479782 70 };
hudakz 0:84353c479782 71
hudakz 0:84353c479782 72 void Initialize(MultiValueBuffer *pbuf) {
hudakz 0:84353c479782 73 pBuf = (uint8_t*)pbuf->pValue;
hudakz 0:84353c479782 74 countDown = 0;
hudakz 0:84353c479782 75 };
hudakz 0:84353c479782 76
hudakz 0:84353c479782 77 bool Skip(uint8_t **pp, uint16_t *pcntdn, uint16_t bytes_to_skip) {
hudakz 0:84353c479782 78 switch(nStage) {
hudakz 0:84353c479782 79 case 0:
hudakz 0:84353c479782 80 countDown = bytes_to_skip;
hudakz 0:84353c479782 81 nStage++;
hudakz 0:84353c479782 82 case 1:
hudakz 0:84353c479782 83 for(; countDown && (*pcntdn); countDown--, (*pp)++, (*pcntdn)--);
hudakz 0:84353c479782 84
hudakz 0:84353c479782 85 if(!countDown)
hudakz 0:84353c479782 86 nStage = 0;
hudakz 0:84353c479782 87 };
hudakz 0:84353c479782 88 return (!countDown);
hudakz 0:84353c479782 89 };
hudakz 0:84353c479782 90 };
hudakz 0:84353c479782 91
hudakz 0:84353c479782 92 // Pointer to a callback function triggered for each element of PTP array when used with PTPArrayParser
hudakz 0:84353c479782 93 typedef void (*PTP_ARRAY_EL_FUNC)(const MultiValueBuffer * const p, uint32_t count, const void *me);
hudakz 0:84353c479782 94
hudakz 0:84353c479782 95 class PTPListParser {
hudakz 0:84353c479782 96 public:
hudakz 0:84353c479782 97
hudakz 0:84353c479782 98 enum ParseMode {
hudakz 0:84353c479782 99 modeArray, modeRange/*, modeEnum*/
hudakz 0:84353c479782 100 };
hudakz 0:84353c479782 101
hudakz 0:84353c479782 102 private:
hudakz 0:84353c479782 103 uint8_t nStage;
hudakz 0:84353c479782 104 uint8_t enStage;
hudakz 0:84353c479782 105
hudakz 0:84353c479782 106 uint32_t arLen;
hudakz 0:84353c479782 107 uint32_t arLenCntdn;
hudakz 0:84353c479782 108
hudakz 0:84353c479782 109 uint8_t lenSize; // size of the array length field in bytes
hudakz 0:84353c479782 110 uint8_t valSize; // size of the array element in bytes
hudakz 0:84353c479782 111
hudakz 0:84353c479782 112 MultiValueBuffer *pBuf;
hudakz 0:84353c479782 113
hudakz 0:84353c479782 114 // The only parser for both size and array element parsing
hudakz 0:84353c479782 115 MultiByteValueParser theParser;
hudakz 0:84353c479782 116
hudakz 0:84353c479782 117 uint8_t /*ParseMode*/ prsMode;
hudakz 0:84353c479782 118
hudakz 0:84353c479782 119 public:
hudakz 0:84353c479782 120
hudakz 0:84353c479782 121 PTPListParser() :
hudakz 0:84353c479782 122 nStage(0),
hudakz 0:84353c479782 123 enStage(0),
hudakz 0:84353c479782 124 arLen(0),
hudakz 0:84353c479782 125 arLenCntdn(0),
hudakz 0:84353c479782 126 lenSize(0),
hudakz 0:84353c479782 127 valSize(0),
hudakz 0:84353c479782 128 pBuf(NULL),
hudakz 0:84353c479782 129 prsMode(modeArray) {
hudakz 0:84353c479782 130 };
hudakz 0:84353c479782 131
hudakz 0:84353c479782 132 void Initialize(const uint8_t len_size, const uint8_t val_size, MultiValueBuffer * const p, const uint8_t mode = modeArray) {
hudakz 0:84353c479782 133 pBuf = p;
hudakz 0:84353c479782 134 lenSize = len_size;
hudakz 0:84353c479782 135 valSize = val_size;
hudakz 0:84353c479782 136 prsMode = mode;
hudakz 0:84353c479782 137
hudakz 0:84353c479782 138 if(prsMode == modeRange) {
hudakz 0:84353c479782 139 arLenCntdn = arLen = 3;
hudakz 0:84353c479782 140 nStage = 2;
hudakz 0:84353c479782 141 } else {
hudakz 0:84353c479782 142 arLenCntdn = arLen = 0;
hudakz 0:84353c479782 143 nStage = 0;
hudakz 0:84353c479782 144 }
hudakz 0:84353c479782 145 enStage = 0;
hudakz 0:84353c479782 146 theParser.Initialize(p);
hudakz 0:84353c479782 147 };
hudakz 0:84353c479782 148
hudakz 0:84353c479782 149 bool Parse(uint8_t **pp, uint16_t *pcntdn, PTP_ARRAY_EL_FUNC pf, const void *me = NULL);
hudakz 0:84353c479782 150 };
hudakz 0:84353c479782 151
hudakz 0:84353c479782 152 #endif // __PARSETOOLS_H__