' Ouais bon, c'est du qbasic, je sais ;)
'
' Ceci est un programme qui permetait de récupérer les données de
' mon multimetre VC670, et même de pouvoir sauvegarder tout ça dans un fichier CSV.
' (La tension secteur ici : http://clx.freeshell.org/gallery/captures/tension_sur_10minutes.png )
'
' Ce multimetre envoi des salves de 14 octets, si on tentait directement de lire une chaine
' de 14 octets tout simplement, ce n'etait pas très fiable parce que parfois, il y avait
' quelques octets et ça décalait tout, mais il y a dans ce code quelques astuces qui rendent
' ça un peu plus fiable, comme par exemple une synchronisation, ou faire attendre au programme
' la chaine du mode qu'il doit recevoir. Mes excuses pour ne pas avoir commenté tout ça ^^'
'
'
' Touches:
' L .......... Définir des limites basses et hautes (bip et marque low et high en dehors)
' M .......... Utiliser un autre mode (VAC pour tension alternative par exemple.)
' F .......... Sort les données en CSV.
' S .......... Forcer une resynchronisation
' C .......... Redetecte la longueur du train de données (GEEK!)
' Escape ..... Ferme le port et quitte
'
' C'etait aussi une tentative pour essayer de faire du qbasic "propre" (c'est à dire sans
' trop de GOTOs, et indenté, et avec des fonctions...) Ais-je reussi ? Ben c'est à vous de
' juger ;)
'
' cLx
' http://clx.freeshell.org/
' Juillet 2003
'
DECLARE SUB center (row!, text$)
DECLARE SUB fenetre (couleur)
DECLARE SUB setlimits ()
DECLARE SUB bottom ()
DECLARE SUB fileout ()
DECLARE SUB lgdatacount ()
DECLARE FUNCTION value! (data$)
DECLARE SUB synchro ()
DECLARE FUNCTION textonly$ (x$)
DECLARE SUB notify (texte$)
ON ERROR GOTO erro
Cls
notify ("Démarrage du programme...")
SLEEP 1
x = 0
lgdata = 10
lstate = 0
recmode = 0
mode$ = "OH"
lhaute = 800000000
lbasse = 0
OPEN "com1:4800,n,7,2,rs,cs,ds,cd" FOR RANDOM AS #2
notify ("Attente Connexion...")
lgdatacount
WHILE (1)
visu$ = RIGHT$(visu$, 1) + LEFT$(visu$, 7)
'on prend 'lgdata' caracteres, mais on vire le CR qui est a la fin.
in$ = INPUT$(lgdata, #2)
in$ = LEFT$(in$, lgdata - 1)
a$ = INKEY$
IF (a$ <> "") THEN
IF a$ = CHR$(27) THEN
notify ("Fermeture du port. Fin du programme.")
CLOSE
SLEEP 1
SYSTEM: END
END IF
a$ = UCASE$(a$)
IF a$ = "M" THEN
bottom
PRINT TIME$; "> Entrez l'ident du mode :";
LINE INPUT mode$
mode$ = UCASE$(mode$)
END IF
IF a$ = "C" THEN lgdatacount
IF a$ = "F" THEN fileout
IF a$ = "S" THEN synchro
IF a$ = "L" THEN setlimits
END IF
IF (x) THEN
text$ = textonly(in$)
IF (LEFT$(text$, 2) <> mode$) THEN
IF (x <> -1) THEN
' On demande de passer le multimetre sur
' le mode correct.
IF mode$ = "OH" THEN
notify ("[REQ] Passer le multimetre en ohmmetre...")
ELSE
notify ("[REQ] Passer le multimetre en mode " + mode$ + "...")
END IF
x = -1
tmer = TIMER
ELSE
' Decompte pour la synchro automatique
LOCATE 23, 60
temp = 30 - INT(TIMER - tmer)
IF temp < 0 THEN synchro: x = 0: ELSE PRINT temp
END IF
ELSE
' Marche de croisiere...
text$ = MID$(text$, 3, 1)
IF text$ = "M" THEN
factor = 1000000
ELSEIF text$ = "K" THEN
factor = 1000
ELSE
factor = 1
END IF
dat = value(in$) * factor
IF (x = -1) THEN synchro
LOCATE 1, 5
' Sauvegarde des données
IF (recmode = 1) THEN
PRINT #1, TIMER - timerref; CHR$(9); dat
IF reccoul THEN reccoul = 0: ELSE reccoul = 4
COLOR reccoul
ELSE
COLOR 0
END IF
PRINT "[REC] ";
COLOR 14
IF dat < lbasse THEN
PRINT "[LOW] ";
IF lstate <> -1 THEN
notify ("Limite basse depassée (" + STR$(dat) + ")")
lstate = -1
SOUND 1000, 1
SOUND 500, 2
END IF
ELSEIF dat > lhaute THEN
PRINT "[HIGH]";
IF lstate <> 1 THEN
notify ("Limite haute depassée (" + STR$(dat) + ")")
lstate = 1
SOUND 1000, 1
SOUND 2000, 2
END IF
ELSEIF lstate <> 0 THEN
SOUND 100, 1
lstate = 0
alarm (0)
END IF
PRINT " ",
COLOR 7
PRINT x, in$, "-> "; dat,
x = x + 1
END IF
ELSE
notify ("Premiere lecture effectuée : " + in$)
x = 1
END IF
WEND
notify ("Programme terminé.")
CLOSE
END
' TRAITEMENT DES ERREURS
erro:
IF (ERR = 57) THEN
notify ("Erreur d'entrée/Sortie...")
synchro
ELSEIF (ERR = 69) THEN
notify ("Debordement du tampon d'E/S...")
synchro
RESUME
ELSE
SOUND 1000, 1
notify ("Erreur" + STR$(ERR) + " à la ligne" + STR$(ERL) + " ! Continuer ? [O/N]")
DO
a$ = UCASE$(INKEY$)
IF (a$ = "O") THEN EXIT DO
IF (a$ = "N") THEN
notify ("Fermeture du port. Lancement d'une erreur.")
CLOSE #2
SLEEP 3
ON ERROR GOTO 0
RESUME
EXIT DO
END IF
LOOP
END IF
RESUME
SUB bottom
COLOR 7, 0
LOCATE 18, 1
PRINT SPACE$(80);
LOCATE 24, 2
END SUB
SUB center (row, text$)
LOCATE row, INT(42 - LEN(text$) / 2)
PRINT text$;
END SUB
SUB fenetre (couleur)
COLOR 15, couleur
FOR y = 3 TO 12
FOR x = 20 TO 60 STEP 5
LOCATE y, x
PRINT " ";
NEXT x
NEXT y
END SUB
SUB fileout
SHARED recmode
SHARED timerref
IF (recmode <> 1) THEN
notify ("Enregistrement lancé.")
recmode = 1
OPEN "file_out.csv" FOR APPEND AS #1
timerref = TIMER
ELSE
notify ("Enregistrement stoppé.")
recmode = 0
CLOSE #1
END IF
END SUB
SUB lgdatacount
SHARED lgdata
synchro
notify ("Detection de la longueur du train de données...")
LOCATE 23, 60
lgdata = 1
in$ = INPUT$(1, #2)
WHILE (in$ <> CHR$(13))
lgdata = lgdata + 1
in$ = INPUT$(1, #2)
WEND
PRINT " =>"; lgdata; "Octets."
END SUB
SUB notify (texte$)
bottom
COLOR 7, 0
PRINT TIME$; "> "; texte$
END SUB
SUB purge
in$ = INPUT$(1, #2)
notify ("Vidage du tampon...")
LOCATE 23, 45
WHILE (in$ <> CHR$(13))
PRINT in$;
in$ = INPUT$(1, #2)
WEND
END SUB
SUB setlimits
SHARED lbasse
SHARED lhaute
SOUND 1000, 1: SOUND 2000, 2
bottom
PRINT TIME$; "> Entrez la limite basse :";
INPUT lbasse
bottom
PRINT TIME$; "> Entrez la limite haute :";
INPUT lhaute
synchro
END SUB
SUB synchro
in$ = INPUT$(1, #2)
notify ("Synchronisation en cours...")
LOCATE 23, 45
WHILE (in$ <> CHR$(13))
PRINT in$;
in$ = INPUT$(1, #2)
WEND
END SUB
FUNCTION textonly$ (x$)
chaine$ = ""
FOR a = 1 TO LEN(x$)
y$ = UCASE$(MID$(x$, a, 1))
y = ASC(y$)
IF (y < 91) AND (y > 64) THEN
chaine$ = chaine$ + y$
END IF
NEXT a
textonly$ = chaine$
END FUNCTION
FUNCTION value (z$)
x$ = ""
FOR a = 1 TO LEN(z$)
y$ = MID$(z$, a, 1)
y = ASC(y$)
IF (y < 58) AND (y > 47) THEN
x$ = x$ + y$
ELSEIF y = 46 THEN x$ = x$ + "."
END IF
NEXT a
value = VAL(x$)
END FUNCTION