Subversion Repositories NaviCtrl

Rev

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);