Test

Dependencies:   mbed LCD_DISCO_F469NI BSP_DISCO_F469NI

Revision:
1:23e3deac03b1
Parent:
0:dc8fbcb55376
--- a/main.cpp	Thu Mar 03 18:13:47 2022 +0000
+++ b/main.cpp	Sat Mar 05 17:29:25 2022 +0000
@@ -1,50 +1,304 @@
+/*******************************************************************************/
+
 #include "mbed.h"
 #include "LCD_DISCO_F469NI.h"
+#include "table.h"
+
+/*******************************************************************************/
 
 LCD_DISCO_F469NI lcd;
+DigitalOut led1(LED1);
 
-DigitalOut led1(LED1);
+/*******************************************************************************/
+
+volatile uint8_t mat_A, mat_B, mat_C, mat_D, mat_E, mat_F ;
+
+uint8_t tb_fact1[4]; // circle prescale factors 4 circles top and 4 mirroring to bottom
+uint8_t tb_fact2[4]; //
+
+uint8_t multable[128][256]; // a prescale table
+
+uint8_t wynik_X[8]; // X poss first 8 plots
+uint8_t wynik_Y[8]; // Y poss first 8 plots
+
+uint8_t plot_1X[128]; // first buffer 128 plot X values
+uint8_t plot_1Y[128]; // first buffer 128 plot Y values
+uint8_t plot_2X[128]; // 2nd buffer 128 plot X values
+uint8_t plot_2Y[128]; // 2nd buffer 128 plot Y values
+
+void calculate_matrix()
+{
+    volatile uint8_t t1, t2, t3, t4, t5, t6, t7, t8, t9, t10 ;
+    static volatile uint16_t delta_x = 0x0100;
+    static volatile uint16_t delta_y = 0xff00;
+    static volatile uint16_t delta_z = 0xff00;
+    
+    static volatile uint16_t angle_x = 0x00;
+    static volatile uint16_t angle_y = 0x00;
+    static volatile uint16_t angle_z = 0x00;
+    
+    static volatile uint8_t sx;
+    static volatile uint8_t sy; 
+    static volatile uint8_t sz; 
+    
+    
+
+     /*    update_angles   */
+    angle_x = angle_x + delta_x;
+    angle_y = angle_y + delta_y;    
+    angle_z = angle_z + delta_z;
+    
+    sx = (uint8_t)  ((angle_x)>>8) & 0xFF;
+    sy = (uint8_t)  ((angle_y)>>8) & 0xFF;
+    sz = (uint8_t)  ((angle_z)>>8) & 0xFF;
+    
+    t1 = sy-sz;
+    t2 = sy+sz;
+    t3 = sx+sz;
+    t4 = sx-sz;
+    t5 = sx+sy+sz;
+    t6 = sx-sy+sz;
+    t7 = sx+sy-sz;
+    t8 = sy+sz-sx;  
+    t9  = sy-sx;
+    t10 = sy+sx;
+
+
+
+
+    mat_A = (uint8_t) ((sinus[64 + t1] + sinus[64 + t2]) >> 8) & 0xFF;
+    mat_B = (uint8_t) ((sinus[t1] - sinus[t2]) >> 8) & 0xFF;
+    mat_C = (uint8_t) ((sinus[128+sy] + sinus[128+sy]) >> 8) & 0xFF;
+    mat_D = (uint8_t) ((sinus[t3] - sinus[t4] +  ((sinus[64+t6] - sinus[64+t5] + sinus[64+t8] - sinus[64+t7]) / 2)) >> 8) & 0xFF;
+    mat_E = (uint8_t) ((sinus[64+t3] + sinus[64+t4] + ((sinus[t5] - sinus[t6] - sinus[t7] - sinus[t8]) / 2)) >> 8) & 0xFF;
+    mat_F = (uint8_t) ((sinus[128 + t9] - sinus[128 + t10]) >> 8) & 0xFF;
+
+
+
+}
+//====================================================================================================
+void insert_dots()
+{
+    volatile uint8_t i, i2, i3, dana, t9, t10, sx, sy, sz;
+    volatile uint8_t t_x;
+    volatile uint16_t wynik;
+
+    
+    t_x = 0x48;
+    i2 = 0;
+    for(i=3 ; i!=0xff ; i--)
+    {
+        t_x = t_x - 0x10;
+        sx = t_x & 0x3F;
+        sy = 0;
+        sz = 0;
+    
+//;---------------------
+//; F = invsin(t9)-invsin(t10)
+//;---------------------
+        t9  = sy-sx;
+        t10 = sy+sx;
+        mat_F = (uint8_t) ((sinus[128 + t9] - sinus[128 + t10]) >> 8) & 0xFF;
+
+#ifdef debug_matrix
+        printf("mat_F = 0x%X \n", mat_F);
+#endif
+
+        tb_fact1[i] = mat_F;
+        tb_fact2[i2] = tb_fact1[i];
+        i2++;
+    };
+    for(i=0 ; i<128 ; i++)
+    {
+        plot_1X[i];
+        plot_1Y[i];
+        plot_2X[i];
+        plot_2Y[i]; 
+    }
+    dana = 0;
+    for(i=0 ; i<128 ; i++)
+    {
+        wynik = 0;
+        i3 = 0;
+        for(i2=0 ; i2<128 ; i2++)
+        {
+            multable[i][i2] = (uint8_t) (((wynik) >> 8) & 0xFF);
+            wynik = wynik + dana;
+            i3--;
+            multable[i][i3] = (uint8_t)  (0 - multable[i][i2]);
+        }
+        dana = dana +2;
+    };
+}
+//===========================================================================
+void calc_all_dots_01()
+{
+    volatile uint8_t row1, row2, i, i2, i3;
+    volatile uint8_t add_x , add_y ;
+
+    i2 = 0;
+    for(i3 = 0; i3 < 4 ; i3++)  
+    {
+        row1 = tb_fact1[i3];
+        
+        add_x = multable[row1][mat_C];
+        add_y = multable[row1][mat_F];
+    
+        row2 = tb_fact2[i3];
+        
+    
+        for(i = 0; i < 8 ; i++)
+        {
+            plot_1X[i2]   = ((multable[row2][wynik_X[i]] + add_x) ^ 128);
+            plot_1X[i2+1] = (plot_1X[i2] ^ 255);
+            plot_1Y[i2]   = ((multable[row2][wynik_Y[i]] + add_y) ^ 128);
+            plot_1Y[i2+1] = (plot_1Y[i2] ^ 255);
+    
+            plot_1X[i2+2] = ((multable[row2][wynik_X[i]] - add_x) ^ 128);
+            plot_1X[i2+3] = (plot_1X[i2+2] ^ 255);
+            plot_1Y[i2+2] = ((multable[row2][wynik_Y[i]] - add_y) ^ 128);
+            plot_1Y[i2+3] = (plot_1Y[i2+2] ^ 255);
+            
+            i2 = i2 + 4;        
+        }
+    }
+}
+//================================================================================
+void calc_all_dots_02()
+{
+    volatile uint8_t row1, row2, i, i2, i3;
+    volatile uint8_t add_x , add_y ;
+    
+    i2 = 0;
+    // 4 times calculate and mirroring circles = 4*16*2 = 128 vectordots
+    for(i3 = 0; i3 < 4 ; i3++)  
+    {
+        row1 = tb_fact1[i3]; // prescale factor for X/Y offset data (add_x;add_y)
+        
+        add_x = multable[row1][mat_C]; // X offset  after prescale circle = possitoin X;Y 0;0
+        add_y = multable[row1][mat_F]; // Y offset  after prescale circle
+        
+        row2 = tb_fact2[i3]; // prescale factor for actual circle
+        
+        // calculate 32 X;Y values of plots in mirroring 2nd circles
+        for(i = 0; i < 8 ; i++)
+        {
+            plot_2X[i2]   = ((multable[row2][wynik_X[i]] + add_x) ^ 128);
+            plot_2X[i2+1] = (plot_2X[i2] ^ 255);
+            plot_2Y[i2]   = ((multable[row2][wynik_Y[i]] + add_y) ^ 128);
+            plot_2Y[i2+1] = (plot_2Y[i2] ^ 255);
+    
+            plot_2X[i2+2] = ((multable[row2][wynik_X[i]] - add_x) ^ 128);
+            plot_2X[i2+3] = (plot_2X[i2+2] ^ 255);
+            plot_2Y[i2+2] = ((multable[row2][wynik_Y[i]] - add_y) ^ 128);
+            plot_2Y[i2+3] = (plot_2Y[i2+2] ^ 255);
+            
+            i2 = i2 + 4;        
+        }
+    }
+}
+//==================================================================================
+void calculate_8_dots()
+{
+    volatile uint8_t row1, row2;
+    volatile uint8_t  v1, v2, v4, v5;
+    volatile uint8_t i, i2;
+    
+    // calculate first 8 dots to following prescale and mirroring
+    
+    i2 = 0;
+    for(i = 0 ; i < 4 ; i++)
+    {
+        
+        row1 = tb_fact1[i];
+        row2 = tb_fact2[i];
+        
+        v5 = multable[row1][mat_E];
+        v2 = multable[row1][mat_B];
+        v4 = multable[row2][mat_D];
+        v1 = multable[row2][mat_A];
+        
+        wynik_X[i2]   = v1 + v2;
+        wynik_Y[i2]   = v4 + v5;
+        wynik_X[i2+1] = v1 - v2;
+        wynik_Y[i2+1] = v4 - v5;    
+
+    #ifdef debug_matrix
+        printf("wynik_X[%d]  = 0x%X \n", i2   , wynik_X[i2]);
+        printf("wynik_Y[%d]  = 0x%X \n", i2   , wynik_Y[i2]);
+        printf("wynik_X[%d]  = 0x%X \n", i2+1 , wynik_X[i2+1]);
+        printf("wynik_Y[%d]  = 0x%X \n", i2+1 , wynik_Y[i2+1]);     
+    #endif
+    
+    #ifdef  show_first_pixels   
+        putpixel(wynik_X[i2]   ^ 128 , wynik_Y[i2]   ^ 128 , WHITE);
+        putpixel(wynik_X[i2+1] ^ 128 , wynik_Y[i2+1] ^ 128 , WHITE);            
+    #endif  
+/*
+ $7A $15 ; $7A $E7 ; $68 $42 ; $66 $BA
+ $46 $66 ; $42 $98 ; $19 $7A ; $15 $86
+*/  
+       i2 = i2 +2;
+    
+    }
+}
+
+
 
 int main()
 {    
     led1 = 1;
+     lcd.Clear(0);
+     lcd.SetTextColor(LCD_COLOR_WHITE);
+     int x, y, color, angle = 0;
+     uint8_t i, wait=10;
+     insert_dots();
+    
   
-    lcd.DisplayStringAt(0, LINE(1), (uint8_t *)"MBED EXAMPLE", CENTER_MODE);
-    wait(1);
+   
   
     while(1)
     {
-      lcd.Clear(LCD_COLOR_BLUE);
-      lcd.SetBackColor(LCD_COLOR_BLUE);
-      lcd.SetTextColor(LCD_COLOR_WHITE);
-      wait(0.3);
-      lcd.DisplayStringAt(0, LINE(4), (uint8_t *)"DISCOVERY", CENTER_MODE);
-      lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"STM32F469NI", CENTER_MODE);
-      wait(1);
+    
+        calculate_matrix();
+        calculate_8_dots();
+        calc_all_dots_01(); // store plots values in first buffer
+        
+        
+        // clear old plots
+        for(i = 0; i < 128 ; i++)
+            {
+                lcd.DrawPixel(plot_2X[i] +272  , plot_2Y[i]+112 , 0);
+            }
+        // set the new plots
+        for(i = 0; i < 128 ; i++)
+            {
+                 lcd.DrawPixel(plot_1X[i] +272  , plot_1Y[i]+112, LCD_COLOR_WHITE);
+            }
+    
+        calculate_matrix();
+        calculate_8_dots();
+        calc_all_dots_02(); // store plots values in 2nd buffer
+        wait_ms(10);
+        
+        // clear old plots
+        for(i = 0; i < 128 ; i++)
+            {
+                lcd.DrawPixel(plot_1X[i]+272   , plot_1Y[i]+112 , 0);
+            }
+        // set the new plots    
+        for(i = 0; i < 128 ; i++)
+            {
+                 lcd.DrawPixel(plot_2X[i]+272   , plot_2Y[i]+112 , LCD_COLOR_WHITE);
+            }
+   
+          while (!(LTDC->CDSR & LTDC_CDSR_VSYNCS));
 
-      lcd.Clear(LCD_COLOR_GREEN);
+
       
-      lcd.SetTextColor(LCD_COLOR_BLUE);
-      lcd.FillRect(10, 20, 50, 50);
-      wait(0.1);
-      lcd.SetTextColor(LCD_COLOR_BROWN);
-      lcd.FillCircle(80, 80, 50);
-      wait(0.1);
-      lcd.SetTextColor(LCD_COLOR_YELLOW);
-      lcd.FillEllipse(150, 150, 50, 100);
-      wait(0.1);
-      lcd.SetTextColor(LCD_COLOR_RED);
-      lcd.FillCircle(200, 200, 40);
-      wait(1);
-
-      lcd.SetBackColor(LCD_COLOR_ORANGE);
-      lcd.SetTextColor(LCD_COLOR_CYAN);
-      BSP_LCD_SetFont(&Font20);
-      lcd.DisplayStringAt(0, LINE(7), (uint8_t *)"HAVE FUN !!!", CENTER_MODE);
-      wait(1);
-
       led1 = !led1;
-      wait(0.5);
+      wait_ms(25);
+     
     }
 }