Ethernetwebsoc

Dependencies:   C12832_lcd LM75B WebSocketClient mbed-rtos mbed Socket lwip-eth lwip-sys lwip

Committer:
GordonSin
Date:
Fri May 31 04:09:54 2013 +0000
Revision:
0:0ed2a7c7190c
31/5/2013;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
GordonSin 0:0ed2a7c7190c 1 /*----------------------------------------------------------------------------
GordonSin 0:0ed2a7c7190c 2 * RL-ARM - RTX
GordonSin 0:0ed2a7c7190c 3 *----------------------------------------------------------------------------
GordonSin 0:0ed2a7c7190c 4 * Name: RT_MAILBOX.C
GordonSin 0:0ed2a7c7190c 5 * Purpose: Implements waits and wake-ups for mailbox messages
GordonSin 0:0ed2a7c7190c 6 * Rev.: V4.50
GordonSin 0:0ed2a7c7190c 7 *----------------------------------------------------------------------------
GordonSin 0:0ed2a7c7190c 8 *
GordonSin 0:0ed2a7c7190c 9 * Copyright (c) 1999-2009 KEIL, 2009-2012 ARM Germany GmbH
GordonSin 0:0ed2a7c7190c 10 * All rights reserved.
GordonSin 0:0ed2a7c7190c 11 * Redistribution and use in source and binary forms, with or without
GordonSin 0:0ed2a7c7190c 12 * modification, are permitted provided that the following conditions are met:
GordonSin 0:0ed2a7c7190c 13 * - Redistributions of source code must retain the above copyright
GordonSin 0:0ed2a7c7190c 14 * notice, this list of conditions and the following disclaimer.
GordonSin 0:0ed2a7c7190c 15 * - Redistributions in binary form must reproduce the above copyright
GordonSin 0:0ed2a7c7190c 16 * notice, this list of conditions and the following disclaimer in the
GordonSin 0:0ed2a7c7190c 17 * documentation and/or other materials provided with the distribution.
GordonSin 0:0ed2a7c7190c 18 * - Neither the name of ARM nor the names of its contributors may be used
GordonSin 0:0ed2a7c7190c 19 * to endorse or promote products derived from this software without
GordonSin 0:0ed2a7c7190c 20 * specific prior written permission.
GordonSin 0:0ed2a7c7190c 21 *
GordonSin 0:0ed2a7c7190c 22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
GordonSin 0:0ed2a7c7190c 23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
GordonSin 0:0ed2a7c7190c 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
GordonSin 0:0ed2a7c7190c 25 * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
GordonSin 0:0ed2a7c7190c 26 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
GordonSin 0:0ed2a7c7190c 27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
GordonSin 0:0ed2a7c7190c 28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
GordonSin 0:0ed2a7c7190c 29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
GordonSin 0:0ed2a7c7190c 30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
GordonSin 0:0ed2a7c7190c 31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
GordonSin 0:0ed2a7c7190c 32 * POSSIBILITY OF SUCH DAMAGE.
GordonSin 0:0ed2a7c7190c 33 *---------------------------------------------------------------------------*/
GordonSin 0:0ed2a7c7190c 34
GordonSin 0:0ed2a7c7190c 35 #include "rt_TypeDef.h"
GordonSin 0:0ed2a7c7190c 36 #include "RTX_Config.h"
GordonSin 0:0ed2a7c7190c 37 #include "rt_System.h"
GordonSin 0:0ed2a7c7190c 38 #include "rt_List.h"
GordonSin 0:0ed2a7c7190c 39 #include "rt_Mailbox.h"
GordonSin 0:0ed2a7c7190c 40 #include "rt_MemBox.h"
GordonSin 0:0ed2a7c7190c 41 #include "rt_Task.h"
GordonSin 0:0ed2a7c7190c 42 #include "rt_HAL_CM.h"
GordonSin 0:0ed2a7c7190c 43
GordonSin 0:0ed2a7c7190c 44
GordonSin 0:0ed2a7c7190c 45 /*----------------------------------------------------------------------------
GordonSin 0:0ed2a7c7190c 46 * Functions
GordonSin 0:0ed2a7c7190c 47 *---------------------------------------------------------------------------*/
GordonSin 0:0ed2a7c7190c 48
GordonSin 0:0ed2a7c7190c 49
GordonSin 0:0ed2a7c7190c 50 /*--------------------------- rt_mbx_init -----------------------------------*/
GordonSin 0:0ed2a7c7190c 51
GordonSin 0:0ed2a7c7190c 52 void rt_mbx_init (OS_ID mailbox, U16 mbx_size) {
GordonSin 0:0ed2a7c7190c 53 /* Initialize a mailbox */
GordonSin 0:0ed2a7c7190c 54 P_MCB p_MCB = mailbox;
GordonSin 0:0ed2a7c7190c 55
GordonSin 0:0ed2a7c7190c 56 p_MCB->cb_type = MCB;
GordonSin 0:0ed2a7c7190c 57 p_MCB->state = 0;
GordonSin 0:0ed2a7c7190c 58 p_MCB->isr_st = 0;
GordonSin 0:0ed2a7c7190c 59 p_MCB->p_lnk = NULL;
GordonSin 0:0ed2a7c7190c 60 p_MCB->first = 0;
GordonSin 0:0ed2a7c7190c 61 p_MCB->last = 0;
GordonSin 0:0ed2a7c7190c 62 p_MCB->count = 0;
GordonSin 0:0ed2a7c7190c 63 p_MCB->size = (mbx_size + sizeof(void *) - sizeof(struct OS_MCB)) /
GordonSin 0:0ed2a7c7190c 64 (U32)sizeof (void *);
GordonSin 0:0ed2a7c7190c 65 }
GordonSin 0:0ed2a7c7190c 66
GordonSin 0:0ed2a7c7190c 67
GordonSin 0:0ed2a7c7190c 68 /*--------------------------- rt_mbx_send -----------------------------------*/
GordonSin 0:0ed2a7c7190c 69
GordonSin 0:0ed2a7c7190c 70 OS_RESULT rt_mbx_send (OS_ID mailbox, void *p_msg, U16 timeout) {
GordonSin 0:0ed2a7c7190c 71 /* Send message to a mailbox */
GordonSin 0:0ed2a7c7190c 72 P_MCB p_MCB = mailbox;
GordonSin 0:0ed2a7c7190c 73 P_TCB p_TCB;
GordonSin 0:0ed2a7c7190c 74
GordonSin 0:0ed2a7c7190c 75 if (p_MCB->state == 1) {
GordonSin 0:0ed2a7c7190c 76 /* A task is waiting for message */
GordonSin 0:0ed2a7c7190c 77 p_TCB = rt_get_first ((P_XCB)p_MCB);
GordonSin 0:0ed2a7c7190c 78 if (p_MCB->p_lnk == NULL) {
GordonSin 0:0ed2a7c7190c 79 p_MCB->state = 0;
GordonSin 0:0ed2a7c7190c 80 }
GordonSin 0:0ed2a7c7190c 81 rt_ret_val2(p_TCB, 0x10/*osEventMessage*/, (U32)p_msg);
GordonSin 0:0ed2a7c7190c 82 rt_rmv_dly (p_TCB);
GordonSin 0:0ed2a7c7190c 83 rt_dispatch (p_TCB);
GordonSin 0:0ed2a7c7190c 84 }
GordonSin 0:0ed2a7c7190c 85 else {
GordonSin 0:0ed2a7c7190c 86 /* Store message in mailbox queue */
GordonSin 0:0ed2a7c7190c 87 if (p_MCB->count == p_MCB->size) {
GordonSin 0:0ed2a7c7190c 88 /* No free message entry, wait for one. If message queue is full, */
GordonSin 0:0ed2a7c7190c 89 /* then no task is waiting for message. The 'p_MCB->p_lnk' list */
GordonSin 0:0ed2a7c7190c 90 /* pointer can now be reused for send message waits task list. */
GordonSin 0:0ed2a7c7190c 91 if (timeout == 0) {
GordonSin 0:0ed2a7c7190c 92 return (OS_R_TMO);
GordonSin 0:0ed2a7c7190c 93 }
GordonSin 0:0ed2a7c7190c 94 if (p_MCB->p_lnk != NULL) {
GordonSin 0:0ed2a7c7190c 95 rt_put_prio ((P_XCB)p_MCB, os_tsk.run);
GordonSin 0:0ed2a7c7190c 96 }
GordonSin 0:0ed2a7c7190c 97 else {
GordonSin 0:0ed2a7c7190c 98 p_MCB->p_lnk = os_tsk.run;
GordonSin 0:0ed2a7c7190c 99 os_tsk.run->p_lnk = NULL;
GordonSin 0:0ed2a7c7190c 100 os_tsk.run->p_rlnk = (P_TCB)p_MCB;
GordonSin 0:0ed2a7c7190c 101 /* Task is waiting to send a message */
GordonSin 0:0ed2a7c7190c 102 p_MCB->state = 2;
GordonSin 0:0ed2a7c7190c 103 }
GordonSin 0:0ed2a7c7190c 104 os_tsk.run->msg = p_msg;
GordonSin 0:0ed2a7c7190c 105 rt_block (timeout, WAIT_MBX);
GordonSin 0:0ed2a7c7190c 106 return (OS_R_TMO);
GordonSin 0:0ed2a7c7190c 107 }
GordonSin 0:0ed2a7c7190c 108 /* Yes, there is a free entry in a mailbox. */
GordonSin 0:0ed2a7c7190c 109 p_MCB->msg[p_MCB->first] = p_msg;
GordonSin 0:0ed2a7c7190c 110 rt_inc (&p_MCB->count);
GordonSin 0:0ed2a7c7190c 111 if (++p_MCB->first == p_MCB->size) {
GordonSin 0:0ed2a7c7190c 112 p_MCB->first = 0;
GordonSin 0:0ed2a7c7190c 113 }
GordonSin 0:0ed2a7c7190c 114 }
GordonSin 0:0ed2a7c7190c 115 return (OS_R_OK);
GordonSin 0:0ed2a7c7190c 116 }
GordonSin 0:0ed2a7c7190c 117
GordonSin 0:0ed2a7c7190c 118
GordonSin 0:0ed2a7c7190c 119 /*--------------------------- rt_mbx_wait -----------------------------------*/
GordonSin 0:0ed2a7c7190c 120
GordonSin 0:0ed2a7c7190c 121 OS_RESULT rt_mbx_wait (OS_ID mailbox, void **message, U16 timeout) {
GordonSin 0:0ed2a7c7190c 122 /* Receive a message; possibly wait for it */
GordonSin 0:0ed2a7c7190c 123 P_MCB p_MCB = mailbox;
GordonSin 0:0ed2a7c7190c 124 P_TCB p_TCB;
GordonSin 0:0ed2a7c7190c 125
GordonSin 0:0ed2a7c7190c 126 /* If a message is available in the fifo buffer */
GordonSin 0:0ed2a7c7190c 127 /* remove it from the fifo buffer and return. */
GordonSin 0:0ed2a7c7190c 128 if (p_MCB->count) {
GordonSin 0:0ed2a7c7190c 129 *message = p_MCB->msg[p_MCB->last];
GordonSin 0:0ed2a7c7190c 130 if (++p_MCB->last == p_MCB->size) {
GordonSin 0:0ed2a7c7190c 131 p_MCB->last = 0;
GordonSin 0:0ed2a7c7190c 132 }
GordonSin 0:0ed2a7c7190c 133 if (p_MCB->state == 2) {
GordonSin 0:0ed2a7c7190c 134 /* A task is waiting to send message */
GordonSin 0:0ed2a7c7190c 135 p_TCB = rt_get_first ((P_XCB)p_MCB);
GordonSin 0:0ed2a7c7190c 136 if (p_MCB->p_lnk == NULL) {
GordonSin 0:0ed2a7c7190c 137 p_MCB->state = 0;
GordonSin 0:0ed2a7c7190c 138 }
GordonSin 0:0ed2a7c7190c 139 rt_ret_val(p_TCB, 0/*osOK*/);
GordonSin 0:0ed2a7c7190c 140 p_MCB->msg[p_MCB->first] = p_TCB->msg;
GordonSin 0:0ed2a7c7190c 141 if (++p_MCB->first == p_MCB->size) {
GordonSin 0:0ed2a7c7190c 142 p_MCB->first = 0;
GordonSin 0:0ed2a7c7190c 143 }
GordonSin 0:0ed2a7c7190c 144 rt_rmv_dly (p_TCB);
GordonSin 0:0ed2a7c7190c 145 rt_dispatch (p_TCB);
GordonSin 0:0ed2a7c7190c 146 }
GordonSin 0:0ed2a7c7190c 147 else {
GordonSin 0:0ed2a7c7190c 148 rt_dec (&p_MCB->count);
GordonSin 0:0ed2a7c7190c 149 }
GordonSin 0:0ed2a7c7190c 150 return (OS_R_OK);
GordonSin 0:0ed2a7c7190c 151 }
GordonSin 0:0ed2a7c7190c 152 /* No message available: wait for one */
GordonSin 0:0ed2a7c7190c 153 if (timeout == 0) {
GordonSin 0:0ed2a7c7190c 154 return (OS_R_TMO);
GordonSin 0:0ed2a7c7190c 155 }
GordonSin 0:0ed2a7c7190c 156 if (p_MCB->p_lnk != NULL) {
GordonSin 0:0ed2a7c7190c 157 rt_put_prio ((P_XCB)p_MCB, os_tsk.run);
GordonSin 0:0ed2a7c7190c 158 }
GordonSin 0:0ed2a7c7190c 159 else {
GordonSin 0:0ed2a7c7190c 160 p_MCB->p_lnk = os_tsk.run;
GordonSin 0:0ed2a7c7190c 161 os_tsk.run->p_lnk = NULL;
GordonSin 0:0ed2a7c7190c 162 os_tsk.run->p_rlnk = (P_TCB)p_MCB;
GordonSin 0:0ed2a7c7190c 163 /* Task is waiting to receive a message */
GordonSin 0:0ed2a7c7190c 164 p_MCB->state = 1;
GordonSin 0:0ed2a7c7190c 165 }
GordonSin 0:0ed2a7c7190c 166 rt_block(timeout, WAIT_MBX);
GordonSin 0:0ed2a7c7190c 167 return (OS_R_TMO);
GordonSin 0:0ed2a7c7190c 168 }
GordonSin 0:0ed2a7c7190c 169
GordonSin 0:0ed2a7c7190c 170
GordonSin 0:0ed2a7c7190c 171 /*--------------------------- rt_mbx_check ----------------------------------*/
GordonSin 0:0ed2a7c7190c 172
GordonSin 0:0ed2a7c7190c 173 OS_RESULT rt_mbx_check (OS_ID mailbox) {
GordonSin 0:0ed2a7c7190c 174 /* Check for free space in a mailbox. Returns the number of messages */
GordonSin 0:0ed2a7c7190c 175 /* that can be stored to a mailbox. It returns 0 when mailbox is full. */
GordonSin 0:0ed2a7c7190c 176 P_MCB p_MCB = mailbox;
GordonSin 0:0ed2a7c7190c 177
GordonSin 0:0ed2a7c7190c 178 return (p_MCB->size - p_MCB->count);
GordonSin 0:0ed2a7c7190c 179 }
GordonSin 0:0ed2a7c7190c 180
GordonSin 0:0ed2a7c7190c 181
GordonSin 0:0ed2a7c7190c 182 /*--------------------------- isr_mbx_send ----------------------------------*/
GordonSin 0:0ed2a7c7190c 183
GordonSin 0:0ed2a7c7190c 184 void isr_mbx_send (OS_ID mailbox, void *p_msg) {
GordonSin 0:0ed2a7c7190c 185 /* Same function as "os_mbx_send", but to be called by ISRs. */
GordonSin 0:0ed2a7c7190c 186 P_MCB p_MCB = mailbox;
GordonSin 0:0ed2a7c7190c 187
GordonSin 0:0ed2a7c7190c 188 rt_psq_enq (p_MCB, (U32)p_msg);
GordonSin 0:0ed2a7c7190c 189 rt_psh_req ();
GordonSin 0:0ed2a7c7190c 190 }
GordonSin 0:0ed2a7c7190c 191
GordonSin 0:0ed2a7c7190c 192
GordonSin 0:0ed2a7c7190c 193 /*--------------------------- isr_mbx_receive -------------------------------*/
GordonSin 0:0ed2a7c7190c 194
GordonSin 0:0ed2a7c7190c 195 OS_RESULT isr_mbx_receive (OS_ID mailbox, void **message) {
GordonSin 0:0ed2a7c7190c 196 /* Receive a message in the interrupt function. The interrupt function */
GordonSin 0:0ed2a7c7190c 197 /* should not wait for a message since this would block the rtx os. */
GordonSin 0:0ed2a7c7190c 198 P_MCB p_MCB = mailbox;
GordonSin 0:0ed2a7c7190c 199
GordonSin 0:0ed2a7c7190c 200 if (p_MCB->count) {
GordonSin 0:0ed2a7c7190c 201 /* A message is available in the fifo buffer. */
GordonSin 0:0ed2a7c7190c 202 *message = p_MCB->msg[p_MCB->last];
GordonSin 0:0ed2a7c7190c 203 if (p_MCB->state == 2) {
GordonSin 0:0ed2a7c7190c 204 /* A task is locked waiting to send message */
GordonSin 0:0ed2a7c7190c 205 rt_psq_enq (p_MCB, 0);
GordonSin 0:0ed2a7c7190c 206 rt_psh_req ();
GordonSin 0:0ed2a7c7190c 207 }
GordonSin 0:0ed2a7c7190c 208 rt_dec (&p_MCB->count);
GordonSin 0:0ed2a7c7190c 209 if (++p_MCB->last == p_MCB->size) {
GordonSin 0:0ed2a7c7190c 210 p_MCB->last = 0;
GordonSin 0:0ed2a7c7190c 211 }
GordonSin 0:0ed2a7c7190c 212 return (OS_R_MBX);
GordonSin 0:0ed2a7c7190c 213 }
GordonSin 0:0ed2a7c7190c 214 return (OS_R_OK);
GordonSin 0:0ed2a7c7190c 215 }
GordonSin 0:0ed2a7c7190c 216
GordonSin 0:0ed2a7c7190c 217
GordonSin 0:0ed2a7c7190c 218 /*--------------------------- rt_mbx_psh ------------------------------------*/
GordonSin 0:0ed2a7c7190c 219
GordonSin 0:0ed2a7c7190c 220 void rt_mbx_psh (P_MCB p_CB, void *p_msg) {
GordonSin 0:0ed2a7c7190c 221 /* Store the message to the mailbox queue or pass it to task directly. */
GordonSin 0:0ed2a7c7190c 222 P_TCB p_TCB;
GordonSin 0:0ed2a7c7190c 223 void *mem;
GordonSin 0:0ed2a7c7190c 224
GordonSin 0:0ed2a7c7190c 225 switch (p_CB->state) {
GordonSin 0:0ed2a7c7190c 226 case 3:
GordonSin 0:0ed2a7c7190c 227 /* Task is waiting to allocate memory, remove it from the waiting list */
GordonSin 0:0ed2a7c7190c 228 mem = rt_alloc_box(p_msg);
GordonSin 0:0ed2a7c7190c 229 if (mem == NULL) break;
GordonSin 0:0ed2a7c7190c 230 p_TCB = rt_get_first ((P_XCB)p_CB);
GordonSin 0:0ed2a7c7190c 231 if (p_CB->p_lnk == NULL) {
GordonSin 0:0ed2a7c7190c 232 p_CB->state = 0;
GordonSin 0:0ed2a7c7190c 233 }
GordonSin 0:0ed2a7c7190c 234 rt_ret_val(p_TCB, (U32)mem);
GordonSin 0:0ed2a7c7190c 235 p_TCB->state = READY;
GordonSin 0:0ed2a7c7190c 236 rt_rmv_dly (p_TCB);
GordonSin 0:0ed2a7c7190c 237 rt_put_prio (&os_rdy, p_TCB);
GordonSin 0:0ed2a7c7190c 238 break;
GordonSin 0:0ed2a7c7190c 239 case 2:
GordonSin 0:0ed2a7c7190c 240 /* Task is waiting to send a message, remove it from the waiting list */
GordonSin 0:0ed2a7c7190c 241 p_TCB = rt_get_first ((P_XCB)p_CB);
GordonSin 0:0ed2a7c7190c 242 if (p_CB->p_lnk == NULL) {
GordonSin 0:0ed2a7c7190c 243 p_CB->state = 0;
GordonSin 0:0ed2a7c7190c 244 }
GordonSin 0:0ed2a7c7190c 245 rt_ret_val(p_TCB, 0/*osOK*/);
GordonSin 0:0ed2a7c7190c 246 p_CB->msg[p_CB->first] = p_TCB->msg;
GordonSin 0:0ed2a7c7190c 247 rt_inc (&p_CB->count);
GordonSin 0:0ed2a7c7190c 248 if (++p_CB->first == p_CB->size) {
GordonSin 0:0ed2a7c7190c 249 p_CB->first = 0;
GordonSin 0:0ed2a7c7190c 250 }
GordonSin 0:0ed2a7c7190c 251 p_TCB->state = READY;
GordonSin 0:0ed2a7c7190c 252 rt_rmv_dly (p_TCB);
GordonSin 0:0ed2a7c7190c 253 rt_put_prio (&os_rdy, p_TCB);
GordonSin 0:0ed2a7c7190c 254 break;
GordonSin 0:0ed2a7c7190c 255 case 1:
GordonSin 0:0ed2a7c7190c 256 /* Task is waiting for a message, pass the message to the task directly */
GordonSin 0:0ed2a7c7190c 257 p_TCB = rt_get_first ((P_XCB)p_CB);
GordonSin 0:0ed2a7c7190c 258 if (p_CB->p_lnk == NULL) {
GordonSin 0:0ed2a7c7190c 259 p_CB->state = 0;
GordonSin 0:0ed2a7c7190c 260 }
GordonSin 0:0ed2a7c7190c 261 rt_ret_val2(p_TCB, 0x10/*osEventMessage*/, (U32)p_msg);
GordonSin 0:0ed2a7c7190c 262 p_TCB->state = READY;
GordonSin 0:0ed2a7c7190c 263 rt_rmv_dly (p_TCB);
GordonSin 0:0ed2a7c7190c 264 rt_put_prio (&os_rdy, p_TCB);
GordonSin 0:0ed2a7c7190c 265 break;
GordonSin 0:0ed2a7c7190c 266 default:
GordonSin 0:0ed2a7c7190c 267 /* No task is waiting for a message, store it to the mailbox queue */
GordonSin 0:0ed2a7c7190c 268 if (p_CB->count < p_CB->size) {
GordonSin 0:0ed2a7c7190c 269 p_CB->msg[p_CB->first] = p_msg;
GordonSin 0:0ed2a7c7190c 270 rt_inc (&p_CB->count);
GordonSin 0:0ed2a7c7190c 271 if (++p_CB->first == p_CB->size) {
GordonSin 0:0ed2a7c7190c 272 p_CB->first = 0;
GordonSin 0:0ed2a7c7190c 273 }
GordonSin 0:0ed2a7c7190c 274 }
GordonSin 0:0ed2a7c7190c 275 else {
GordonSin 0:0ed2a7c7190c 276 os_error (OS_ERR_MBX_OVF);
GordonSin 0:0ed2a7c7190c 277 }
GordonSin 0:0ed2a7c7190c 278 break;
GordonSin 0:0ed2a7c7190c 279 }
GordonSin 0:0ed2a7c7190c 280 }
GordonSin 0:0ed2a7c7190c 281
GordonSin 0:0ed2a7c7190c 282 /*----------------------------------------------------------------------------
GordonSin 0:0ed2a7c7190c 283 * end of file
GordonSin 0:0ed2a7c7190c 284 *---------------------------------------------------------------------------*/
GordonSin 0:0ed2a7c7190c 285