📄 c_comm.c
字号:
{
case 0:
{
cCommsSetCmdMode(&(VarsComm.UpdateState));
}
break;
case 1:
{
*(VarsComm.pRetVal) = SUCCESS;
SETBtStateIdle;
}
break;
}
}
break;
case UPD_OPENSTREAM:
{
switch(VarsComm.UpdateState)
{
case 0:
{
cCommsOpenStream(&(VarsComm.UpdateState));
}
break;
case 1:
{
*(VarsComm.pRetVal) = SUCCESS;
SETBtStateIdle;
}
break;
}
}
break;
case UPD_SENDFILE:
{
switch (VarsComm.UpdateState)
{
case 0:
{
cCommsOpenStream(&(VarsComm.UpdateState));
}
break;
case 1:
{
/* Here we wait for the open stream to succeed*/
if (IOMapComm.BtConnectTable[VarsComm.ExtTx.SlotNo].StreamStatus)
{
/* Stream has been opened send the openwrite command */
VarsComm.BtModuleOutBuf.Buf[0] = SYSTEM_CMD;
VarsComm.BtModuleOutBuf.Buf[1] = OPENWRITE;
memcpy((UBYTE*)&(VarsComm.BtModuleOutBuf.Buf[2]),(UBYTE*)VarsComm.ExtTx.FileName, FILENAME_LENGTH + 1);
memcpy((UBYTE*)&(VarsComm.BtModuleOutBuf.Buf[22]),(UBYTE*)&(VarsComm.ExtTx.RemFileSize), sizeof(VarsComm.ExtTx.RemFileSize));
dBtSendMsg(VarsComm.BtModuleOutBuf.Buf, 26, 26);
VarsComm.ExtTx.Timer = 0;
VarsComm.UpdateState = 2;
}
else
{
if (VarsComm.ExtTx.Timer >= FILETXTOUT)
{
*(VarsComm.pRetVal) = FILETX_STREAMERROR;
VarsComm.UpdateState = 8;
}
else
{
(VarsComm.ExtTx.Timer)++;
}
}
}
break;
case 2:
{
if (4 == IOMapComm.BtInBuf.InPtr)
{
/* Data has been received - examine the answer */
if ((REPLY_CMD == IOMapComm.BtInBuf.Buf[0]) && (OPENWRITE == IOMapComm.BtInBuf.Buf[1]))
{
/* OpenWrite answer */
if (LOADER_ERR_BYTE(SUCCESS) == IOMapComm.BtInBuf.Buf[2])
{
/* save the handle from the other brick */
VarsComm.ExtTx.DstHandle = IOMapComm.BtInBuf.Buf[3];
VarsComm.UpdateState = 3;
IOMapComm.BtInBuf.InPtr = 0;
}
else
{
/* Open write failiure - terminate file transfer */
*(VarsComm.pRetVal) = IOMapComm.BtInBuf.Buf[2];
VarsComm.UpdateState = 8;
}
}
}
if (VarsComm.ExtTx.Timer >= FILETXTOUT)
{
*(VarsComm.pRetVal) = FILETX_TIMEOUT;
VarsComm.UpdateState = 8;
}
else
{
(VarsComm.ExtTx.Timer)++;
}
}
break;
case 3: /*SENDWRITE:*/
{
ULONG Length;
UWORD MsgSize;
VarsComm.ExtTx.Timer = 0;
if (VarsComm.ExtTx.RemFileSize > (MAX_BT_MSG_SIZE - 5))
{
/* need to use the maximum size available - approx 64K */
VarsComm.ExtTx.RemMsgSize = (MAX_BT_MSG_SIZE - 5);
}
else
{
/* Message can hold the remaining message */
VarsComm.ExtTx.RemMsgSize = VarsComm.ExtTx.RemFileSize;
}
if (VarsComm.ExtTx.RemMsgSize > (SIZE_OF_BTBUF - 5))
{
Length = SIZE_OF_BTBUF - 5;
VarsComm.UpdateState = 4;
}
else
{
Length = VarsComm.ExtTx.RemMsgSize;
VarsComm.UpdateState = 5;
}
Handle = (UBYTE)(VarsComm.ExtTx.SrcHandle);
pMapLoader->pFunc(READ, &Handle, &(VarsComm.BtModuleOutBuf.Buf[3]), &Length);
MsgSize = VarsComm.ExtTx.RemMsgSize + 3;
VarsComm.BtModuleOutBuf.Buf[0] = SYSTEM_CMD;
VarsComm.BtModuleOutBuf.Buf[1] = WRITE;
VarsComm.BtModuleOutBuf.Buf[2] = VarsComm.ExtTx.DstHandle;
dBtSendMsg(VarsComm.BtModuleOutBuf.Buf, Length + 3, MsgSize);
VarsComm.ExtTx.RemMsgSize -= Length;
VarsComm.ExtTx.RemFileSize -= Length;
}
break;
case 4: /* CONTINOUSWRITE:*/
{
ULONG Length;
UWORD Status;
if(dBtCheckForTxBuf())
{
/* do only send more data if buffer is empty */
VarsComm.ExtTx.Timer = 0;
if (VarsComm.ExtTx.RemMsgSize >= SIZE_OF_BTBUF)
{
Length = SIZE_OF_BTBUF;
}
else
{
Length = VarsComm.ExtTx.RemMsgSize;
}
VarsComm.ExtTx.RemMsgSize -= Length;
VarsComm.ExtTx.RemFileSize -= Length;
Handle = (UBYTE)(VarsComm.ExtTx.SrcHandle);
Status = pMapLoader->pFunc(READ, &Handle, &(VarsComm.BtModuleOutBuf.Buf[0]), &Length);
if (Status >= 0x8000)
{
Length = 0;
}
dBtSend(VarsComm.BtModuleOutBuf.Buf, Length);
if (!(VarsComm.ExtTx.RemMsgSize))
{
/* at this point due to large write command acknowledge is expected */
VarsComm.UpdateState = 5;
VarsComm.ExtTx.Timer = 0;
IOMapComm.BtInBuf.InPtr = 0;
}
}
}
break;
case 5: /* WRITEACK: */
{
if (6 == IOMapComm.BtInBuf.InPtr)
{
if ((WRITE == IOMapComm.BtInBuf.Buf[1]) &&
(REPLY_CMD == IOMapComm.BtInBuf.Buf[0]) &&
(VarsComm.ExtTx.DstHandle == IOMapComm.BtInBuf.Buf[3]))
{
/* Ok the the return reply is for me - was it ok? */
if (LOADER_ERR_BYTE(SUCCESS) == IOMapComm.BtInBuf.Buf[2])
{
/* Ok send next write*/
if (VarsComm.ExtTx.RemFileSize)
{
VarsComm.UpdateState = 3;
}
else
{
VarsComm.UpdateState = 6;
}
IOMapComm.BtInBuf.InPtr = 0;
}
}
}
if (VarsComm.ExtTx.Timer >= FILETXTOUT)
{
*(VarsComm.pRetVal) = FILETX_TIMEOUT;
VarsComm.UpdateState = 8;
}
else
{
(VarsComm.ExtTx.Timer)++;
}
}
break;
case 6: /*TERMINATESEND: */
{
/* Stream still open close the receiver handle */
VarsComm.BtModuleOutBuf.Buf[0] = SYSTEM_CMD;
VarsComm.BtModuleOutBuf.Buf[1] = CLOSE;
VarsComm.BtModuleOutBuf.Buf[2] = VarsComm.ExtTx.DstHandle;
dBtSendMsg(VarsComm.BtModuleOutBuf.Buf, 3, 3);
VarsComm.ExtTx.Timer = 0;
VarsComm.UpdateState = 7;
}
break;
case 7: /* TERMINATEACK:*/
{
if (4 == IOMapComm.BtInBuf.InPtr)
{
if ((CLOSE == IOMapComm.BtInBuf.Buf[1]) &&
(REPLY_CMD == IOMapComm.BtInBuf.Buf[0]) &&
(VarsComm.ExtTx.DstHandle == IOMapComm.BtInBuf.Buf[3]))
{
if (LOADER_ERR_BYTE(SUCCESS) == IOMapComm.BtInBuf.Buf[2])
{
*(VarsComm.pRetVal) = SUCCESS;
VarsComm.UpdateState = 8;
}
else
{
*(VarsComm.pRetVal) = FILETX_CLOSEERROR;
VarsComm.UpdateState = 8;
}
IOMapComm.BtInBuf.InPtr = 0;
}
}
if (VarsComm.ExtTx.Timer >= FILETXTOUT)
{
*(VarsComm.pRetVal) = FILETX_TIMEOUT;
VarsComm.UpdateState = 8;
}
else
{
(VarsComm.ExtTx.Timer)++;
}
}
break;
case 8:
{
UBYTE Handle;
Handle = (UBYTE)(VarsComm.ExtTx.SrcHandle);
pMapLoader->pFunc(CLOSE, &Handle, NULL, NULL);
(VarsComm.UpdateState)++;
}
break;
case 9:
{
cCommsSetCmdMode(&(VarsComm.UpdateState));
}
break;
case 10:
{
SETBtStateIdle;
}
break;
}
}
break;
case UPD_EXTREAD:
{
switch (VarsComm.UpdateState)
{
case 0:
{
ULONG MsgLength;
UWORD Status;
MsgLength = (SIZE_OF_BTBUF - 8);
Handle =(UBYTE)(VarsComm.ExtTx.SrcHandle);
Status = pMapLoader->pFunc(READ, &Handle, &(VarsComm.BtModuleOutBuf.Buf[6]), &MsgLength);
VarsComm.BtModuleOutBuf.Buf[0] = (UBYTE) (REPLY_CMD);
VarsComm.BtModuleOutBuf.Buf[1] = (UBYTE) (VarsComm.ExtTx.Cmd);
VarsComm.BtModuleOutBuf.Buf[2] = LOADER_ERR_BYTE(Status);
VarsComm.BtModuleOutBuf.Buf[3] = LOADER_HANDLE(Status);
VarsComm.BtModuleOutBuf.Buf[4] = (UBYTE)VarsComm.ExtTx.RemMsgSize;
VarsComm.BtModuleOutBuf.Buf[5] = (UBYTE)(VarsComm.ExtTx.RemMsgSize >> 8);
dBtSendMsg(VarsComm.BtModuleOutBuf.Buf, (UBYTE)(SIZE_OF_BTBUF - 2), (VarsComm.ExtTx.RemMsgSize + 6));
VarsComm.ExtTx.RemMsgSize -= (SIZE_OF_BTBUF - 8);
VarsComm.UpdateState = 1;
}
break;
case 1:
{
ULONG Length;
if(dBtCheckForTxBuf())
{
if (VarsComm.ExtTx.RemMsgSize > (SIZE_OF_BTBUF))
{
/* Send max number of bytes */
VarsComm.ExtTx.RemMsgSize -= SIZE_OF_BTBUF;
Length = SIZE_OF_BTBUF;
}
else
{
/* Buffer can hold the last part of the requested data */
Length = VarsComm.ExtTx.RemMsgSize;
VarsComm.ExtTx.RemMsgSize = 0;
*(VarsComm.pRetVal) = SUCCESS;
SETBtStateIdle;
}
Handle =(UBYTE)(VarsComm.ExtTx.SrcHandle);
pMapLoader->pFunc(READ, &Handle, (VarsComm.BtModuleOutBuf.Buf), &Length);
dBtSend(VarsComm.BtModuleOutBuf.Buf, Length);
}
}
break;
}
}
break;
case UPD_SEARCH:
{
switch (VarsComm.UpdateState)
{
case 0:
{
cCommsSetCmdMode(&(VarsComm.UpdateState));
}
break;
case 1:
{
cCommsCloseConn0(&(VarsComm.UpdateState));
}
break;
case 2:
{
/* Now ready for the actual search */
for (Tmp = 0; Tmp < SIZE_OF_BT_DEVICE_TABLE; Tmp++)
{
if ((IOMapComm.BtDeviceTable[Tmp].DeviceStatus) & BT_DEVICE_KNOWN)
{
(IOMapComm.BtDeviceTable[Tmp].DeviceStatus) = (BT_DEVICE_AWAY | BT_DEVICE_KNOWN);
}
else
{
IOMapComm.BtDeviceTable[Tmp].DeviceStatus = BT_DEVICE_EMPTY;
}
}
dBtSendBtCmd((UBYTE)MSG_BEGIN_INQUIRY, (UBYTE)BT_DEFAULT_INQUIRY_MAX,
BT_DEFAULT_INQUIRY_TIMEOUT_LO, NULL, NULL, NULL, NULL);
(VarsComm.UpdateState)++;
}
break;
case 3:
{
/* this is the stop search flag */
/* - meaning that the search should be stopped */
if (1 == VarsComm.BtCmdData.ParamOne)
{
dBtSendBtCmd((UBYTE)MSG_CANCEL_INQUIRY, 0, 0, NULL, NULL, NULL, NULL);
(VarsComm.UpdateState) = 7;
}
else
{
/* when inquiry is running there is 2 alloable return answers */
/* either inquiry result or inquiry stopped */
if (MSG_INQUIRY_RESULT == IOMapComm.BtInBuf.Buf[BT_CMD_BYTE])
{
dBtResetTimeOut(); /* reset the cmd timeout */
Tmp = cCommInsertDevice(&(IOMapComm.BtInBuf.Buf[2]), &(IOMapComm.BtInBuf.Buf[9]),
&(IOMapComm.BtInBuf.Buf[25]), (UBYTE) BT_DEVICE_UNKNOWN, &Tmp2);
if (SIZE_OF_BT_DEVICE_TABLE > Tmp)
{
/* Remember to check for already existing entry ....*/
if (DEVICE_VERIFIED != Tmp2)
{
(IOMapComm.BtDeviceTable[Tmp].DeviceStatus) &= ~BT_DEVICE_AWAY;
IOMapComm.BtDeviceCnt++;
}
}
else
{
/* We will send a stop inquiry cmd as the table is full! */
dBtSendBtCmd((UBYTE)MSG_CANCEL_INQUIRY, 0, 0, NULL, NULL, NULL, NULL);
}
}
if (MSG_INQUIRY_STOPPED == IOMapComm.BtInBuf.Buf[BT_CMD_BYTE])
{
VarsComm.BtDeviceIndex = 0; /* Start looking for found devices at index 0 */
VarsComm.LookUpCnt = 0; /* how many times should we try to ask for the name */
(VarsComm.Upda
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -