
Test
Dependencies: mbed LCD_DISCO_F469NI BSP_DISCO_F469NI
Revision 1:23e3deac03b1, committed 2022-03-05
- Comitter:
- dkm1978
- Date:
- Sat Mar 05 17:29:25 2022 +0000
- Parent:
- 0:dc8fbcb55376
- Commit message:
- q
Changed in this revision
--- a/BSP_DISCO_F469NI.lib Thu Mar 03 18:13:47 2022 +0000 +++ b/BSP_DISCO_F469NI.lib Sat Mar 05 17:29:25 2022 +0000 @@ -1,1 +1,1 @@ -https://developer.mbed.org/teams/ST/code/BSP_DISCO_F469NI/#27609b3a44ed +https://os.mbed.com/users/dkm1978/code/BSP_DISCO_F469NI/#bca478ba7b93
--- 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); + } }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/table.h Sat Mar 05 17:29:25 2022 +0000 @@ -0,0 +1,67 @@ +static const signed int sinus[] = +{ +0x000000C7, 0x00000256, 0x000003E5, 0x00000573, 0x00000700, 0x0000088C, 0x00000A16, 0x00000B9F, +0x00000D27, 0x00000EAC, 0x0000102F, 0x000011B0, 0x0000132D, 0x000014A8, 0x00001620, 0x00001794, +0x00001905, 0x00001A71, 0x00001BDA, 0x00001D3F, 0x00001E9E, 0x00001FFA, 0x00002150, 0x000022A1, +0x000023ED, 0x00002533, 0x00002673, 0x000027AE, 0x000028E2, 0x00002A10, 0x00002B38, 0x00002C59, +0x00002D73, 0x00002E86, 0x00002F92, 0x00003097, 0x00003194, 0x00003289, 0x00003377, 0x0000345D, +0x0000353A, 0x00003610, 0x000036DD, 0x000037A1, 0x0000385D, 0x00003911, 0x000039BB, 0x00003A5D, +0x00003AF6, 0x00003B85, 0x00003C0C, 0x00003C89, 0x00003CFD, 0x00003D67, 0x00003DC8, 0x00003E20, +0x00003E6D, 0x00003EB2, 0x00003EEC, 0x00003F1D, 0x00003F44, 0x00003F61, 0x00003F75, 0x00003F7F, +0x00003F7F, 0x00003F75, 0x00003F61, 0x00003F44, 0x00003F1D, 0x00003EEC, 0x00003EB2, 0x00003E6D, +0x00003E20, 0x00003DC8, 0x00003D67, 0x00003CFD, 0x00003C89, 0x00003C0C, 0x00003B85, 0x00003AF6, +0x00003A5D, 0x000039BB, 0x00003911, 0x0000385D, 0x000037A1, 0x000036DD, 0x00003610, 0x0000353A, +0x0000345D, 0x00003377, 0x00003289, 0x00003194, 0x00003097, 0x00002F92, 0x00002E86, 0x00002D73, +0x00002C59, 0x00002B38, 0x00002A10, 0x000028E2, 0x000027AE, 0x00002673, 0x00002533, 0x000023ED, +0x000022A1, 0x00002150, 0x00001FFA, 0x00001E9E, 0x00001D3F, 0x00001BDA, 0x00001A71, 0x00001905, +0x00001794, 0x00001620, 0x000014A8, 0x0000132D, 0x000011B0, 0x0000102F, 0x00000EAC, 0x00000D27, +0x00000B9F, 0x00000A16, 0x0000088C, 0x00000700, 0x00000573, 0x000003E5, 0x00000256, 0x000000C7, +0xFFFFFF39, 0xFFFFFDAA, 0xFFFFFC1B, 0xFFFFFA8D, 0xFFFFF900, 0xFFFFF774, 0xFFFFF5EA, 0xFFFFF461, +0xFFFFF2D9, 0xFFFFF154, 0xFFFFEFD1, 0xFFFFEE50, 0xFFFFECD3, 0xFFFFEB58, 0xFFFFE9E0, 0xFFFFE86C, +0xFFFFE6FB, 0xFFFFE58F, 0xFFFFE426, 0xFFFFE2C1, 0xFFFFE162, 0xFFFFE006, 0xFFFFDEB0, 0xFFFFDD5F, +0xFFFFDC13, 0xFFFFDACD, 0xFFFFD98D, 0xFFFFD852, 0xFFFFD71E, 0xFFFFD5F0, 0xFFFFD4C8, 0xFFFFD3A7, +0xFFFFD28D, 0xFFFFD17A, 0xFFFFD06E, 0xFFFFCF69, 0xFFFFCE6C, 0xFFFFCD77, 0xFFFFCC89, 0xFFFFCBA3, +0xFFFFCAC6, 0xFFFFC9F0, 0xFFFFC923, 0xFFFFC85F, 0xFFFFC7A3, 0xFFFFC6EF, 0xFFFFC645, 0xFFFFC5A3, +0xFFFFC50A, 0xFFFFC47B, 0xFFFFC3F4, 0xFFFFC377, 0xFFFFC303, 0xFFFFC299, 0xFFFFC238, 0xFFFFC1E0, +0xFFFFC193, 0xFFFFC14E, 0xFFFFC114, 0xFFFFC0E3, 0xFFFFC0BC, 0xFFFFC09F, 0xFFFFC08B, 0xFFFFC081, +0xFFFFC081, 0xFFFFC08B, 0xFFFFC09F, 0xFFFFC0BC, 0xFFFFC0E3, 0xFFFFC114, 0xFFFFC14E, 0xFFFFC193, +0xFFFFC1E0, 0xFFFFC238, 0xFFFFC299, 0xFFFFC303, 0xFFFFC377, 0xFFFFC3F4, 0xFFFFC47B, 0xFFFFC50A, +0xFFFFC5A3, 0xFFFFC645, 0xFFFFC6EF, 0xFFFFC7A3, 0xFFFFC85F, 0xFFFFC923, 0xFFFFC9F0, 0xFFFFCAC6, +0xFFFFCBA3, 0xFFFFCC89, 0xFFFFCD77, 0xFFFFCE6C, 0xFFFFCF69, 0xFFFFD06E, 0xFFFFD17A, 0xFFFFD28D, +0xFFFFD3A7, 0xFFFFD4C8, 0xFFFFD5F0, 0xFFFFD71E, 0xFFFFD852, 0xFFFFD98D, 0xFFFFDACD, 0xFFFFDC13, +0xFFFFDD5F, 0xFFFFDEB0, 0xFFFFE006, 0xFFFFE162, 0xFFFFE2C1, 0xFFFFE426, 0xFFFFE58F, 0xFFFFE6FB, +0xFFFFE86C, 0xFFFFE9E0, 0xFFFFEB58, 0xFFFFECD3, 0xFFFFEE50, 0xFFFFEFD1, 0xFFFFF154, 0xFFFFF2D9, +0xFFFFF461, 0xFFFFF5EA, 0xFFFFF774, 0xFFFFF900, 0xFFFFFA8D, 0xFFFFFC1B, 0xFFFFFDAA, 0xFFFFFF39, +0x000000C7, 0x00000256, 0x000003E5, 0x00000573, 0x00000700, 0x0000088C, 0x00000A16, 0x00000B9F, +0x00000D27, 0x00000EAC, 0x0000102F, 0x000011B0, 0x0000132D, 0x000014A8, 0x00001620, 0x00001794, +0x00001905, 0x00001A71, 0x00001BDA, 0x00001D3F, 0x00001E9E, 0x00001FFA, 0x00002150, 0x000022A1, +0x000023ED, 0x00002533, 0x00002673, 0x000027AE, 0x000028E2, 0x00002A10, 0x00002B38, 0x00002C59, +0x00002D73, 0x00002E86, 0x00002F92, 0x00003097, 0x00003194, 0x00003289, 0x00003377, 0x0000345D, +0x0000353A, 0x00003610, 0x000036DD, 0x000037A1, 0x0000385D, 0x00003911, 0x000039BB, 0x00003A5D, +0x00003AF6, 0x00003B85, 0x00003C0C, 0x00003C89, 0x00003CFD, 0x00003D67, 0x00003DC8, 0x00003E20, +0x00003E6D, 0x00003EB2, 0x00003EEC, 0x00003F1D, 0x00003F44, 0x00003F61, 0x00003F75, 0x00003F7F, +0x00003F7F, 0x00003F75, 0x00003F61, 0x00003F44, 0x00003F1D, 0x00003EEC, 0x00003EB2, 0x00003E6D, +0x00003E20, 0x00003DC8, 0x00003D67, 0x00003CFD, 0x00003C89, 0x00003C0C, 0x00003B85, 0x00003AF6, +0x00003A5D, 0x000039BB, 0x00003911, 0x0000385D, 0x000037A1, 0x000036DD, 0x00003610, 0x0000353A, +0x0000345D, 0x00003377, 0x00003289, 0x00003194, 0x00003097, 0x00002F92, 0x00002E86, 0x00002D73, +0x00002C59, 0x00002B38, 0x00002A10, 0x000028E2, 0x000027AE, 0x00002673, 0x00002533, 0x000023ED, +0x000022A1, 0x00002150, 0x00001FFA, 0x00001E9E, 0x00001D3F, 0x00001BDA, 0x00001A71, 0x00001905, +0x00001794, 0x00001620, 0x000014A8, 0x0000132D, 0x000011B0, 0x0000102F, 0x00000EAC, 0x00000D27, +0x00000B9F, 0x00000A16, 0x0000088C, 0x00000700, 0x00000573, 0x000003E5, 0x00000256, 0x000000C7, +0xFFFFFF39, 0xFFFFFDAA, 0xFFFFFC1B, 0xFFFFFA8D, 0xFFFFF900, 0xFFFFF774, 0xFFFFF5EA, 0xFFFFF461, +0xFFFFF2D9, 0xFFFFF154, 0xFFFFEFD1, 0xFFFFEE50, 0xFFFFECD3, 0xFFFFEB58, 0xFFFFE9E0, 0xFFFFE86C, +0xFFFFE6FB, 0xFFFFE58F, 0xFFFFE426, 0xFFFFE2C1, 0xFFFFE162, 0xFFFFE006, 0xFFFFDEB0, 0xFFFFDD5F, +0xFFFFDC13, 0xFFFFDACD, 0xFFFFD98D, 0xFFFFD852, 0xFFFFD71E, 0xFFFFD5F0, 0xFFFFD4C8, 0xFFFFD3A7, +0xFFFFD28D, 0xFFFFD17A, 0xFFFFD06E, 0xFFFFCF69, 0xFFFFCE6C, 0xFFFFCD77, 0xFFFFCC89, 0xFFFFCBA3, +0xFFFFCAC6, 0xFFFFC9F0, 0xFFFFC923, 0xFFFFC85F, 0xFFFFC7A3, 0xFFFFC6EF, 0xFFFFC645, 0xFFFFC5A3, +0xFFFFC50A, 0xFFFFC47B, 0xFFFFC3F4, 0xFFFFC377, 0xFFFFC303, 0xFFFFC299, 0xFFFFC238, 0xFFFFC1E0, +0xFFFFC193, 0xFFFFC14E, 0xFFFFC114, 0xFFFFC0E3, 0xFFFFC0BC, 0xFFFFC09F, 0xFFFFC08B, 0xFFFFC081, +0xFFFFC081, 0xFFFFC08B, 0xFFFFC09F, 0xFFFFC0BC, 0xFFFFC0E3, 0xFFFFC114, 0xFFFFC14E, 0xFFFFC193, +0xFFFFC1E0, 0xFFFFC238, 0xFFFFC299, 0xFFFFC303, 0xFFFFC377, 0xFFFFC3F4, 0xFFFFC47B, 0xFFFFC50A, +0xFFFFC5A3, 0xFFFFC645, 0xFFFFC6EF, 0xFFFFC7A3, 0xFFFFC85F, 0xFFFFC923, 0xFFFFC9F0, 0xFFFFCAC6, +0xFFFFCBA3, 0xFFFFCC89, 0xFFFFCD77, 0xFFFFCE6C, 0xFFFFCF69, 0xFFFFD06E, 0xFFFFD17A, 0xFFFFD28D, +0xFFFFD3A7, 0xFFFFD4C8, 0xFFFFD5F0, 0xFFFFD71E, 0xFFFFD852, 0xFFFFD98D, 0xFFFFDACD, 0xFFFFDC13, +0xFFFFDD5F, 0xFFFFDEB0, 0xFFFFE006, 0xFFFFE162, 0xFFFFE2C1, 0xFFFFE426, 0xFFFFE58F, 0xFFFFE6FB, +0xFFFFE86C, 0xFFFFE9E0, 0xFFFFEB58, 0xFFFFECD3, 0xFFFFEE50, 0xFFFFEFD1, 0xFFFFF154, 0xFFFFF2D9, +0xFFFFF461, 0xFFFFF5EA, 0xFFFFF774, 0xFFFFF900, 0xFFFFFA8D, 0xFFFFFC1B, 0xFFFFFDAA, 0xFFFFFF39, +}; // end of signed int My_Data_Table[]