﻿"""Module d'utilisation du système Mensurasoft (pilotes d'appareils de mesure)
Modulo por uzi la sistemon Mensurasoft (peliloj de mezur-aparatoj)
Module for use Mensurasoft system (drivers for measurement devices)

Logiciel libre // libera programaro  // free software

Pierre Dieumegard
professeur
Lycée Pothier
2 bis rue Marcel Proust
45000 Orléans (France)

pierre.dieumegard@ac-orleans-tours.fr
http://sciencexp.free.fr
"""
from ctypes import *
import os.path
# coding: utf-8
# coding:windows-1252


class mensura(object):
    """pilote d'appareil de mesure Mensurasoft
    pelilo de mezuraparato Mensurasoft
    driver of measurement device Mensurasoft"""
    codage="windows-1252" #ou utf-8,  ou cp437, ou latin-1... """défaut : windows-1252"""

    correct=False #correct = False tant que le pilote n'a pas été correctement chargé

    def __init__(self,nombib):
        self.nom=nombib
        #exist= os.path.isfile(nombib)
        try:
            self.mabib=cdll.LoadLibrary(self.nom)
        #cdll charge des fonctions cdecl
        # pour charger des fonctions stdcall, mettre windll
            try:
                titressai=self.mabib.cdetail
                #print("chargement réussi")
                self.correct=True
            except:
                #print("mauvais type de bibliothèque")
                pass
        except:
            #print("fichier non chargeable")
            pass

    def titre(self):
        """titre de l'appareil de mesure
        titolo de la mezurilo
        title of measurement device"""
        if self.correct:
            ftitre=self.mabib.ctitre;ftitre.restype=c_char_p;return(ftitre().decode(self.codage))
        else:
            return('titre : absent')
    def detail(self):
        """détail de l'appareil de mesure
        detalo de la mezurilo
        detail of the measurement device"""
        if self.correct:
            fdetail=self.mabib.cdetail;fdetail.restype=c_char_p;return(fdetail().decode(self.codage))
        else:
            return('detail : absent')
    def ead(self,n):
        """ead(n) : entrée analogique n
        ead(n) : analoga enigo n
        ead(n) : analog input n"""
        if self.correct:
            fead=self.mabib.cead;fead.restype=c_double;return(fead(n))
        else :
            return(-999)
    def nead(self,n):
        """nead(n) : nom de l'entrée analogique n
        nead(n) : nomo de la analoga enigo n
        nead(n) : name of the analog input n"""
        if self.correct:
            fnead=self.mabib.cnead;fnead.restype=c_char_p;return(fnead(n).decode(self.codage))
        else:
            return('')
    def sad(self,n,v):
        """sad(n, v) : met la sortie analogique n à la valeur v
        sad(n,v) : metas la analoga eligo n je la nivelo v
        sad(n,v) : puts analog output n to value v"""
        if self.correct:
            fsad=self.mabib.csad;fsad.restype=c_double;fsad.argtypes=(c_int,c_double);return(fsad(n,v))
        else:
            return(-999)
    def nsad(self,n):
        """nsad(n) : nom de la sortie analogique n
        nsad(n) : nomo de la analoga eligo n
        nsad(n) : name of analog output n"""
        if self.correct:
            fnsad=self.mabib.cnsad;fnsad.restype=c_char_p;return(fnsad(n).decode(self.codage))
        else:
            return('')
    def eb(self,n):
        """eb(n) : entrée binaire n
        eb(n) : duuma enigo n
        eb(n) : binary input n"""
        if self.correct:
            feb=self.mabib.ceb;feb.restype=c_int;return(feb(n));
        else:
            return(-999)
    def neb(self,n):
        """neb(n) : nom de l'entrée binaire n
        neb(n) : nomo de la duuma enigo n
        neb(n) : name of the binary input n"""
        if self.correct:
            fneb=self.mabib.cneb;fneb.restype=c_char_p;return(fneb(n).decode(self.codage))
        else:
            return('')
    def sb(self,n,v):
        """sb(n,v) : met la sortie binaire n à la valeur v
        sb(n,v) : metas la duuma eligo n je nivelo v
        sb(n,v) : puts the binary output n to value v"""
        if self.correct:
            fsb=self.mabib.csb ;fsb.restype=c_int;fsb.argtypes=(c_int,c_int);return(fsb(n,v))
        else:
            return(-999)
    def nsb(self,n):
        """nsb(n) : nom de la sortie binaire n
        nsb(n) : nomo de la duuma eligo n
        nsb(n) : name of the binary output n"""
        if self.correct:
            fnsb=self.mabib.cnsb; fnsb.restype=c_char_p;    return(fnsb(n).decode(self.codage))
        else:
            return('')
    def stop(self):
        """ ferme la classe, libère la mémoire et l'appareil
        fermas la klason, liberigas la memoron kaj la mezurilon
        close the class, and free the memory and the measurement device
        """
        libhandle=self.mabib._handle
        del(self.mabib)
        windll.kernel32.FreeLibrary(libhandle)




