Ressources pour datamatrix


  • Encodage des DataMatrix

 Les normes définissant les DataMatrix imposent un encodage. Le type d'encodage utilisé se déduit de la valeur décimale du CodeWord, voici un tableau synthèse et un exemple:

L'exemple encadré vous explique la démarche d'encodage d'un nombre décimal compris entre 0 et 99.

On veut placer le nombre 70 dans un code Word:

1: on encode d'abord le nombre en lui ajoutant 130: ainsi 70 devient 70+130 = 200.

2: on transcode ensuite 200 en binaire: 200 base 10 =>  1100 1000 base2  

3: On place le nombre binaire obtenu  1100 1000 dans le CodeWord choisi.

  • Codage en python
    • Dessiner une grille dans un canevas:


from tkinter import messagebox, Entry, Label, Button, Tk, END, Canvas


def dessine_matrice():

    # récupérera le contenu des champs de saisies et dessine matrice

    pass


# création d'un objet fenêtre

fen = Tk()

#  fenêtre de 1000 pixels de large et 700 de haut

fen.geometry("1000x700")

# titre de la fenêtre

fen.title("Générateur de datamatrix")

# empêcher de redimensionner la  fenêtre en largeur et hauteur

fen.resizable(width=False, height=False)

# création des champs de saisie positionnés avec grid

# ligne vide

lbl_espace0 = Label(fen, text='    ').grid(row=0, column=0)

# ligne champs texte code_word1

lbl_nombre1 = Label(fen, text=' code_word_1').grid(row=0, column=1)

# ligne vide

lbl_espace0 = Label(fen, text='    ').grid(row=0, column=2)

# ligne champs texte code_word2

lbl_nombre2 = Label(fen, text=' code_word_2').grid(row=0, column=3)

# ligne vide

lbl_espace0 = Label(fen, text='    ').grid(row=0, column=4)

# ligne champs texte code_word3

lbl_nombre3 = Label(fen, text=' code_word_3').grid(row=0, column=5)

# ligne vide

lbl_espace0 = Label(fen, text='    ').grid(row=0, column=6)

# Les zones de saisies

zone_de_saisie1 = Entry(fen, width=10)

zone_de_saisie1.grid(row=1, column=1)

zone_de_saisie2 = Entry(fen, width=10)

zone_de_saisie2.grid(row=1, column=3)

zone_de_saisie3 = Entry(fen, width=10)

zone_de_saisie3.grid(row=1, column=5)

lbl_trier = Label(fen, text='     ').grid(row=2, column=1)

#  ajout du bouton Dessiner qui déclenche l'appel de la fonction dessine_matrice

mon_bouton_bulle = Button(fen, text='Dessiner',command= dessine_matrice)

mon_bouton_bulle.grid(row=3, column=1)

lbl_espace0 = Label(fen, text='    ').grid(row=4, column=0)

# canevas de 500 pixels par 500  pixels ( zone de dessin de la matrice)

c = Canvas(fen, width="500", height="500", bg='white')

# positionnement du canvas dans fenêtre

c.grid(row=5, column=1, rowspan=10, columnspan=10, sticky='NW')

# tour canevas

c.create_rectangle( 2, 2, 500, 500, width=1, fill='white')

# dessin de la grille

for x in range(10):

       #traits verticaux noirs

       c.create_line(x*50, 2, x*50,500, width=1, fill='black')

       # carrés noirs de la première ligne

       if x*100 < 500:

           c.create_rectangle( x*100, 0, 50 + x*100 , 50, width=1, fill='black')


for y in range(10):

       #traits horizontaux noirs

       c.create_line( 2, y*50, 500, y*50, width=1, fill='black')

       # carrés noirs de la dernière colonne

       if y*100 < 450:

           c.create_rectangle(450, y*100 + 50 , 500, y*100 + 100, width=1, fill='black')


# tour noir première colonne et dernière ligne

c.create_rectangle( 0, 0, 50, 500, width=1, fill='black')

c.create_rectangle( 0, 450, 500, 500, width=1, fill='black')

c.create_rectangle( 0, 450, 500, 500, width=1, fill='black')

# abonnement de la fenêtre aux messages de Windows

fen.mainloop()


    • Récupérer les données dans les champs de saisie et calcul des codewords

try:

          liste = []

          # recuperation-conversion en nombre entier-ajout dans une liste

          nombre1 = int(zone_de_saisie1.get())

          liste.append(nombre1)

          nombre2 = int(zone_de_saisie2.get())

          liste.append(nombre2)

          nombre3 = int(zone_de_saisie3.get())

          liste.append(nombre3)

          nombre4 = int(zone_de_saisie4.get())

          liste.append(nombre4)

          print("la liste vaut", liste)


 except:

         # effacement des champs si erreur de saisie

          zone_de_saisie1.delete(0, END)

          zone_de_saisie2.delete(0, END)

          zone_de_saisie3.delete(0, END)

          zone_de_saisie4.delete(0, END)

          messagebox.showinfo("Information", "vous devez entrer des nombres entiers")


  • Fonction Reed Salomon ( création des octets de vérification)


from tkinter import messagebox, Entry, Label, Button, Tk, END, Canvas

# liste des données saisies dans les champs

liste = []

# algorithme de reed Salomon pour codes erreurs

def reed_Salomon(liste_3_codewords):

    # sequence A^i dans GF(256)

    PP = 301

    A = [0]*256;

    A[0]=1;

    for i in range(1,256):

           A[i] = A[i-1] << 1

           if A[i] > 255:

             A[i] ^= PP

    # table Multiplication  : A^i * A^j = A^(i+j)

    n=256

    mul = [[0] * n for _ in range(n)]

    for j in range(256):

            for i in range(256):

                   mul[A[i]][A[j]] = A[(i+j) % 255]

    #print(mul)

    # coeffcient du polynome générateur

    G = [1,62,111,15,48,228]

    # degré du polynome de correction

    d = len(G) -1

    # 3 premiers codewords

    #entree = [142, 164, 186]

    #entree(x) = Q(x)*G(x) + R(x)

    #fabrication de RX par division longue

    R = liste_3_codewords.copy()

    R.append(0)

    R.append(0)

    R.append(0)

    #print(R)


    for j in range(len(liste_3_codewords)):

        q = R[0]

        #print("q=", q)

        for i in range(d):

            R[i] = R[i+1]  ^  mul[q][G[i+1]]

            #print(R)

        if j+d+1 < len(liste_3_codewords):

           R[d] = liste_3_codewords[j+d+1]


        else:

           R[d] = 0


    # R = Arrays.copyOf(R, d); // keep first d digits or R

    R = R[:5]

    return R


# fonction de récupération des champs et calcul des codewords

def ajout_liste():

     try:

          global c


          nombre1 = int(zone_de_saisie1.get())

          liste.append(nombre1)

          nombre2 = int(zone_de_saisie2.get())

          liste.append(nombre2)

          nombre3 = int(zone_de_saisie3.get())

          liste.append(nombre3)

          # calcul des 3 codewords demandés

          codeword1 = nombre1 + 130

          codeword2 = nombre2 + 130

          codeword3 = nombre3 + 130

          liste_3_codewords = [codeword1,codeword2, codeword3]

          print("les codewords demandés:", liste_3_codewords)

           # calcul des 5 codewords de contrôle erreurs avec la fonction reed_Salomon(...)

          liste_5_codewords = reed_Salomon(liste_3_codewords)

          print("les codewords de correction d'erreur:", liste_5_codewords)

          # dessin d'une case noire

          c.create_rectangle( 150, 200, 100, 150, width=1, fill='black')


     except:

          zone_de_saisie1.delete(0, END)

          zone_de_saisie2.delete(0, END)

          zone_de_saisie3.delete(0, END)

          zone_de_saisie4.delete(0, END)

          messagebox.showinfo("Information", "vous devez entrer des nombres entiers")


# définition de la fenêtre

fen = Tk()

fen.geometry("1000x700")

fen.title("Générateur de datamatrix")

fen.resizable(width=False, height=False)

lbl_espace0 = Label(fen, text='    ').grid(row=0, column=0)

lbl_nombre1 = Label(fen, text=' code_word_1').grid(row=0, column=1)

lbl_espace0 = Label(fen, text='    ').grid(row=0, column=2)

lbl_nombre2 = Label(fen, text=' code_word_2').grid(row=0, column=3)

lbl_espace0 = Label(fen, text='    ').grid(row=0, column=4)

lbl_nombre3 = Label(fen, text=' code_word_3').grid(row=0, column=5)

zone_de_saisie1 = Entry(fen, width=10)

zone_de_saisie1.grid(row=1, column=1)

zone_de_saisie2 = Entry(fen, width=10)

zone_de_saisie2.grid(row=1, column=3)

zone_de_saisie3 = Entry(fen, width=10)

zone_de_saisie3.grid(row=1, column=5)

lbl_trier = Label(fen, text='     ').grid(row=2, column=1)

mon_bouton_bulle = Button(fen, text='Dessiner',command=ajout_liste)

mon_bouton_bulle.grid(row=3, column=1)

lbl_espace0 = Label(fen, text='    ').grid(row=4, column=0)

# canevas de 500 pixels par 500  pixels

c = Canvas(fen, width="500", height="500", bg='white')

# positionnement canvas dans fenêtre

c.grid(row=5, column=1, rowspan=10, columnspan=10, sticky='NW')

# tour canevas en noir

c.create_rectangle( 2, 2, 500, 500, width=1, fill='white')

# grille pour dessiner le datamatrix

for x in range(10):

       # traits verticaux noirs

       c.create_line(x*50, 2, x*50,500, width=1, fill='black')

       # carrés noirs de la première ligne

       if x*100 < 500:

           c.create_rectangle( x*100, 0, 50 + x*100 , 50, width=1, fill='black')

for y in range(10):

       # traits horizontaux noirs

       c.create_line( 2, y*50, 500, y*50, width=1, fill='black')

       # carrés noirs de la dernière colonne

       if y*100 < 450:

           c.create_rectangle(450, y*100 + 50 , 500, y*100 + 100, width=1, fill='black')


# tour noir première colonne et dernière ligne

c.create_rectangle( 0, 0, 50, 500, width=1, fill='black')

c.create_rectangle( 0, 450, 500, 500, width=1, fill='black')

c.create_rectangle( 0, 450, 500, 500, width=1, fill='black')


# affichage fenetre et prise en compte des messages Windows

fen.mainloop()







Créé avec HelpNDoc Personal Edition: Produire facilement des livres électroniques Kindle