' 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

 [PROGRAMME COMPLET] AutoExit (a sa propre page)
 [C] [Win32] Mouseloop : Ou comment faire des trucs stupides avec le pointeur de la souris
 [PHP] [INCLUDE] Récupérer des chaines quel que soit l'état de magicquotes.
 [C] [Win32] APM : Faire passer les moniteurs en green mode/locker le PC rapidement.
 [QBASIC] Lire par RS-232 les données du multimetre VC 670 et les enregistrer dans un CSV
 [C] [Portable] [Connerie] Un encodeur/décodeur ROT13 et pas que 13, en mode console.
 [mIRC] Ce client IRC n'est pas très convivial avec le mode "away". Voila qui est mieux.
 [C] [Win32] Un programme pour récupérer le nom de la chanson actuellement jouée.
 [Cµ] [PIC] [CCS] Le programme d'un chariot suiveur de ligne noire par caméra video.
10  [PROJET SOURCEFORGE] [C] Un client/passerelle en mode console pour les minichats (rmcgirr83.org) sur forums PhpBB
11  [C] [Win32] [NHC] "Workaround" d'un probleme avec le son de mon laptop lors du changement de frequence cpu
12  [C] Make-ILDA : a C routine to create ILDA files, for lasershows.