⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c_comm.c

📁 乐高机器人的源码,开发平台是IAR_for_AVR.
💻 C
📖 第 1 页 / 共 5 页
字号:
      {
        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 + -