From 520a5b0291d8557cbe185de0b3e6580449679337 Mon Sep 17 00:00:00 2001
From: "michael.divia" <michael.divia@etu.hesge.ch>
Date: Fri, 21 Jun 2024 12:03:37 +0200
Subject: [PATCH] Scolling Text by Framebuf

---
 1 - Code/hl3.py              | 106 +++++++++++++----------------------
 1 - Code/main.py             |  14 +----
 2 - Reports/Michael_Divia.md |   6 +-
 3 files changed, 47 insertions(+), 79 deletions(-)

diff --git a/1 - Code/hl3.py b/1 - Code/hl3.py
index 9d23fbd..1fbe32d 100644
--- a/1 - Code/hl3.py	
+++ b/1 - Code/hl3.py	
@@ -2,6 +2,7 @@ from machine import Pin, UART
 from neopixel import NeoPixel
 from rp2 import PIO, StateMachine, asm_pio
 import utime
+import framebuf
 
 nb_line = 8
 nb_row = 8
@@ -236,35 +237,30 @@ class Matrix:
         
         return hex_Color
 
-def show_text(text, Color, speed):
+def rgb_to_rgb565(r, g, b):
+    return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3)
 
-    # Clear the screen
-    Matrix.clear(0)
+def rgb565_to_rgb(color):
+    r = (color >> 8) & 0xF8
+    g = (color >> 3) & 0xFC
+    b = (color << 3) & 0xF8
+    return (r, g, b)
 
-    width = 5
-    height = 8
-    h_offset = 8
-    spacewidth = 2
+def framebuffer_to_neopixel(fb):
+    for y in range(nb_line):
+        for x in range(nb_row):
+            color = fb.pixel(x, y)
+            np[y * nb_row + x] = rgb565_to_rgb(color)
+    np.write()
 
-    def printColumn(step, xpos, text):
-        if step < h_offset or step >= h_offset + len(text) * (width + spacewidth):
-            char = ' '
-            col = 0
-        else:
-            step -= h_offset
-            char = text[step // (width + spacewidth)]
-            col = step % (width + spacewidth)
-            if char not in __TEXT_DICT:
-                char = ' '
-        colbit = 1 << col
-        charMap = __TEXT_DICT[char]
-        for line in range(height):
-            Colored = len(charMap) > line and charMap[line] & colbit
-            Matrix.set_led(xpos, line, Color if Colored else 0)
-
-    for step in range(h_offset + len(text) * (width + spacewidth) + 1):
-        for i in range(nb_row):
-            printColumn(step + i, i, text)
+def show_text(text, color, speed=0.1):
+    color_rgb565 = rgb_to_rgb565(*color)
+    fb = framebuf.FrameBuffer(bytearray(nb_line * nb_row * 2), nb_row, nb_line, framebuf.RGB565)
+    
+    for offset in range(len(text) * 8):
+        fb.fill(0)
+        fb.text(text, -offset, 0, color_rgb565)
+        framebuffer_to_neopixel(fb)
         utime.sleep(speed)
 
 class Uart:
@@ -390,47 +386,23 @@ def christmas():
     Color = 0x3
     prime1=439
     prime2=17005013
-
-    masque_blanc= 0x0f0f0f   # setup LEDs intensity
-    masque_rouge=0x0f0000
-    masque_bleu=0x00000f
     
     period = .01
     
     # Balles glissantes
     for r in range(100):
+        temp = [[2,5],[1,6],[0,7],[0,7],[0,7],[0,7],[1,6],[2,5]]
         Color = (Color * prime1) % prime2
-        # horizontale et verticale
-        if Color&4 == 4:
-            for i in range(8):
-                temp = (4-int(abs(4.5-i))+1)
-                temp = max(3-2*int(temp/2),0)
-                for j in range(temp,8-temp):
-                    if (Color&3 == 0):
-                        diagonal=min(int((i+j)),7)
-                    elif (Color&3 == 1):
-                        Matrix.set_led(i,j, Color&masque_blanc)
-                    elif (Color&3 == 2):
-                        Matrix.set_led(7-i,j, Color&masque_blanc)
-                    else:
-                        Matrix.set_led(j,7-i, Color&masque_blanc)
-                utime.sleep(period)
-
-        # Diagonale
-        else:
-            for k in range(2,9):
-                for i in range(k+1):
-                    if (4.5-(k-i))**2+(4.5-i)**2 < 5**2:
-                        if (Color&3 == 0):
-                            Matrix.set_led((k-i),(i), Color&masque_blanc)
-                        elif (Color&3 == 1):
-                            Matrix.set_led((i),(k-i), Color&masque_blanc)
-                        elif (Color&3 == 2):
-                            Matrix.set_led((7-(k-i)),(i), Color&masque_blanc)
-                        else:
-                            Matrix.set_led((i),7-(k-i), Color&masque_blanc)
-                utime.sleep(period)
-
+        # Horizontale et Verticale
+        for i in range(8):
+            for j in range(temp[i][0],temp[i][-1]+1):
+                if (Color&3 == 1):
+                    Matrix.set_led(i,j, Color)
+                elif (Color&3 == 2):
+                    Matrix.set_led(7-i,j, Color)
+                else:
+                    Matrix.set_led(j,7-i, Color)
+            utime.sleep(period)
     
     # Clear the Matrix
     Matrix.clear(0)
@@ -441,7 +413,7 @@ def christmas():
         Color = (Color * prime1) % prime2
         for i in range(8):
             for j in range(8):
-                Matrix.set_led(j,i,Color*(i+1)*(j+11) & masque_blanc)
+                Matrix.set_led(j,i,Color*(i+1)*(j+11))
         utime.sleep(period)
         Matrix.clear(0)
         utime.sleep(period/10)
@@ -452,7 +424,7 @@ def christmas():
         Color = (Color * prime1) % prime2
         for i in range(8):
             for j in range(8):
-                Matrix.set_led(j,i,Color*(i+1)*(j+11) >> 4 & masque_bleu)
+                Matrix.set_led(j,i,Color*(i+1)*(j+11) >> 4)
         utime.sleep(period)
 
     # Couleurs aleatoire
@@ -461,7 +433,7 @@ def christmas():
         Color = (Color * prime1) % prime2
         for i in range(8):
             for j in range(8):
-                Matrix.set_led(j,i,Color*(i+1)*(j+11) & masque_blanc)
+                Matrix.set_led(j,i,Color*(i+1)*(j+11))
         utime.sleep(period)
 
     # Rouge aléatoire
@@ -470,7 +442,7 @@ def christmas():
         Color = (Color * prime1) % prime2
         for i in range(8):
             for j in range(8):
-                Matrix.set_led(j,i,Color*(i+1)*(j+11) & masque_rouge)
+                Matrix.set_led(j,i,Color*(i+1)*(j+11))
         utime.sleep(period)
 
     # Lignes 
@@ -478,10 +450,10 @@ def christmas():
     for r in range(20):
         Color = (Color * prime1) % prime2
         for i in range(8):
-            Matrix.set_led(Color%8,i,Color*(i+1)*(j+11) & masque_blanc)
+            Matrix.set_led(Color%8,i,Color*(i+1)*(j+11))
         utime.sleep(period)
         Matrix.clear(0)
         for i in range(8):
-            Matrix.set_led(i,Color%8,Color*(i+1)*(j+11) & masque_blanc)
+            Matrix.set_led(i,Color%8,Color*(i+1)*(j+11))
         utime.sleep(period)
         Matrix.clear(0)
diff --git a/1 - Code/main.py b/1 - Code/main.py
index bf68483..275030d 100644
--- a/1 - Code/main.py	
+++ b/1 - Code/main.py	
@@ -1,14 +1,6 @@
 from hl3 import *
 
-#uart_north = Uart(Direction.NORTH)
-#uart_south = Uart(Direction.SOUTH)
-uart_east = Uart(Direction.EAST, 9600)
-#uart_west = Uart(Direction.WEST)
-
-
 while True:
-    #uart_east.sendline("Pipo")
-    received_data = uart_east.receiveline()
-    #received_data = uart_north.receiveline()
-    print(f"Data received: {received_data}")
-    #utime.sleep(0.1)
+    show_text("PiPo", Color.RED, 0.03)
+    utime.sleep(0.1)
+    christmas()
diff --git a/2 - Reports/Michael_Divia.md b/2 - Reports/Michael_Divia.md
index 54be197..29bb7e3 100644
--- a/2 - Reports/Michael_Divia.md	
+++ b/2 - Reports/Michael_Divia.md	
@@ -61,6 +61,10 @@ Nous avons ensuite enchaîné avec la communication `UART` via les `GPIO`, pour
 
 Design et impression d'une boîte.
 
+## Vendredi 21 Juin 2024
+
+J'ai modifié la fonction d'affichage et de scrolling du texte afin d'utiliser un `FrameBuffer`. Cela accélère considérablement la vitesse de scolling.
+
 # Creators
 
 **Michael Divià**
@@ -71,4 +75,4 @@ Design et impression d'une boîte.
 
 Code and documentation copyright 2024 the authors. Code released under the [MIT License](https://gitedu.hesge.ch/michael.divia/hepialight3-pico/-/blob/94f8f25ac736165111a03ff964f1538a65eb40e3/LICENSE).
 
-Enjoy :metal:
\ No newline at end of file
+Enjoy :metal:
-- 
GitLab