!------------------------------------------------
! Программа приема-передачи строки из 4096 байт
! по интерфейсу USB.
!-----------------------------------
!
! 1.      k=1! для RS232
!        ! k=5! для SPI
!
! 2.    !  S1=S1S[64] ! - для SPI
!          S1=S1S[1]   ! - для RS232
!
! 3.     !k=100 !Для USB и USB-SPI
!         k=5 !Для USB-RS232
!---------------------
! program RS232 for MK: USBNRS321, USBRS938.
!------------------------------------------------
       PROGRAM
!--------------------------
   INCLUDE('Equates.CLW')
   INCLUDE('TplEqu.CLW')
   INCLUDE('Keycodes.CLW')
   INCLUDE('Errors.CLW')
!------------------------------------------------
! Переменные
!-------------------------
! Переменные для USBEXpress
!------------------------
! Return codes
SI_SUCCESS                 ushort(00h)
SI_DEVICE_NOT_FOUND        ushort(0FFh)
SI_INVALID_HANDLE          ushort(01h)
SI_READ_ERROR              ushort(02h)
SI_RX_QUEUE_NOT_READY      ushort(03h)
SI_WRITE_ERROR             ushort(04h)
SI_RESET_ERROR             ushort(05h)
SI_INVALID_PARAMETER       ushort(06h)
SI_INVALID_REQUEST_LENGTH  ushort(07h)
SI_DEVICE_IO_FAILED        ushort(08h)
SI_INVALID_BAUDRATE        ushort(09h)
SI_FUNCTION_NOT_SUPPORTED  ushort(0ah)
SI_GLOBAL_DATA_ERROR       ushort(0bh)
SI_SYSTEM_ERROR_CODE       ushort(0ch)
SI_READ_TIMED_OUT          ushort(0dh)
SI_WRITE_TIMED_OUT         ushort(0eh)
SI_IO_PENDING              ushort(0fh)
!-------------------------
! GetProductString() function flags
SI_RETURN_SERIAL_NUMBER    ushort(00h)
SI_RETURN_DESCRIPTION      ushort(01h)
SI_RETURN_LINK_NAME        ushort(02h)
SI_RETURN_VID              ushort(03h)
SI_RETURN_PID              ushort(04h)
!-------------------------
! RX Queue status flags
SI_RX_NO_OVERRUN           ushort(00h)
SI_RX_EMPTY                ushort(00h)
SI_RX_OVERRUN              ushort(01h)
SI_RX_READY                ushort(02h)
!-------------------------
! Buffer size limits
SI_MAX_DEVICE_STRLEN       ushort(256)
SI_MAX_READ_SIZE           ushort(65535)
SI_MAX_WRITE_SIZE          ushort(4096)
!-----------------------------
! Type definitions
SI_STATUS                  ushort
SI_DEVICE_STRING           string(256)
!-----------------------------------
! Input and Output pin Characteristics
SI_HELD_INACTIVE           ushort(00h)
SI_HELD_ACTIVE             ushort(01h)
SI_FIRMWARE_CONTROLLED     ushort(02h)
SI_RECEIVE_FLOW_CONTROL    ushort(02h)
SI_TRANSMIT_ACTIVE_SIGNAL  ushort(03h)
SI_STATUS_INPUT            ushort(00h)
SI_HANDSHAKE_LINE          ushort(01h)
!---------------------------------
! Mask and Latch value bit definitions
SI_GPIO_0                  ushort(01h)
SI_GPIO_1                  ushort(02h)
SI_GPIO_2                  ushort(04h)
SI_GPIO_3                  ushort(08h)
!------------------------------------------------
! Вспомогательные переменные.
!-----------------------------------------------
C                  byte
A                  byte
B                  byte
BT                 byte
M                  byte
STR1               string(1)
MSTR1              byte,over(STR1)
SL                 string(4096)!128,512,4096
SS                 string(64),dim(64),over(SL)!2,8,64
S                  string(64)
S1L                string(4096)!128,512,4096
S1S                string(64),dim(64),over(S1L)!2,8,64
S1                 string(64)
i                  ushort
j                  ushort
k                  ushort
l                  ushort
CH                 byte
N1                 long
STR                string(5)
p                  byte
R                  real
Param_Del          ushort(100)
!-------------------------------------
T1                 long
V                  real
TR                 real
N                  long
!---------------------------------------------------
!USB
!-----------
!Переменные для SI_GetNumDevices(),SI_GetProductString(),SI_Open
NumDevices         ulong
DevString          string(256)
DS                 string(256)
DS1                string(256)
Handler            ulong
HD                 ulong
!-------
ND                ulong,dim(10)
close             string(10)
NumBytesWritten   ulong
NumBytesToRead    ulong
NumBytesInQueue   ulong
QueueStatus       ulong
!--------------------------------
       MAP
!#######################
!   Прототипы функций Si_USBXpress.
!---------------------------------------------
   MODULE('SiUSBXp')
!-------------
  SI_GetNumDevices(*ULONG),USHORT,PASCAL
  SI_GetProductString(ULONG,STRING,ULONG),USHORT,RAW,PASCAL
!-------------------------------
   SI_CancelIo(ULONG),USHORT,PROC,PASCAL
!-------------------------------
  SI_Open(ULONG,*ULONG),USHORT,PASCAL
  SI_Close(ULONG),USHORT,PROC,PASCAL
  SI_Read(ulong,*string,ULONG,*ULONG,ulong),USHORT,raw,PASCAL
  SI_Write(ulong,*string,ULONG,*ULONG,ULONG),USHORT,raw,PASCAL
  SI_DeviceIOControl(UNSIGNED,ULONG,ULONG,ULONG,ULONG,ULONG,*ULONG),|
  USHORT,PASCAL
  SI_FlushBuffers(UNSIGNED,BYTE,BYTE),USHORT,PASCAL
  SI_SetTimeouts(ULONG,ULONG),USHORT,PASCAL
  SI_GetTimeouts(*ULONG,*ULONG),USHORT,PASCAL
  SI_CheckRXQueue(UNSIGNED,*ULONG,*ULONG),USHORT,PASCAL
  SI_GetDLLVersion(*ULONG,*ULONG),USHORT,PASCAL
  SI_GetDriverVersion(*ULONG,*ULONG),SHORT,PASCAL
!---------------
   END
!----------------------------------------------------
    MODULE('Задержка')
    Sleep(ULONG),PASCAL
    END
!===================================================

!#######################
      END  ! от MAP
!----------------------
! Определение окна на экране.
!-------------------------------------------------------------
Window WINDOW('Test USB'),AT(,,284,160),|
       FONT('MS Sans Serif',8,,FONT:bold,CHARSET:CYRILLIC),|
       COLOR(COLOR:BTNFACE),CENTER,SYSTEM,GRAY,MAX
    !  BUTTON('Выход'),AT(36,132,52,21),USE(?Cancel),|
       BUTTON('Cancel'),AT(36,132,52,21),USE(?Cancel),|
       FONT('Tahoma',10,COLOR:Black,FONT:bold,CHARSET:CYRILLIC)
  !    BUTTON('Продолжить'),AT(176,132,73,21),USE(?Ok),|  
       BUTTON('Continue'),AT(176,132,73,21),USE(?Ok),|   
       FONT('Tahoma',10,COLOR:Black,FONT:bold,CHARSET:CYRILLIC),|
           DEFAULT
     END
!-----------------------
!Кодовая часть программы
!-----------------------
       CODE
!-----------------------
 S='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdifjhigklmnopqrstuvwxyzАБВГДЕЖЗИКЛМ'
 loop i=1 to 64!2,8,64
     SS[i]=S
 .
 STR1='A'
!-------------------------------------------------------------
! Обязательный цикл для необязательной функции SI_GetProductString.
!-------------------------------------------------------------
    loop i=0 to 1
      loop while SI_GetNumDevices(NumDevices).
    .
!--------------------------------------------------------------
   NumDevices=0                             !SI_RETURN_VID
   loop while SI_GetProductString(NumDevices,DevString,SI_RETURN_DESCRIPTION).
   DS=sub(DevString,1,(instring(chr(0),DevString,1,1))-1) !стирание 00h в конце.
   loop while SI_GetProductString(NumDevices,DevString,SI_RETURN_SERIAL_NUMBER).
   DS1=sub(DevString,1,(instring(chr(0),DevString,1,1))-1)
!--------------------------------------------------------
!Открытие USB и получение хандлера.
  loop while SI_Open(0,Handler).
!----------------
     OPEN(Window)
     k=1! для RS232
    ! k=5! для SPI
     loop while SI_FlushBuffers (Handler,0,0).   !Очистка буферов
START
       disable(?Ok)
       disable(?Cancel)
!Вывод на экран выводимой по USB 1/64 строки.
      !show(10,10,'Начало передачи')
        show(10,10,'Start of transmission')
      display
!---
     l=0
     T1=clock() !Запуск таймера.
!--------------
   loop j=1 to k
   S1L=' ' !Обнуление строки перед приемом.
!---------
! Вывод строки в устройство.

    !    goto AAA

    loop while SI_Write(Handler,SL,4096,NumBytesWritten,0).

   ! goto AAA

!----------------
!Ожидание прихода 4096 байт
  QueueStatus=SI_RX_OVERRUN
    NumBytesInQueue=0
    loop until NumBytesInQueue=4096
       loop while SI_CheckRXQueue(Handler,NumBytesInQueue,QueueStatus).
    .

     ! goto AAA




!---------------
! Чтение принятой из устройства строки.
      loop while SI_Read(Handler,S1L,4096,NumBytesToRead,0).
!--------------
   .  !Конец цикла loop j=1 to k




AAA


!------------------------
     T1=clock()-T1 !Остановка таймера и чтение времени работы.
!----------------------------------------
       blank !Очистка экрана
    !   show(10,0,'Конец передачи      ')
!------------------
    TR=T1/100.0
   ! show(200,100,'Время Т=')
    show(200,100,'Time T=')

    type(format(TR,@N_5.2b))
   ! type(' сек.')
    type(' Sec.')
!--------------
!Расчет скорости обмена
!-------------------------------------------------
    V=((8*2*4096.0*k)/TR)/1000000.0 !Только по USB
!   V=((8*2*2*4096.0*k)/TR)/1000000.0! USB+RS232(SPI)
!--------------------------------------------
    !show(160,110,' Скорость обмена V=')
    show(160,110,' Exchange speed V=')
    type(format(V,@N_6.3b))
   ! type(' Mбод')
    type(' Mbaud')
!-----------------------------------------
    show(100,50,'NumBytesWritten=')
    type(NumBytesWritten)
!-------------------------------------
    show(200,50,'NumBytesToRead=')
    type(NumBytesToRead)
!------------------------------------
    show(200,40,'NumBytesInQueue=')
    type(NumBytesInQueue)
!--------------------------------------
    show(255,10,'k=')
    type(k)
!--------------------------------------
   ! show(5,60,'1/64 Переданной строки:')
    show(5,60,'1/64 Transmitted string:')
    show(5,70,SS[64]) !Вывод на экран 1/64 переданной по USB строки.
   ! show(5,80,'1/64 Принятой строки:')
    show(5,80,'1/64 Received string:')
!----------------------------------------
    S1=S1S[64] ! - для SPI
  !  S1=S1S[1]   ! - для RS232
    show(5,90,S1) !Вывод на экран 1/64 принятой по USB строки.
!   show(10,105,'Конец передачи')
    show(10,105,'End of transmission')
    show(65,113,'____________________________________________________')
!------------------

    show(10,10,'SI_RETURN_DESCRIPTION=')
    show(108,10,DS)
    show(10,20,'SI_RETURN_SERIAL_NUMBER=')
    show(119,20,DS1)
!---------------
    show(10,40,'Handler=')
    type(Handler)
!-------------------------------------------------------------
!Процедура определения нажатия кнопок "Продолжить" и "Выход".
!-------------------------------------------------------------
        p=0
        enable(?Ok)
        enable(?Cancel)
!------------------------
        accept
!----
          case accepted()
             of ?Ok
              p=1
              break
           of ?Cancel
              p=0
              break
          .! от case
!----
        .! от accept
!----------------------------
        if p=0 then goto E.
!----------------------------
        blank
        display
        k=100 !Для USB и USB-SPI
      !  k=5 !Для USB-RS232

        goto START
!----------------------------
! Окончание работы программы.
!----------------------------
E
!------------------
!Закрытие USB
!----------------
  loop while SI_Close(Handler).
!----------------------------------
      return  ! Возврат в Windows.
!----------------------------------
