MAX3421E-based USB Host Shield Library
Dependents: UsbHostMAX3421E_Hello
parsetools.h@1:2263e77400e9, 2020-07-13 (annotated)
- 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?
User | Revision | Line number | New 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__ |