; DTPS
;
; Programma per Proteus
;
; (C) 2004 Simone Zanella Productions
;
; Riceve dati da un terminale connesso via RS-232 che comunica con il protocollo DTP;
; i dati ricevuti (se la trasmissione ha avuto successo) sono successivamente introdotti in emulazione di
; tastiera - ogni dato è terminato da POSTFIX.
; Questo programma può essere installato come script associato al servizio Proteus.
;
; N.B. Per il corretto funzionamento, questo script richiede:
; - PROTEXT.DLL (DLL di default distribuita con Proteus)
; - DTPCLIENT.DLL (DLL Datalogic®)
; - DTPCMDS.DLL (DLL Datalogic®)
;
; I parametri di configurazione si trovano all'inizio del programma e sono:
; - COMPORT = porta di comunicazione (vedi le costanti mnemoniche sottostanti)
; - COMSPEED = velocità di comunicazione (vedi le costanti mnemoniche sottostanti)
; - POLLINTERVAL = periodicità (in secondi) con la quale il programma verifica la presenza di un terminale
; - TIMEOUT = timeout (in millisecondi) per la risposta di un terminale
; - FILENAME = nome del file da scaricare (percorso completo sul terminale)
; - TEMPFILE = nome del file temporaneo, nel quale ricevere i dati
; - KILLFILE = valore boolean (1 o 0) che indica se il file sul terminale deve essere cancellato dopo la trasmissione
; - QUITAFTERRX = valore boolean (1 o 0) che indica se si deve forzare l'uscita sul DTPS al termine della trasmissione
; - PACE = ritardo dopo l'invio in emulazione di tastiera di ciascuna riga (in secondi);
; - POSTFIX = terminatore
;
; Il codice commentato più sotto permette anche in alternativa di:
; - selezionare una specifica finestra (applicativo Ultra-Edit) ed inviare il dato verbatim, seguito da Invio;
; - lanciare il blocco note (se non aperto), introdurre il dato verbatim (seguito da Invio) e tornare alla finestra
;   iniziale.

#!proteus -z -j

!include "win32.prt"

!extern DTPOpenClient, PROTEXT.DLL, ProteusDTPOpenClient, 2, 0
!extern DTPSetFailTimeout, PROTEXT.DLL, ProteusDTPSetFailTimeout, 2, 0
!extern DTPPing, PROTEXT.DLL, ProteusDTPPing, 1, 0
!extern DTPSetAttrib, PROTEXT.DLL, ProteusDTPSetAttrib, 5, 0
!extern DTPFileRx, PROTEXT.DLL, ProteusDTPFileRx, 4, 0
!extern DTPCloseClient, PROTEXT.DLL, ProteusDTPCloseClient, 1, 0
!extern DTPDelete, PROTEXT.DLL, ProteusDTPDelete, 3, 0
!extern DTPExit, PROTEXT.DLL, ProteusDTPExit, 1, 0
!extern DTPChDir, PROTEXT.DLL, ProteusDTPChDir, 2, 0

CONST DTP_DELETE_ALL = 1
CONST DTP_DELETE_SOME = 0

; Porte seriali
CONST DTP_COM1 = 1
CONST DTP_COM2 = 2
CONST DTP_COM3 = 3
CONST DTP_COM4 = 4

; Velocità
CONST DTP_BR_300 = 0
CONST DTP_BR_600 = 1
CONST DTP_BR_1200 = 2
CONST DTP_BR_2400 = 3
CONST DTP_BR_4800 = 4
CONST DTP_BR_9600 = 5
CONST DTP_BR_19200 = 6
CONST DTP_BR_38400 = 7
CONST DTP_BR_57600 = 8
CONST DTP_BR_115200 = 9

; Errori in ricezione/trasmissione:

; successo
CONST ERR_RV_OK = 0
; timeout
CONST ERR_RV_TOUT = 1
; errore nel frame
CONST ERR_RV_FE = 2
; l'utente ha interrotto
CONST ERR_RV_ABORT = 3
; formato incorretto del frame
CONST ERR_RV_BAD_FRAME = 4
; checksum errato
CONST ERR_RV_BAD_CRC = 5
; errore di sequenziazione
CONST ERR_RV_BAD_SEQ = 6
; sorgente inattesa
CONST ERR_RV_BAD_SOURCE = 7
; parametri errati
CONST ERR_RV_BAD_PARAM = 8
; file esistente
CONST ERR_RV_EXIST = 9
; errore generico
CONST ERR_RV_GENERIC = 10

; Costanti per la creazione del file (in ricezione/trasmissione)
CONST DTP_CREATE_APPEND = 3
CONST DTP_CREATE_RENAME = 2
CONST DTP_CREATE_NEW = 1
CONST DTP_CREATE_ALWAYS = 0

; Parametri di configurazione
; ---------------------------

; Porta seriale
COMPORT = DTP_COM1

; Baud rate
COMSPEED = DTP_BR_38400

; Terminatore
POSTFIX = CHR(13)

; Ritardo interlinea
PACE = 0.02

; Intervallo di polling
POLLINTERVAL = 1

; Timeout (in millisecondi) per la risposta del terminale
TIMEOUT = 1000

; Nome del file (completo di percorso) sul terminale
FILENAME = "C:\\DATI.TXT"

; Nome del file temporaneo, sul quale ricevere i dati
TEMPFILE = "C:\\DTPS.TMP"

; Rimuove il file al termine della trasmissione
KILLFILE = 0

; Indica se si deve forzare l'uscita sul DTPS al termine della trasmissione
QUITAFTERRX = 1

; ---------------------------

; Apre la porta seriale
CS = DTPOpenClient(COMPORT, COMSPEED)
IF EQ(CS, 0)
!ifndef SERVICE
  CONSOLELN "Impossibile aprire la porta " COMPORT "."
!endif
  ABORT 2
FI

; Imposta il timeout per la verifica presenza
DTPSetFailTimeout(CS, TIMEOUT)

P = STRRSTR(FILENAME, "\\")
IF NEQ(P, 0)
  PATH = LEFT(FILENAME, DEC(P))
  IF AND(EQ(STRLEN(PATH), 2), STREQ(RIGHT(PATH, 1), ":"))
    PATH = PATH "\\"
  FI
  NAME = RESTFROM(FILENAME, INC(P))
ELSE
  PATH = ""
  NAME = FILENAME
FI

WHILE 1
  ; Attende l'intervallo di poll
  SLEEP(POLLINTERVAL)
  
  ; Se non è un servizio e l'utente ha premuto ESC, esce
  !ifndef SERVICE
    IF KBDHIT()
      IF EQ(GETCH(), 27)
        BREAK
      FI
    FI
  !endif
  
  ; Verifica la presenza del terminale
  RESULT = DTPPing(CS)
  
  IF EQ(RESULT, 0)
    ; Verifica se esiste il file da scaricare
    IF ISNOTEMPTY(PATH)
      RESULT = DTPChDir(CS, PATH)
    FI

    RESULT = DTPSetAttrib(CS, NAME, 0, 0xFFFF, 0xFFFF)
    IF NEQ(RESULT, 0)
      CONTINUE
    FI
    
    ; Rimuove il file temporaneo
    FREMOVE(TEMPFILE)    

    ; Riceve il file dal terminale
    RESULT = DTPFileRx(CS, FILENAME, TEMPFILE, DTP_CREATE_ALWAYS)

!ifndef SERVICE
    SWITCH RESULT
    ON ERR_RV_OK
      msg = ""
    ON ERR_RV_TOUT
      msg = "Timeout nella ricezione"
    ON ERR_RV_FE
      msg = "Errore nel frame"
    ON ERR_RV_ABORT
      msg = "L'utente ha interrotto"
    ON ERR_RV_BAD_FRAME
      msg = "Formato incorretto del frame"
    ON ERR_RV_BAD_CRC
      msg = "Checksum errato"
    ON ERR_RV_BAD_SEQ
      msg = "Errore di sequenziazione"
    ON ERR_RV_BAD_SOURCE
      msg = "Sorgente inattesa"
    ON ERR_RV_BAD_PARAM
      msg = "Parametri errati"
    ON ERR_RV_EXIST
      msg = "File esistente"
    ON ERR_RV_GENERIC
      msg = "Errore generico"
    OFF
    IF NEQ(RESULT, 0)
      CONSOLELN "Errore: " msg
    FI
!endif    

    IF EQ(RESULT, 0)
      IF KILLFILE
        DTPDelete(CS, FILENAME, DTP_DELETE_ALL)
      FI
      IF QUITAFTERRX
        DTPExit(CS)
      FI
      EMULATEKBD(TEMPFILE)
    FI
    
  FI
LOOP
; Chiude la porta
RESULT = DTPCloseClient(CS)
ABORT 0   

FUNCTION EMULATEKBD(tempfile)

h = FOPEN(tempfile, 1)
IF EQ(h, -1)
  RETURN
FI

WHILE NOT(FEOF(h))
  l = FREADLN(h)
  ; Se si vuole selezionare una particolare finestra, si può utilizzare 
  ; un'espressione simile alla seguente:
  ; W32SETFOCUS(W32FINDWINDOW("*ULTRAEDIT-32*"))
  W32SENDKEYS(KTrans(l) _POSTFIX)
  SLEEP(_PACE)
LOOP

; Variante con salvataggio/ripristino finestra corrente e selezione blocco notes
; ; Preleva la finestra corrente
; hOld = W32GETFOCUS()
;     
; ; Cerca il blocco notes
; hNew = W32FINDWINDOW("*Blocco note*")
; IF EQ(hNew, 0)
;   ; Non trovato - lo lancia
;   W32SHELL("NOTEPAD.EXE")
;   ; Attende un secondo che si renda disponibile
;   SLEEP(1)
;   ; Cerca la sua finestra nuovamente
;   hNew = W32FINDWINDOW("*Blocco note*")
; FI
; ; Se trovato, seleziona la sua finestra ed invia i dati
; IF NEQ(hNew, 0)
;   W32SETFOCUS(hNew)
;   WHILE NOT(FEOF(h))
;     l = FREADLN(h)
;     W32SENDKEYS(KTrans(l) _POSTFIX)
;     SLEEP(_PACE)
;   LOOP
; ELSE
;   ; Impossibile aprire il blocco notes - dati persi!
; FI
; W32SETFOCUS(hOld)

FCLOSE(h)
RETURN

FUNCTION KTrans(s)

l = STRLEN(s)
r = ""
FOR x = 1 TO l
  c = SUBSTR(s, x, 1)
  ; Mappatura dei caratteri speciali: caratteri che non si trovano
  ; sulla tastiera potrebbero richiedere l'introduzione della sequenza
  ; con ALT + numero
  SWITCH c STREQ
  ON "~"
    r = r "{ALT DOWN}{NUMPAD1}{NUMPAD2}{NUMPAD6}{ALT UP}"
  ON "{"
    r = r "{ALT DOWN}{NUMPAD1}{NUMPAD2}{NUMPAD3}{ALT UP}"    
  ON "}"
    r = r "{ALT DOWN}{NUMPAD1}{NUMPAD2}{NUMPAD5}{ALT UP}"
  ON "+", "^", "%", "(", ")", "[", "]"
    r = r "{" c "}"
  OTHER
    r = r c
  OFF
NEXT
RETURN r
Midnight Lake iPhone Case Black Women Shoes Black Flat Shoes Leather Flats Black Patent Ballerinas Black Ballet Shoes Casual Shoes Black Shoes Women Balle Record Player Cufflinks Best iPhone XR Clear Cases iPhone XS/XS Max Leather Cases Sale Best iPhone 8/8 Plus Silicone Cases iPhone 7/7 Plus Cases & Screen Protector New Cases For iPhone 6/6 Plus iPhone 8 Case Sale iPhone Xr Case Online iPhone 7 Case UK Online iPhone X Case UK Sale iPhone X Case Deals iPhone Xs Case New Case For iPhone Xr UK Online Case For iPhone 8 UK Outlet Fashion Silver Cufflinks For Men Best Mens Cufflinks Outlet Online The Gold Cufflinks Shop Online Cheap Shirt Cufflinks On Sale Nice Wedding Cufflinks UK Online Top Black Cufflinks UK Online Mens Cufflinks Online Silver Cufflinks For Men Men Cufflinks UK Sale Gold Cufflinks UK Online Gold Cufflinks UK Silver Cufflinks UK Shirt Cufflinks Discount Online Mens Cufflinks Deals & Sales Girls Shoes For Dance Fashion Ballet Dance Shoes Best Ballet Flats Shoes UK Online Cheap Ballet Pointe Shoes UK Online Best Ballet Shoes Outlet Best Dance Shoes Sale Cheap Ballet Flats Sale UK Best Pointe Shoes Online UK Ballet Dance Shoes UK Shoes For Dance UK Best Ballet Slippers Shop Best Yoga Shoes Hotsell