Rev 244 | Rev 261 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 244 | Rev 245 | ||
---|---|---|---|
Line 52... | Line 52... | ||
52 | // + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
52 | // + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
53 | // + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
53 | // + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
54 | // + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
54 | // + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
55 | // + POSSIBILITY OF SUCH DAMAGE. |
55 | // + POSSIBILITY OF SUCH DAMAGE. |
56 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
56 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
57 | #include <string.h> |
- | |
58 | #include <stdarg.h> |
57 | #include <stdarg.h> |
59 | #include "91x_lib.h" |
58 | #include "91x_lib.h" |
60 | #include "mkprotocol.h" |
59 | #include "mkprotocol.h" |
61 | #include "ramfunc.h" |
60 | #include "ramfunc.h" |
62 | #include "usb.h" |
61 | #include "usb.h" |
Line 63... | Line -... | ||
63 | - | ||
64 | void Buffer_Clear(Buffer_t* pBuffer) |
- | |
65 | { |
- | |
66 | pBuffer->DataBytes = 0; |
- | |
67 | pBuffer->Position = 0; |
- | |
68 | pBuffer->Locked = FALSE; |
- | |
69 | } |
- | |
70 | - | ||
71 | void Buffer_Init(Buffer_t* pBuffer, u8* pDataBuffer, u16 DataBufferSize) |
- | |
72 | { |
- | |
73 | pBuffer->pData = pDataBuffer; |
- | |
74 | pBuffer->Size = DataBufferSize; |
- | |
75 | Buffer_Clear(pBuffer); |
- | |
76 | } |
- | |
77 | - | ||
78 | u8 Buffer_Copy(Buffer_t* pSrcBuffer, Buffer_t* pDstBuffer) |
- | |
79 | { |
- | |
80 | u8 retval = 0; |
- | |
81 | - | ||
82 | if( (pSrcBuffer != NULL) && (pDstBuffer != NULL) ) |
- | |
83 | { |
- | |
84 | if(pSrcBuffer->Locked && !(pDstBuffer->Locked) && (pDstBuffer->Size >= pSrcBuffer->DataBytes)) |
- | |
85 | { |
- | |
86 | memcpy(pDstBuffer->pData, pSrcBuffer->pData, pSrcBuffer->DataBytes); |
- | |
87 | pDstBuffer->DataBytes = pSrcBuffer->DataBytes; |
- | |
88 | pDstBuffer->Position = 0; |
- | |
89 | pDstBuffer->Locked = TRUE; |
- | |
90 | retval = 1; |
- | |
91 | } |
- | |
92 | } |
- | |
93 | return retval; |
- | |
94 | } |
- | |
95 | 62 | ||
96 | /**************************************************************/ |
63 | /**************************************************************/ |
97 | /* Create serial output frame */ |
64 | /* Create serial output frame */ |
98 | /**************************************************************/ |
65 | /**************************************************************/ |
99 | void MKProtocol_CreateSerialFrame(Buffer_t* pTxBuff, u8 CmdID, u8 Address, u8 numofbuffers , ...) //u8 *data, u8 len, .... |
66 | u8 MKProtocol_CreateSerialFrame(Buffer_t* pTxBuff, u8 CmdID, u8 Address, u8 numofbuffers , ...) //u8 *data, u8 len, .... |
100 | { |
67 | { |
Line 101... | Line 68... | ||
101 | va_list ap; |
68 | va_list ap; |
102 | 69 | ||
103 | u8 a,b,c; |
70 | u8 a,b,c; |
Line 104... | Line 71... | ||
104 | u8 ptr = 0; |
71 | u8 ptr = 0; |
105 | u16 tmpCRC = 0, i; |
72 | u16 tmpCRC = 0, i; |
Line 106... | Line 73... | ||
106 | 73 | ||
- | 74 | u8* pdata = NULL; |
|
107 | u8* pdata = NULL; |
75 | int len = 0; |
108 | int len = 0; |
76 | |
109 | 77 | if(pTxBuff->Locked == TRUE) return(0); |
|
110 | if(pTxBuff->Locked == FALSE) |
78 | |
111 | { // tx-buffer is not in use |
79 | // tx-buffer is not in use |
112 | // lock the buffer |
80 | // lock the buffer |
113 | pTxBuff->Locked = TRUE; |
81 | pTxBuff->Locked = TRUE; |
114 | pTxBuff->Position = 0; |
82 | pTxBuff->Position = 0; |
115 | pTxBuff->pData[pTxBuff->Position++] = '#'; // Start character |
83 | pTxBuff->pData[pTxBuff->Position++] = '#'; // Start character |
116 | pTxBuff->pData[pTxBuff->Position++] = 'a' + Address; // Address (a=0; b=1,...) |
84 | pTxBuff->pData[pTxBuff->Position++] = 'a' + Address; // Address (a=0; b=1,...) |
117 | pTxBuff->pData[pTxBuff->Position++] = CmdID; // Command |
85 | pTxBuff->pData[pTxBuff->Position++] = CmdID; // Command |
118 | 86 | ||
119 | va_start(ap, numofbuffers); |
87 | va_start(ap, numofbuffers); |
120 | if(numofbuffers) |
88 | if(numofbuffers) |
121 | { |
89 | { |
122 | pdata = va_arg(ap, u8*); |
90 | pdata = va_arg(ap, u8*); |
123 | len = va_arg(ap, int); |
91 | len = va_arg(ap, int); |
- | 92 | ptr = 0; |
|
- | 93 | numofbuffers--; |
|
124 | ptr = 0; |
94 | } |
125 | numofbuffers--; |
- | |
126 | } |
- | |
127 | while(len) |
95 | while(len) |
128 | { |
96 | { |
129 | if(len) |
97 | if(len) |
130 | { |
- | |
131 | a = pdata[ptr++]; |
- | |
132 | len--; |
- | |
133 | if((!len) && numofbuffers) // try to jump to next buffer |
- | |
134 | { |
- | |
135 | pdata = va_arg(ap, u8*); |
- | |
136 | len = va_arg(ap, int); |
- | |
137 | ptr = 0; |
- | |
138 | numofbuffers--; |
- | |
139 | } |
98 | { |
140 | } |
- | |
141 | else a = 0; |
- | |
142 | if(len) |
- | |
143 | { |
- | |
144 | b = pdata[ptr++]; |
99 | a = pdata[ptr++]; |
145 | len--; |
100 | len--; |
146 | if((!len) && numofbuffers) // try to jump to next buffer |
101 | if((!len) && numofbuffers) // try to jump to next buffer |
147 | { |
102 | { |
148 | pdata = va_arg(ap, u8*); |
- | |
149 | len = va_arg(ap, int); |
103 | pdata = va_arg(ap, u8*); |
- | 104 | len = va_arg(ap, int); |
|
150 | ptr = 0; |
105 | ptr = 0; |
151 | numofbuffers--; |
106 | numofbuffers--; |
- | 107 | } |
|
- | 108 | } |
|
- | 109 | else a = 0; |
|
- | 110 | if(len) |
|
152 | } |
111 | { |
153 | } |
- | |
154 | else b = 0; |
- | |
155 | if(len) |
- | |
156 | { |
- | |
157 | c = pdata[ptr++]; |
112 | b = pdata[ptr++]; |
158 | len--; |
113 | len--; |
159 | if((!len) && numofbuffers) // try to jump to next buffer |
114 | if((!len) && numofbuffers) // try to jump to next buffer |
160 | { |
115 | { |
161 | pdata = va_arg(ap, u8*); |
- | |
162 | len = va_arg(ap, int); |
116 | pdata = va_arg(ap, u8*); |
163 | ptr = 0; |
- | |
164 | numofbuffers--; |
- | |
165 | } |
- | |
166 | } |
- | |
167 | else c = 0; |
- | |
168 | pTxBuff->pData[pTxBuff->Position++] = '=' + (a >> 2); |
117 | len = va_arg(ap, int); |
169 | pTxBuff->pData[pTxBuff->Position++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4)); |
118 | ptr = 0; |
170 | pTxBuff->pData[pTxBuff->Position++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6)); |
119 | numofbuffers--; |
171 | pTxBuff->pData[pTxBuff->Position++] = '=' + ( c & 0x3f); |
- | |
172 | } |
120 | } |
173 | va_end(ap); |
121 | } |
- | 122 | else b = 0; |
|
- | 123 | if(len) |
|
- | 124 | { |
|
- | 125 | c = pdata[ptr++]; |
|
- | 126 | len--; |
|
- | 127 | if((!len) && numofbuffers) // try to jump to next buffer |
|
- | 128 | { |
|
- | 129 | pdata = va_arg(ap, u8*); |
|
174 | // add crc |
130 | len = va_arg(ap, int); |
- | 131 | ptr = 0; |
|
- | 132 | numofbuffers--; |
|
- | 133 | } |
|
- | 134 | } |
|
- | 135 | else c = 0; |
|
- | 136 | pTxBuff->pData[pTxBuff->Position++] = '=' + (a >> 2); |
|
- | 137 | pTxBuff->pData[pTxBuff->Position++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4)); |
|
- | 138 | pTxBuff->pData[pTxBuff->Position++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6)); |
|
- | 139 | pTxBuff->pData[pTxBuff->Position++] = '=' + ( c & 0x3f); |
|
- | 140 | } |
|
- | 141 | va_end(ap); |
|
- | 142 | // add crc |
|
175 | for(i = 0; i < pTxBuff->Position; i++) |
143 | for(i = 0; i < pTxBuff->Position; i++) |
176 | { |
144 | { |
177 | tmpCRC += pTxBuff->pData[i]; |
145 | tmpCRC += pTxBuff->pData[i]; |
178 | } |
146 | } |
179 | tmpCRC %= 4096; |
147 | tmpCRC %= 4096; |
180 | pTxBuff->pData[pTxBuff->Position++] = '=' + tmpCRC / 64; |
148 | pTxBuff->pData[pTxBuff->Position++] = '=' + tmpCRC / 64; |
181 | pTxBuff->pData[pTxBuff->Position++] = '=' + tmpCRC % 64; |
149 | pTxBuff->pData[pTxBuff->Position++] = '=' + tmpCRC % 64; |
182 | pTxBuff->pData[pTxBuff->Position++] = '\r'; |
150 | pTxBuff->pData[pTxBuff->Position++] = '\r'; |
Line 183... | Line 151... | ||
183 | pTxBuff->DataBytes = pTxBuff->Position; |
151 | pTxBuff->DataBytes = pTxBuff->Position; |
184 | pTxBuff->Position = 0; // reset buffer position for transmision |
152 | pTxBuff->Position = 0; // reset buffer position for transmision |
185 | } // EOF buffer not in use |
153 | return(pTxBuff->Locked); |