diff --git a/src/index.html b/src/index.html new file mode 100644 index 0000000..10686fc --- /dev/null +++ b/src/index.html @@ -0,0 +1,43 @@ + + + + + + + Checkbox Example + + +
+
+ +
+
+ + \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 8edbbe0..a233924 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -55,139 +55,143 @@ bool gen_moi = false; unsigned long period_time = millis(); const char CAT_bits[] PROGMEM = { -0xc8, 0x7c, 0x7c, 0x00, 0xc8, 0x7c, 0x7c, 0x00, 0xc8, 0x7c, 0x7c, 0x00, 0xc8, 0x7c, 0x7c, 0x00, -0x88, 0xfc, 0x3c, 0x00, 0x70, 0xbc, 0x5c, 0x00, 0x70, 0xbc, 0x5c, 0x00, 0x08, 0x7c, 0x3c, 0x00, -0x88, 0xfc, 0x3c, 0x00, 0x88, 0xfc, 0x3c, 0x00, 0x88, 0xfc, 0x3c, 0x00, 0x88, 0xfc, 0x3c, 0x00, -0x08, 0x7c, 0x3c, 0x00, 0x50, 0x7c, 0x5c, 0x00, 0x08, 0xbc, 0x5c, 0x00, 0x48, 0xbc, 0xbc, 0x00, -0x48, 0xbc, 0xbc, 0x00, 0x48, 0xbc, 0xbc, 0x00, 0x28, 0x3c, 0xbc, 0x00, 0x48, 0xbc, 0xbc, 0x00, -0x48, 0xbc, 0xbc, 0x00, 0x68, 0x02, 0xbc, 0x00, 0x28, 0xfc, 0xfc, 0x00, 0xa8, 0x02, 0x02, 0x00, -0x28, 0xfc, 0xfc, 0x00, 0xff, 0x1f, 0x7f, 0x00, 0x85, 0x3b, 0x2b, 0x00, 0x5f, 0xcf, 0x9f, 0x00, -0x88, 0xfc, 0x3c, 0x00, 0x88, 0xfc, 0x3c, 0x00, 0x50, 0x7c, 0x5c, 0x00, 0x88, 0xfc, 0x3c, 0x00, -0xff, 0x2f, 0xef, 0x00, 0x01, 0x8d, 0xb9, 0x00, 0x3f, 0xcf, 0x9f, 0x00, 0x70, 0xbc, 0x5c, 0x00, -0x68, 0xfc, 0xfc, 0x00, 0x68, 0x02, 0x02, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x28, 0x3c, 0xbc, 0x00, -0x48, 0xbc, 0xbc, 0x00, 0x68, 0x02, 0x02, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0xa8, 0x02, 0x02, 0x00, -0x28, 0xfc, 0xfc, 0x00, 0x51, 0x59, 0x79, 0x00, 0xb3, 0x39, 0x02, 0x00, 0xfd, 0x99, 0xda, 0x00, -0xfe, 0x15, 0xd9, 0x00, 0xdd, 0x33, 0xa3, 0x00, 0xdd, 0x33, 0xa3, 0x00, 0x03, 0xd3, 0x13, 0x00, -0x93, 0x15, 0x86, 0x00, 0xe3, 0x41, 0x44, 0x00, 0xff, 0x8f, 0x9f, 0x00, 0x48, 0xbc, 0xbc, 0x00, -0x28, 0xfc, 0xfc, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0xa8, 0x3c, 0xbc, 0x00, -0x48, 0xbc, 0xbc, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x28, 0xfc, 0xfc, 0x00, -0xa8, 0x02, 0x02, 0x00, 0x88, 0xfc, 0x3c, 0x00, 0x25, 0x47, 0x0f, 0x00, 0x01, 0x95, 0x39, 0x00, -0x41, 0x15, 0xb9, 0x00, 0x21, 0x95, 0xf9, 0x00, 0x21, 0x55, 0xb9, 0x00, 0x21, 0x55, 0xb9, 0x00, -0x61, 0xd5, 0x39, 0x00, 0x95, 0x93, 0x23, 0x00, 0x08, 0xbc, 0x5c, 0x00, 0x28, 0x3c, 0xbc, 0x00, -0xa8, 0x7c, 0x7c, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x28, 0x3c, 0xbc, 0x00, -0x48, 0xbc, 0xbc, 0x00, 0x28, 0x7c, 0x82, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0xa8, 0x02, 0x02, 0x00, -0x68, 0xfc, 0xfc, 0x00, 0x88, 0xfc, 0x3c, 0x00, 0x08, 0xdc, 0x9c, 0x00, 0xc1, 0x95, 0x79, 0x00, -0x61, 0x35, 0x85, 0x00, 0x61, 0x35, 0x85, 0x00, 0x91, 0xf5, 0x25, 0x00, 0x61, 0x35, 0x85, 0x00, -0x61, 0xd5, 0x79, 0x00, 0x90, 0x9c, 0x1c, 0x00, 0x08, 0xbc, 0x5c, 0x00, 0xc8, 0x7c, 0x7c, 0x00, -0x28, 0xfc, 0xfc, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x28, 0x3c, 0xbc, 0x00, -0x48, 0xbc, 0xbc, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0x28, 0xfc, 0xfc, 0x00, -0x28, 0x7c, 0x82, 0x00, 0x88, 0xfc, 0x3c, 0x00, 0xb9, 0x3b, 0x97, 0x00, 0x7d, 0x0b, 0xd3, 0x00, -0xcb, 0x0c, 0xe7, 0x00, 0xff, 0xcf, 0xef, 0x00, 0x91, 0xf5, 0x25, 0x00, 0x2b, 0x0c, 0x67, 0x00, -0x6d, 0xf3, 0x33, 0x00, 0xa5, 0x47, 0x8f, 0x00, 0x70, 0xbc, 0x5c, 0x00, 0xc8, 0x7c, 0x7c, 0x00, -0x68, 0xfc, 0xfc, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x28, 0x3c, 0xbc, 0x00, -0x48, 0xbc, 0xbc, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0x28, 0xfc, 0xfc, 0x00, -0x28, 0xfc, 0xfc, 0x00, 0x08, 0x7c, 0xdc, 0x00, 0xcf, 0x0f, 0xcf, 0x00, 0x10, 0x10, 0x10, 0x00, -0x39, 0xdb, 0x57, 0x00, 0x7e, 0x69, 0xe3, 0x00, 0x21, 0xb5, 0xe5, 0x00, 0x1f, 0x1f, 0x1f, 0x00, -0xb0, 0x30, 0xd0, 0x00, 0x7f, 0x1f, 0x6f, 0x00, 0xf0, 0x02, 0x3c, 0x00, 0x28, 0xfc, 0xfc, 0x00, -0x68, 0xfc, 0xfc, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0x68, 0x3c, 0xbc, 0x00, 0x28, 0x3c, 0xbc, 0x00, -0x48, 0xbc, 0xbc, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0x28, 0xfc, 0xfc, 0x00, -0x28, 0xfc, 0xfc, 0x00, 0x48, 0x02, 0x7c, 0x00, 0xfe, 0x69, 0x29, 0x00, 0xe8, 0x28, 0x24, 0x00, -0x70, 0x30, 0x30, 0x00, 0x7c, 0xca, 0x90, 0x00, 0xdc, 0x6a, 0x90, 0x00, 0x70, 0x70, 0x70, 0x00, -0x90, 0xe0, 0x20, 0x00, 0xf9, 0x89, 0x75, 0x00, 0x88, 0x02, 0x3c, 0x00, 0x28, 0xfc, 0xfc, 0x00, -0xa8, 0x7c, 0x7c, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0x68, 0x3c, 0xbc, 0x00, 0x28, 0x3c, 0xbc, 0x00, -0x48, 0xbc, 0xbc, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x68, 0xfc, 0xfc, 0x00, -0x68, 0x42, 0x82, 0x00, 0xc8, 0x82, 0x02, 0x00, 0x08, 0x82, 0xbc, 0x00, 0x50, 0xbc, 0x1c, 0x00, -0x77, 0x77, 0xb7, 0x00, 0x2f, 0xb7, 0x17, 0x00, 0x8f, 0xb7, 0xa7, 0x00, 0x4f, 0x37, 0xd7, 0x00, -0x70, 0xc2, 0xbc, 0x00, 0x70, 0x82, 0xbc, 0x00, 0xc8, 0x82, 0x02, 0x00, 0x28, 0xfc, 0xfc, 0x00, -0xa8, 0x7c, 0x7c, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0xa8, 0x7c, 0x7c, 0x00, -0x48, 0xbc, 0xbc, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0xa8, 0x02, 0x02, 0x00, 0xa8, 0x02, 0x02, 0x00, -0xa8, 0x02, 0x02, 0x00, 0x88, 0x42, 0xfc, 0x00, 0xf0, 0x02, 0x3c, 0x00, 0xb1, 0x7c, 0x60, 0x00, -0x1c, 0xba, 0x79, 0x00, 0x99, 0x82, 0x40, 0x00, 0xd9, 0x82, 0x00, 0x00, 0x0c, 0xea, 0x59, 0x00, -0xc9, 0x7c, 0xa0, 0x00, 0x70, 0x82, 0xbc, 0x00, 0x88, 0xfc, 0x3c, 0x00, 0xa8, 0x02, 0x02, 0x00, -0xa8, 0x7c, 0x7c, 0x00, 0x28, 0x7c, 0x7c, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x28, 0x3c, 0xbc, 0x00, -0x48, 0xbc, 0xbc, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0x68, 0x02, 0x7c, 0x00, 0xa8, 0x02, 0x02, 0x00, -0x28, 0x7c, 0x82, 0x00, 0x88, 0x7c, 0x7c, 0x00, 0x1f, 0x2f, 0xef, 0x00, 0x44, 0x58, 0x6c, 0x00, -0x74, 0x2a, 0x99, 0x00, 0x99, 0x82, 0x40, 0x00, 0x99, 0x82, 0x40, 0x00, 0x8f, 0xcf, 0xaf, 0x00, -0x44, 0x58, 0xac, 0x00, 0x7f, 0x5f, 0xbf, 0x00, 0x88, 0xfc, 0x3c, 0x00, 0xa8, 0x7c, 0x7c, 0x00, -0xa8, 0x7c, 0x7c, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x28, 0x3c, 0xbc, 0x00, -0x48, 0xbc, 0xbc, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0xa8, 0x02, 0x02, 0x00, -0x88, 0xfc, 0x3c, 0x00, 0xf0, 0x02, 0x3c, 0x00, 0xa0, 0x60, 0x80, 0x00, 0xef, 0xcf, 0x4f, 0x00, -0xa7, 0xb7, 0x57, 0x00, 0x99, 0x82, 0x40, 0x00, 0x39, 0x42, 0x80, 0x00, 0x34, 0x2a, 0x59, 0x00, -0x59, 0xc9, 0x6d, 0x00, 0x60, 0x80, 0xc0, 0x00, 0x88, 0xfc, 0x3c, 0x00, 0x48, 0xbc, 0xbc, 0x00, -0xa8, 0x7c, 0x7c, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x28, 0x3c, 0xbc, 0x00, -0x48, 0xbc, 0xbc, 0x00, 0xa8, 0x02, 0x02, 0x00, 0xa8, 0x02, 0x02, 0x00, 0x28, 0xfc, 0xfc, 0x00, -0x88, 0xfc, 0x3c, 0x00, 0x7d, 0x8b, 0x63, 0x00, 0x1d, 0x8b, 0xc3, 0x00, 0x30, 0x82, 0xec, 0x00, -0xc1, 0xa6, 0xa6, 0x00, 0xc3, 0xe9, 0x2e, 0x00, 0xa3, 0x69, 0x2e, 0x00, 0xfe, 0x06, 0xa6, 0x00, -0x08, 0x42, 0xdc, 0x00, 0x3f, 0x4f, 0xcf, 0x00, 0xbf, 0x4f, 0x4f, 0x00, 0x08, 0xbc, 0xdc, 0x00, -0xa8, 0xbc, 0x7c, 0x00, 0xa8, 0xfc, 0x7c, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0xa8, 0xbc, 0x7c, 0x00, -0x48, 0xbc, 0xbc, 0x00, 0xa8, 0x02, 0x02, 0x00, 0x28, 0x02, 0x7c, 0x00, 0x28, 0xfc, 0xfc, 0x00, -0x70, 0x7c, 0xdc, 0x00, 0xe1, 0xad, 0x79, 0x00, 0x21, 0x2d, 0x39, 0x00, 0x01, 0x99, 0xc9, 0x00, -0xbc, 0x86, 0x99, 0x00, 0xbc, 0x46, 0x69, 0x00, 0x3c, 0x86, 0xa9, 0x00, 0xbc, 0x06, 0x59, 0x00, -0xc4, 0x72, 0xd6, 0x00, 0x21, 0x6d, 0x99, 0x00, 0xe1, 0x2d, 0x39, 0x00, 0x3f, 0x0f, 0x4f, 0x00, -0x48, 0xbc, 0xbc, 0x00, 0xc8, 0xfc, 0xbc, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0xa8, 0x7c, 0x7c, 0x00, -0xa8, 0x7c, 0x7c, 0x00, 0xa8, 0x02, 0x02, 0x00, 0x28, 0xfc, 0xfc, 0x00, 0x88, 0xfc, 0x3c, 0x00, -0xc8, 0xfc, 0x3c, 0x00, 0x6f, 0xf7, 0x0f, 0x00, 0x50, 0x2c, 0x4c, 0x00, 0x99, 0x55, 0x03, 0x00, -0xbc, 0xc6, 0xa9, 0x00, 0xbc, 0x46, 0xe9, 0x00, 0xbc, 0xc6, 0xa9, 0x00, 0x7c, 0xc6, 0x19, 0x00, -0xf9, 0xd5, 0xe3, 0x00, 0x08, 0xbc, 0x5c, 0x00, 0xfd, 0x97, 0xb7, 0x00, 0x70, 0xbc, 0x5c, 0x00, -0x48, 0xbc, 0xbc, 0x00, 0xc8, 0x7c, 0x7c, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x68, 0x3c, 0xbc, 0x00, -0x48, 0xbc, 0xbc, 0x00, 0xa8, 0x02, 0x02, 0x00, 0xa8, 0x02, 0x02, 0x00, 0x88, 0xfc, 0x3c, 0x00, -0x90, 0x00, 0x80, 0x00, 0x61, 0x85, 0x1b, 0x00, 0xe5, 0xcb, 0x07, 0x00, 0xdc, 0x7a, 0x69, 0x00, -0x7c, 0x86, 0x29, 0x00, 0x7e, 0x19, 0x53, 0x00, 0x7e, 0x19, 0x53, 0x00, 0xbc, 0xc6, 0xa9, 0x00, -0xdc, 0x7a, 0xe9, 0x00, 0x70, 0xbc, 0x5c, 0x00, 0x48, 0xbc, 0xbc, 0x00, 0x48, 0xbc, 0xbc, 0x00, -0x68, 0xfc, 0xfc, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x28, 0x3c, 0xbc, 0x00, -0x48, 0xbc, 0xbc, 0x00, 0xa8, 0x02, 0x02, 0x00, 0xa8, 0x02, 0x02, 0x00, 0x88, 0xfc, 0x3c, 0x00, -0x70, 0x7c, 0xdc, 0x00, 0x59, 0xbb, 0x97, 0x00, 0xb0, 0x82, 0xdc, 0x00, 0xdd, 0x43, 0x07, 0x00, -0x6e, 0xf1, 0xd3, 0x00, 0x1e, 0xc9, 0xd3, 0x00, 0xde, 0x19, 0x53, 0x00, 0x7e, 0x19, 0x53, 0x00, -0x5d, 0x63, 0x07, 0x00, 0x08, 0xfc, 0x9c, 0x00, 0x28, 0xfc, 0xfc, 0x00, 0x68, 0xfc, 0xfc, 0x00, -0xa8, 0x7c, 0x7c, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x28, 0x3c, 0xbc, 0x00, -0x48, 0xbc, 0xbc, 0x00, 0x28, 0xfc, 0xfc, 0x00, 0xa8, 0x02, 0x02, 0x00, 0xa8, 0x02, 0x02, 0x00, -0xc8, 0x82, 0x02, 0x00, 0x28, 0x82, 0x02, 0x00, 0x48, 0x42, 0xfc, 0x00, 0x33, 0x2b, 0x27, 0x00, -0x33, 0xf5, 0x81, 0x00, 0xa8, 0xe2, 0xbc, 0x00, 0x98, 0xe2, 0x42, 0x00, 0xd9, 0xc9, 0x6a, 0x00, -0x47, 0x8f, 0x37, 0x00, 0x88, 0xfc, 0x3c, 0x00, 0xc8, 0x7c, 0x7c, 0x00, 0x68, 0xfc, 0xfc, 0x00, -0xa8, 0x7c, 0x7c, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x28, 0x3c, 0xbc, 0x00, -0xa8, 0x7c, 0x7c, 0x00, 0xa8, 0x02, 0x02, 0x00, 0xa8, 0x02, 0x02, 0x00, 0xa8, 0x02, 0x02, 0x00, -0x68, 0x42, 0x82, 0x00, 0xc8, 0x42, 0xfc, 0x00, 0x70, 0x82, 0xbc, 0x00, 0x46, 0x82, 0x98, 0x00, -0xf1, 0x1d, 0x25, 0x00, 0x58, 0xe2, 0x42, 0x00, 0xe8, 0x12, 0x22, 0x00, 0xa9, 0x83, 0xa5, 0x00, -0xc6, 0x82, 0x98, 0x00, 0x48, 0x02, 0xbc, 0x00, 0x88, 0xfc, 0x3c, 0x00, 0x68, 0xfc, 0xfc, 0x00, -0x68, 0xfc, 0xfc, 0x00, 0x68, 0x02, 0x7c, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x68, 0x3c, 0xbc, 0x00, -0x48, 0xbc, 0xbc, 0x00, 0x28, 0xfc, 0xfc, 0x00, 0x28, 0xfc, 0xfc, 0x00, 0x88, 0xfc, 0x3c, 0x00, -0x28, 0xfc, 0xfc, 0x00, 0xc8, 0x82, 0x02, 0x00, 0x30, 0xc2, 0xfc, 0x00, 0xff, 0x5f, 0x7f, 0x00, -0xc8, 0x22, 0x82, 0x00, 0xe8, 0xe2, 0x62, 0x00, 0xe8, 0xe2, 0x62, 0x00, 0xa8, 0xa2, 0xfc, 0x00, -0x7f, 0x3f, 0xbf, 0x00, 0x08, 0x82, 0xbc, 0x00, 0xc8, 0x82, 0x02, 0x00, 0xa8, 0x7c, 0x7c, 0x00, -0xc8, 0x7c, 0x7c, 0x00, 0xc8, 0x7c, 0x7c, 0x00, 0x28, 0x3c, 0x7c, 0x00, 0x28, 0x3c, 0xbc, 0x00 -}; -uint32_t rgb565_to_rgb888(uint16_t rgb565) { - // Tách các kênh màu từ giá trị RGB565 - uint8_t r = (rgb565 >> 11) & 0x1F; // 5 bit cho đỏ - uint8_t g = (rgb565 >> 5) & 0x3F; // 6 bit cho xanh lục - uint8_t b = rgb565 & 0x1F; // 5 bit cho xanh dương - - // Chuyển đổi các kênh màu từ 5/6 bit sang 8 bit - r = (r * 255 + 15) / 31; // Chuyển đổi từ 5 bit sang 8 bit - g = (g * 255 + 31) / 63; // Chuyển đổi từ 6 bit sang 8 bit - b = (b * 255 + 15) / 31; // Chuyển đổi từ 5 bit sang 8 bit - - // Ghép các giá trị RGB888 thành một giá trị 32 bit - return (r << 16) | (g << 8) | b; -} -void drawXbm565(int x, int y, int width, int height, const char *xbm, uint16_t color = 0xffff) + 0xc8, 0x7c, 0x7c, 0x00, 0xc8, 0x7c, 0x7c, 0x00, 0xc8, 0x7c, 0x7c, 0x00, 0xc8, 0x7c, 0x7c, 0x00, + 0x88, 0xfc, 0x3c, 0x00, 0x70, 0xbc, 0x5c, 0x00, 0x70, 0xbc, 0x5c, 0x00, 0x08, 0x7c, 0x3c, 0x00, + 0x88, 0xfc, 0x3c, 0x00, 0x88, 0xfc, 0x3c, 0x00, 0x88, 0xfc, 0x3c, 0x00, 0x88, 0xfc, 0x3c, 0x00, + 0x08, 0x7c, 0x3c, 0x00, 0x50, 0x7c, 0x5c, 0x00, 0x08, 0xbc, 0x5c, 0x00, 0x48, 0xbc, 0xbc, 0x00, + 0x48, 0xbc, 0xbc, 0x00, 0x48, 0xbc, 0xbc, 0x00, 0x28, 0x3c, 0xbc, 0x00, 0x48, 0xbc, 0xbc, 0x00, + 0x48, 0xbc, 0xbc, 0x00, 0x68, 0x02, 0xbc, 0x00, 0x28, 0xfc, 0xfc, 0x00, 0xa8, 0x02, 0x02, 0x00, + 0x28, 0xfc, 0xfc, 0x00, 0xff, 0x1f, 0x7f, 0x00, 0x85, 0x3b, 0x2b, 0x00, 0x5f, 0xcf, 0x9f, 0x00, + 0x88, 0xfc, 0x3c, 0x00, 0x88, 0xfc, 0x3c, 0x00, 0x50, 0x7c, 0x5c, 0x00, 0x88, 0xfc, 0x3c, 0x00, + 0xff, 0x2f, 0xef, 0x00, 0x01, 0x8d, 0xb9, 0x00, 0x3f, 0xcf, 0x9f, 0x00, 0x70, 0xbc, 0x5c, 0x00, + 0x68, 0xfc, 0xfc, 0x00, 0x68, 0x02, 0x02, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x28, 0x3c, 0xbc, 0x00, + 0x48, 0xbc, 0xbc, 0x00, 0x68, 0x02, 0x02, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0xa8, 0x02, 0x02, 0x00, + 0x28, 0xfc, 0xfc, 0x00, 0x51, 0x59, 0x79, 0x00, 0xb3, 0x39, 0x02, 0x00, 0xfd, 0x99, 0xda, 0x00, + 0xfe, 0x15, 0xd9, 0x00, 0xdd, 0x33, 0xa3, 0x00, 0xdd, 0x33, 0xa3, 0x00, 0x03, 0xd3, 0x13, 0x00, + 0x93, 0x15, 0x86, 0x00, 0xe3, 0x41, 0x44, 0x00, 0xff, 0x8f, 0x9f, 0x00, 0x48, 0xbc, 0xbc, 0x00, + 0x28, 0xfc, 0xfc, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0xa8, 0x3c, 0xbc, 0x00, + 0x48, 0xbc, 0xbc, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x28, 0xfc, 0xfc, 0x00, + 0xa8, 0x02, 0x02, 0x00, 0x88, 0xfc, 0x3c, 0x00, 0x25, 0x47, 0x0f, 0x00, 0x01, 0x95, 0x39, 0x00, + 0x41, 0x15, 0xb9, 0x00, 0x21, 0x95, 0xf9, 0x00, 0x21, 0x55, 0xb9, 0x00, 0x21, 0x55, 0xb9, 0x00, + 0x61, 0xd5, 0x39, 0x00, 0x95, 0x93, 0x23, 0x00, 0x08, 0xbc, 0x5c, 0x00, 0x28, 0x3c, 0xbc, 0x00, + 0xa8, 0x7c, 0x7c, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x28, 0x3c, 0xbc, 0x00, + 0x48, 0xbc, 0xbc, 0x00, 0x28, 0x7c, 0x82, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0xa8, 0x02, 0x02, 0x00, + 0x68, 0xfc, 0xfc, 0x00, 0x88, 0xfc, 0x3c, 0x00, 0x08, 0xdc, 0x9c, 0x00, 0xc1, 0x95, 0x79, 0x00, + 0x61, 0x35, 0x85, 0x00, 0x61, 0x35, 0x85, 0x00, 0x91, 0xf5, 0x25, 0x00, 0x61, 0x35, 0x85, 0x00, + 0x61, 0xd5, 0x79, 0x00, 0x90, 0x9c, 0x1c, 0x00, 0x08, 0xbc, 0x5c, 0x00, 0xc8, 0x7c, 0x7c, 0x00, + 0x28, 0xfc, 0xfc, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x28, 0x3c, 0xbc, 0x00, + 0x48, 0xbc, 0xbc, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0x28, 0xfc, 0xfc, 0x00, + 0x28, 0x7c, 0x82, 0x00, 0x88, 0xfc, 0x3c, 0x00, 0xb9, 0x3b, 0x97, 0x00, 0x7d, 0x0b, 0xd3, 0x00, + 0xcb, 0x0c, 0xe7, 0x00, 0xff, 0xcf, 0xef, 0x00, 0x91, 0xf5, 0x25, 0x00, 0x2b, 0x0c, 0x67, 0x00, + 0x6d, 0xf3, 0x33, 0x00, 0xa5, 0x47, 0x8f, 0x00, 0x70, 0xbc, 0x5c, 0x00, 0xc8, 0x7c, 0x7c, 0x00, + 0x68, 0xfc, 0xfc, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x28, 0x3c, 0xbc, 0x00, + 0x48, 0xbc, 0xbc, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0x28, 0xfc, 0xfc, 0x00, + 0x28, 0xfc, 0xfc, 0x00, 0x08, 0x7c, 0xdc, 0x00, 0xcf, 0x0f, 0xcf, 0x00, 0x10, 0x10, 0x10, 0x00, + 0x39, 0xdb, 0x57, 0x00, 0x7e, 0x69, 0xe3, 0x00, 0x21, 0xb5, 0xe5, 0x00, 0x1f, 0x1f, 0x1f, 0x00, + 0xb0, 0x30, 0xd0, 0x00, 0x7f, 0x1f, 0x6f, 0x00, 0xf0, 0x02, 0x3c, 0x00, 0x28, 0xfc, 0xfc, 0x00, + 0x68, 0xfc, 0xfc, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0x68, 0x3c, 0xbc, 0x00, 0x28, 0x3c, 0xbc, 0x00, + 0x48, 0xbc, 0xbc, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0x28, 0xfc, 0xfc, 0x00, + 0x28, 0xfc, 0xfc, 0x00, 0x48, 0x02, 0x7c, 0x00, 0xfe, 0x69, 0x29, 0x00, 0xe8, 0x28, 0x24, 0x00, + 0x70, 0x30, 0x30, 0x00, 0x7c, 0xca, 0x90, 0x00, 0xdc, 0x6a, 0x90, 0x00, 0x70, 0x70, 0x70, 0x00, + 0x90, 0xe0, 0x20, 0x00, 0xf9, 0x89, 0x75, 0x00, 0x88, 0x02, 0x3c, 0x00, 0x28, 0xfc, 0xfc, 0x00, + 0xa8, 0x7c, 0x7c, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0x68, 0x3c, 0xbc, 0x00, 0x28, 0x3c, 0xbc, 0x00, + 0x48, 0xbc, 0xbc, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x68, 0xfc, 0xfc, 0x00, + 0x68, 0x42, 0x82, 0x00, 0xc8, 0x82, 0x02, 0x00, 0x08, 0x82, 0xbc, 0x00, 0x50, 0xbc, 0x1c, 0x00, + 0x77, 0x77, 0xb7, 0x00, 0x2f, 0xb7, 0x17, 0x00, 0x8f, 0xb7, 0xa7, 0x00, 0x4f, 0x37, 0xd7, 0x00, + 0x70, 0xc2, 0xbc, 0x00, 0x70, 0x82, 0xbc, 0x00, 0xc8, 0x82, 0x02, 0x00, 0x28, 0xfc, 0xfc, 0x00, + 0xa8, 0x7c, 0x7c, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0xa8, 0x7c, 0x7c, 0x00, + 0x48, 0xbc, 0xbc, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0xa8, 0x02, 0x02, 0x00, 0xa8, 0x02, 0x02, 0x00, + 0xa8, 0x02, 0x02, 0x00, 0x88, 0x42, 0xfc, 0x00, 0xf0, 0x02, 0x3c, 0x00, 0xb1, 0x7c, 0x60, 0x00, + 0x1c, 0xba, 0x79, 0x00, 0x99, 0x82, 0x40, 0x00, 0xd9, 0x82, 0x00, 0x00, 0x0c, 0xea, 0x59, 0x00, + 0xc9, 0x7c, 0xa0, 0x00, 0x70, 0x82, 0xbc, 0x00, 0x88, 0xfc, 0x3c, 0x00, 0xa8, 0x02, 0x02, 0x00, + 0xa8, 0x7c, 0x7c, 0x00, 0x28, 0x7c, 0x7c, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x28, 0x3c, 0xbc, 0x00, + 0x48, 0xbc, 0xbc, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0x68, 0x02, 0x7c, 0x00, 0xa8, 0x02, 0x02, 0x00, + 0x28, 0x7c, 0x82, 0x00, 0x88, 0x7c, 0x7c, 0x00, 0x1f, 0x2f, 0xef, 0x00, 0x44, 0x58, 0x6c, 0x00, + 0x74, 0x2a, 0x99, 0x00, 0x99, 0x82, 0x40, 0x00, 0x99, 0x82, 0x40, 0x00, 0x8f, 0xcf, 0xaf, 0x00, + 0x44, 0x58, 0xac, 0x00, 0x7f, 0x5f, 0xbf, 0x00, 0x88, 0xfc, 0x3c, 0x00, 0xa8, 0x7c, 0x7c, 0x00, + 0xa8, 0x7c, 0x7c, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x28, 0x3c, 0xbc, 0x00, + 0x48, 0xbc, 0xbc, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0xa8, 0x02, 0x02, 0x00, + 0x88, 0xfc, 0x3c, 0x00, 0xf0, 0x02, 0x3c, 0x00, 0xa0, 0x60, 0x80, 0x00, 0xef, 0xcf, 0x4f, 0x00, + 0xa7, 0xb7, 0x57, 0x00, 0x99, 0x82, 0x40, 0x00, 0x39, 0x42, 0x80, 0x00, 0x34, 0x2a, 0x59, 0x00, + 0x59, 0xc9, 0x6d, 0x00, 0x60, 0x80, 0xc0, 0x00, 0x88, 0xfc, 0x3c, 0x00, 0x48, 0xbc, 0xbc, 0x00, + 0xa8, 0x7c, 0x7c, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x28, 0x3c, 0xbc, 0x00, + 0x48, 0xbc, 0xbc, 0x00, 0xa8, 0x02, 0x02, 0x00, 0xa8, 0x02, 0x02, 0x00, 0x28, 0xfc, 0xfc, 0x00, + 0x88, 0xfc, 0x3c, 0x00, 0x7d, 0x8b, 0x63, 0x00, 0x1d, 0x8b, 0xc3, 0x00, 0x30, 0x82, 0xec, 0x00, + 0xc1, 0xa6, 0xa6, 0x00, 0xc3, 0xe9, 0x2e, 0x00, 0xa3, 0x69, 0x2e, 0x00, 0xfe, 0x06, 0xa6, 0x00, + 0x08, 0x42, 0xdc, 0x00, 0x3f, 0x4f, 0xcf, 0x00, 0xbf, 0x4f, 0x4f, 0x00, 0x08, 0xbc, 0xdc, 0x00, + 0xa8, 0xbc, 0x7c, 0x00, 0xa8, 0xfc, 0x7c, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0xa8, 0xbc, 0x7c, 0x00, + 0x48, 0xbc, 0xbc, 0x00, 0xa8, 0x02, 0x02, 0x00, 0x28, 0x02, 0x7c, 0x00, 0x28, 0xfc, 0xfc, 0x00, + 0x70, 0x7c, 0xdc, 0x00, 0xe1, 0xad, 0x79, 0x00, 0x21, 0x2d, 0x39, 0x00, 0x01, 0x99, 0xc9, 0x00, + 0xbc, 0x86, 0x99, 0x00, 0xbc, 0x46, 0x69, 0x00, 0x3c, 0x86, 0xa9, 0x00, 0xbc, 0x06, 0x59, 0x00, + 0xc4, 0x72, 0xd6, 0x00, 0x21, 0x6d, 0x99, 0x00, 0xe1, 0x2d, 0x39, 0x00, 0x3f, 0x0f, 0x4f, 0x00, + 0x48, 0xbc, 0xbc, 0x00, 0xc8, 0xfc, 0xbc, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0xa8, 0x7c, 0x7c, 0x00, + 0xa8, 0x7c, 0x7c, 0x00, 0xa8, 0x02, 0x02, 0x00, 0x28, 0xfc, 0xfc, 0x00, 0x88, 0xfc, 0x3c, 0x00, + 0xc8, 0xfc, 0x3c, 0x00, 0x6f, 0xf7, 0x0f, 0x00, 0x50, 0x2c, 0x4c, 0x00, 0x99, 0x55, 0x03, 0x00, + 0xbc, 0xc6, 0xa9, 0x00, 0xbc, 0x46, 0xe9, 0x00, 0xbc, 0xc6, 0xa9, 0x00, 0x7c, 0xc6, 0x19, 0x00, + 0xf9, 0xd5, 0xe3, 0x00, 0x08, 0xbc, 0x5c, 0x00, 0xfd, 0x97, 0xb7, 0x00, 0x70, 0xbc, 0x5c, 0x00, + 0x48, 0xbc, 0xbc, 0x00, 0xc8, 0x7c, 0x7c, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x68, 0x3c, 0xbc, 0x00, + 0x48, 0xbc, 0xbc, 0x00, 0xa8, 0x02, 0x02, 0x00, 0xa8, 0x02, 0x02, 0x00, 0x88, 0xfc, 0x3c, 0x00, + 0x90, 0x00, 0x80, 0x00, 0x61, 0x85, 0x1b, 0x00, 0xe5, 0xcb, 0x07, 0x00, 0xdc, 0x7a, 0x69, 0x00, + 0x7c, 0x86, 0x29, 0x00, 0x7e, 0x19, 0x53, 0x00, 0x7e, 0x19, 0x53, 0x00, 0xbc, 0xc6, 0xa9, 0x00, + 0xdc, 0x7a, 0xe9, 0x00, 0x70, 0xbc, 0x5c, 0x00, 0x48, 0xbc, 0xbc, 0x00, 0x48, 0xbc, 0xbc, 0x00, + 0x68, 0xfc, 0xfc, 0x00, 0xa8, 0x7c, 0x7c, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x28, 0x3c, 0xbc, 0x00, + 0x48, 0xbc, 0xbc, 0x00, 0xa8, 0x02, 0x02, 0x00, 0xa8, 0x02, 0x02, 0x00, 0x88, 0xfc, 0x3c, 0x00, + 0x70, 0x7c, 0xdc, 0x00, 0x59, 0xbb, 0x97, 0x00, 0xb0, 0x82, 0xdc, 0x00, 0xdd, 0x43, 0x07, 0x00, + 0x6e, 0xf1, 0xd3, 0x00, 0x1e, 0xc9, 0xd3, 0x00, 0xde, 0x19, 0x53, 0x00, 0x7e, 0x19, 0x53, 0x00, + 0x5d, 0x63, 0x07, 0x00, 0x08, 0xfc, 0x9c, 0x00, 0x28, 0xfc, 0xfc, 0x00, 0x68, 0xfc, 0xfc, 0x00, + 0xa8, 0x7c, 0x7c, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x28, 0x3c, 0xbc, 0x00, + 0x48, 0xbc, 0xbc, 0x00, 0x28, 0xfc, 0xfc, 0x00, 0xa8, 0x02, 0x02, 0x00, 0xa8, 0x02, 0x02, 0x00, + 0xc8, 0x82, 0x02, 0x00, 0x28, 0x82, 0x02, 0x00, 0x48, 0x42, 0xfc, 0x00, 0x33, 0x2b, 0x27, 0x00, + 0x33, 0xf5, 0x81, 0x00, 0xa8, 0xe2, 0xbc, 0x00, 0x98, 0xe2, 0x42, 0x00, 0xd9, 0xc9, 0x6a, 0x00, + 0x47, 0x8f, 0x37, 0x00, 0x88, 0xfc, 0x3c, 0x00, 0xc8, 0x7c, 0x7c, 0x00, 0x68, 0xfc, 0xfc, 0x00, + 0xa8, 0x7c, 0x7c, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x28, 0x3c, 0xbc, 0x00, + 0xa8, 0x7c, 0x7c, 0x00, 0xa8, 0x02, 0x02, 0x00, 0xa8, 0x02, 0x02, 0x00, 0xa8, 0x02, 0x02, 0x00, + 0x68, 0x42, 0x82, 0x00, 0xc8, 0x42, 0xfc, 0x00, 0x70, 0x82, 0xbc, 0x00, 0x46, 0x82, 0x98, 0x00, + 0xf1, 0x1d, 0x25, 0x00, 0x58, 0xe2, 0x42, 0x00, 0xe8, 0x12, 0x22, 0x00, 0xa9, 0x83, 0xa5, 0x00, + 0xc6, 0x82, 0x98, 0x00, 0x48, 0x02, 0xbc, 0x00, 0x88, 0xfc, 0x3c, 0x00, 0x68, 0xfc, 0xfc, 0x00, + 0x68, 0xfc, 0xfc, 0x00, 0x68, 0x02, 0x7c, 0x00, 0x68, 0xfc, 0xfc, 0x00, 0x68, 0x3c, 0xbc, 0x00, + 0x48, 0xbc, 0xbc, 0x00, 0x28, 0xfc, 0xfc, 0x00, 0x28, 0xfc, 0xfc, 0x00, 0x88, 0xfc, 0x3c, 0x00, + 0x28, 0xfc, 0xfc, 0x00, 0xc8, 0x82, 0x02, 0x00, 0x30, 0xc2, 0xfc, 0x00, 0xff, 0x5f, 0x7f, 0x00, + 0xc8, 0x22, 0x82, 0x00, 0xe8, 0xe2, 0x62, 0x00, 0xe8, 0xe2, 0x62, 0x00, 0xa8, 0xa2, 0xfc, 0x00, + 0x7f, 0x3f, 0xbf, 0x00, 0x08, 0x82, 0xbc, 0x00, 0xc8, 0x82, 0x02, 0x00, 0xa8, 0x7c, 0x7c, 0x00, + 0xc8, 0x7c, 0x7c, 0x00, 0xc8, 0x7c, 0x7c, 0x00, 0x28, 0x3c, 0x7c, 0x00, 0x28, 0x3c, 0xbc, 0x00}; +uint32_t rgb565_to_rgb888(uint16_t rgb565) { - if (width % 8 != 0) { - width = ((width / 8) + 1) * 8; + // Tách các kênh màu từ giá trị RGB565 + uint8_t r = (rgb565 >> 11) & 0x1F; // 5 bit cho đỏ + uint8_t g = (rgb565 >> 5) & 0x3F; // 6 bit cho xanh lục + uint8_t b = rgb565 & 0x1F; // 5 bit cho xanh dương + + // Chuyển đổi các kênh màu từ 5/6 bit sang 8 bit + r = (r * 255 + 15) / 31; // Chuyển đổi từ 5 bit sang 8 bit + g = (g * 255 + 31) / 63; // Chuyển đổi từ 6 bit sang 8 bit + b = (b * 255 + 15) / 31; // Chuyển đổi từ 5 bit sang 8 bit + + // Ghép các giá trị RGB888 thành một giá trị 32 bit + return (r << 16) | (g << 8) | b; +} +void drawXbm565(int x, int y, int width, int height, const char *xbm, uint16_t color = 0xffff) +{ + if (width % 8 != 0) + { + width = ((width / 8) + 1) * 8; } - for (int i = 0; i < width * height / 8; i++ ) { - unsigned char charColumn = pgm_read_byte(xbm + i); - for (int j = 0; j < 8; j++) { - int targetX = (i * 8 + j) % width + x; - int targetY = (8 * i / (width)) + y; - if (bitRead(charColumn, j)) { - dma_display->drawPixel(targetX, targetY, color); - } + for (int i = 0; i < width * height / 8; i++) + { + unsigned char charColumn = pgm_read_byte(xbm + i); + for (int j = 0; j < 8; j++) + { + int targetX = (i * 8 + j) % width + x; + int targetY = (8 * i / (width)) + y; + if (bitRead(charColumn, j)) + { + dma_display->drawPixel(targetX, targetY, color); } } + } } -void draw_cat(int x_start, int y_start,int width, int height) +void draw_cat(int x_start, int y_start, int width, int height) { for (int y = 0; y < height; y++) { @@ -199,11 +203,11 @@ void draw_cat(int x_start, int y_start,int width, int height) uint8_t r = (rgb888 >> 16) & 0xFF; // Kênh đỏ uint8_t g = (rgb888 >> 8) & 0xFF; // Kênh xanh lục uint8_t b = rgb888 & 0xFF; // Kênh xanh dương - //dma_display->drawPixel(x, y, color); + // dma_display->drawPixel(x, y, color); if (y <= 31) - dma_display->drawPixelRGB888(x+x_start, y+y_start, r, g, b); + dma_display->drawPixelRGB888(x + x_start, y + y_start, r, g, b); else - dma_display->drawPixelRGB888(x+x_start, y+y_start, r, b, g); + dma_display->drawPixelRGB888(x + x_start, y + y_start, r, b, g); } } } @@ -289,11 +293,10 @@ void Drawbar(int x) { // measure x dimension int dodai = 16; - MinX_bar = x-dodai/2; - MaxX_bar = x+dodai/2; - dma_display->drawLine(MinX_bar,MinY_bar-1,MaxX_bar,MinY_bar-1,dma_display->color333(3,3,3)); - dma_display->drawLine(MinX_bar,MinY_bar,MaxX_bar,MinY_bar,dma_display->color333(3,3,3)); - + MinX_bar = x - dodai / 2; + MaxX_bar = x + dodai / 2; + dma_display->drawLine(MinX_bar, MinY_bar - 1, MaxX_bar, MinY_bar - 1, dma_display->color333(3, 3, 3)); + dma_display->drawLine(MinX_bar, MinY_bar, MaxX_bar, MinY_bar, dma_display->color333(3, 3, 3)); } bool created = false; @@ -301,18 +304,18 @@ int X_vat = 20; int Y_vat = 2; int lastpoint[2]; int r = 2; -int speed = 500; +int speed = 150; void DrawObject(bool deleted = false) { // measure x dimension unsigned long now = millis(); if (!created) { - lastpoint[0]=X_vat; - lastpoint[1]=Y_vat; - dma_display->fillCircle(X_vat,Y_vat,r,dma_display->color333(0,0,0)); - dma_display->drawLine(MinX_bar,MinY_bar-1,MaxX_bar,MinY_bar-1,dma_display->color333(3,3,3)); - dma_display->drawLine(MinX_bar,MinY_bar,MaxX_bar,MinY_bar,dma_display->color333(3,3,3)); + lastpoint[0] = X_vat; + lastpoint[1] = Y_vat; + dma_display->fillCircle(X_vat, Y_vat, r, dma_display->color333(0, 0, 0)); + dma_display->drawLine(MinX_bar, MinY_bar - 1, MaxX_bar, MinY_bar - 1, dma_display->color333(3, 3, 3)); + dma_display->drawLine(MinX_bar, MinY_bar, MaxX_bar, MinY_bar, dma_display->color333(3, 3, 3)); X_vat = random(20, 109); // random(min, max), max không bao gồm Y_vat = 2; @@ -320,16 +323,18 @@ void DrawObject(bool deleted = false) } else { - if(now-period_time>=speed){ - dma_display->fillCircle(X_vat,Y_vat,r,dma_display->color333(0,0,0)); + if (now - period_time >= speed) + { + dma_display->fillCircle(X_vat, Y_vat, r, dma_display->color333(0, 0, 0)); Y_vat += 1; - if (Y_vat > 52)created = false; + if (Y_vat > 52) + created = false; period_time = now; } } - //dma_display->drawCircle(X_vat,Y_vat,1,dma_display->color333(7,0,0)); - dma_display->fillCircle(X_vat,Y_vat,r,dma_display->color333(7,0,0)); + // dma_display->drawCircle(X_vat,Y_vat,1,dma_display->color333(7,0,0)); + dma_display->fillCircle(X_vat, Y_vat, r, dma_display->color333(7, 0, 0)); } int score = 0; @@ -337,11 +342,11 @@ int score = 0; #define COLOR_WHITE dma_display->color333(7, 7, 7) void HeldObject() { - if (Y_vat+r >= MinY_bar-1 && X_vat >= MinX_bar-r && X_vat <= MaxX_bar+r) + if (Y_vat + r >= MinY_bar - 1 && X_vat >= MinX_bar - r && X_vat <= MaxX_bar + r) { Serial.println("Created"); created = false; - //DrawObject(true); + // DrawObject(true); DrawObject(); dma_display->setTextColor(COLOR_BLACK); @@ -350,11 +355,12 @@ void HeldObject() score += 1; dma_display->setFont(&FreeMono9pt7b); // Change to the desired font size dma_display->setTextColor(COLOR_WHITE); - + dma_display->setCursor(2, 11); dma_display->printf("%d", score); } - else{ + else + { dma_display->setFont(&FreeMono9pt7b); // Change to the desired font size dma_display->setTextColor(COLOR_WHITE); dma_display->setCursor(2, 11); @@ -367,19 +373,20 @@ void HeldObject() int X_shot = 0; int Y_shot = 32; bool created_shot = false; -bool direction = false; + +bool direction = false; // false = left, true = right; int lastpoint_shot[2]; unsigned long period_shot = millis(); -int speed_shot = 300; +int speed_shot = 100; void Drawbullet(bool deleted = false) { // measure x dimension unsigned long now = millis(); if (!created_shot) { - lastpoint_shot[0]=X_shot; - lastpoint_shot[1]=Y_shot; - dma_display->fillCircle(X_shot,Y_shot,1,dma_display->color333(0,0,0)); + lastpoint_shot[0] = X_shot; + lastpoint_shot[1] = Y_shot; + dma_display->fillCircle(X_shot, Y_shot, 1, dma_display->color333(0, 0, 0)); int ran = random(1, 3); if (ran == 1) { @@ -392,36 +399,46 @@ void Drawbullet(bool deleted = false) direction = true; } created_shot = true; - dma_display->fillCircle(X_shot,Y_shot,1,dma_display->color333(5,0,0)); - + dma_display->clearScreen(); + dma_display->fillCircle(X_shot, Y_shot, 1, dma_display->color333(5, 0, 0)); } else { - if(now-period_shot>=speed_shot){ - dma_display->fillCircle(lastpoint_shot[0],lastpoint_shot[1],1,dma_display->color333(0,0,0)); + if (now - period_shot >= speed_shot) + { + dma_display->fillCircle(lastpoint_shot[0], lastpoint_shot[1], 1, dma_display->color333(0, 0, 0)); if (direction == false) { X_shot += 1; if (X_shot >= 126) created_shot = false; - } - else{ + } + else + { X_shot -= 1; if (X_shot <= 2) created_shot = false; - } - lastpoint_shot[0]=X_shot; - lastpoint_shot[1]=Y_shot; - dma_display->fillCircle(X_shot,Y_shot,1,dma_display->color333(5,0,0)); + } + lastpoint_shot[0] = X_shot; + lastpoint_shot[1] = Y_shot; + dma_display->fillCircle(X_shot, Y_shot, 1, dma_display->color333(5, 0, 0)); period_shot = now; } } - //dma_display->drawCircle(X_vat,Y_vat,1,dma_display->color333(7,0,0)); - dma_display->fillCircle(X_vat,Y_vat,r,dma_display->color333(7,0,0)); + // dma_display->fillCircle(X_shot,Y_shot,1,dma_display->color333(5,0,0)); + // dma_display->drawCircle(X_vat,Y_vat,1,dma_display->color333(7,0,0)); } -void drawStickMan(int x, int y) + +int current_sheildX = 0; +int current_sheildY = 0; +int length_shield = 11; +int current_stickmanX = 0; +int current_stickmanY = 0; +int Shield_open = 0; +unsigned long period_gameover = millis(); +void drawStickMan(int x, int y, int defend = 0) { // Vẽ đầu dma_display->drawCircle(x, y, 2, rgbToUint16(255, 0, 0, false)); // Đầu stick man @@ -434,20 +451,120 @@ void drawStickMan(int x, int y) // Vẽ chân dma_display->drawLine(x, y + 7, x - 3, y + 10, rgbToUint16(255, 0, 0, false)); // Chân trái dma_display->drawLine(x, y + 7, x + 3, y + 10, rgbToUint16(255, 0, 0, false)); // Chân phải - + current_stickmanX = x; + current_stickmanY = y; + if (defend == 2) + { + dma_display->drawLine(x - 4, y - 1, x - 4, y + 10, rgbToUint16(255, 0, 0, false)); + dma_display->drawLine(x - 5, y - 1, x - 5, y + 10, rgbToUint16(255, 0, 0, false)); + current_sheildX = x - 5; + current_sheildY = y - 1; + length_shield = 11; + } + else if (defend == 1) + { + dma_display->drawLine(x + 4, y - 1, x + 4, y + 10, rgbToUint16(255, 0, 0, false)); + dma_display->drawLine(x + 5, y - 1, x + 5, y + 10, rgbToUint16(255, 0, 0, false)); + current_sheildX = x + 5; + current_sheildY = y - 1; + length_shield = 11; + } + else + { + current_sheildX = 0; + current_sheildY = 0; + } +} +bool game_over = false; +void Defend() +{ + if (!direction) + { + // Do duoc ben trai + if (current_sheildX != 0) + { + // co khien trai + if (current_sheildX == current_stickmanX - 5) + { + if (X_shot >= current_sheildX) + { + created_shot = false; + } + else + { + // do nothing + } + } + // ko co khien trai + else + { + if (X_shot >= current_stickmanX - 5) + { + game_over = true; + dma_display->setFont(&FreeMono9pt7b); // Change to the desired font size + dma_display->setTextColor(COLOR_WHITE); + dma_display->setCursor(2 + 16, 11 + 20); + dma_display->print("GAME OVER"); + period_gameover = millis(); + } + else + { + // do nothing + } + } + } + } + else + { + if (current_sheildX != 0) + { + // co khien phai + if (current_sheildX == current_stickmanX + 5) + { + if (X_shot <= current_sheildX) + { + created_shot = false; + } + else + { + // do nothing + created_shot = true; + } + } + // ko co khien trai + else + { + if (X_shot <= current_stickmanX + 5) + { + game_over = true; + dma_display->setFont(&FreeMono9pt7b); // Change to the desired font size + dma_display->setTextColor(COLOR_WHITE); + dma_display->setCursor(2 + 16, 11 + 20); + dma_display->print("GAME OVER"); + period_gameover = millis(); + } + else + { + // do nothing + } + } + } + } } void setup() { Serial.begin(115200 * 2); // Đảm bảo baud rate khớp với baud rate của Python dma_display = new MatrixPanel_I2S_DMA(mxconfig); dma_display->begin(); // setup the LED matrix - dma_display->setBrightness8(50); // 0-255 + dma_display->setBrightness8(200); // 0-255 dma_display->clearScreen(); - //draw_cat(10,10,20,20); - //drawXbm565(10,10,20,20,CAT_bits,dma_display->color565(100,0,0)); + // draw_cat(10,10,20,20); + // drawXbm565(10,10,20,20,CAT_bits,dma_display->color565(100,0,0)); } bool mode = false; +int reset_stickman = 2000; +bool Mode_game = false; void loop() { // server.handleClient(); @@ -466,7 +583,7 @@ void loop() bufferIndex = 0; // Reset buffer index in case of overflow } } - + float data[numRows][numCols]; if (bufferIndex >= 2 * sizeof(int)) { @@ -474,14 +591,24 @@ void loop() memcpy(&numRows, buffer, sizeof(int)); memcpy(&numCols, buffer + sizeof(int), sizeof(int)); + if (numRows == 1 && numCols == 0) + { + Mode_game = true; + //dma_display->clearScreen(); + // Serial.println("Stick Man"); + } + else if (numRows == 0 && numCols == 0) + { + Mode_game = false; + // Serial.println("HungVat"); + //dma_display->clearScreen(); + } - int expectedSize = numRows * numCols * floatSize; - if (bufferIndex >= (2 * sizeof(int) + expectedSize)) { dma_display->clearScreen(); - + for (int row = 0; row < numRows; ++row) { for (int col = 0; col < numCols; ++col) @@ -493,17 +620,46 @@ void loop() } } - Drawbar(int(data[0][0])); - - + if (!Mode_game) + { + Drawbar(int(data[0][0])); + } + else + { + if (!game_over) + drawStickMan(int(data[0][0]), int(data[0][1]), int(data[0][2])); + } // Reset chỉ số chỉ mục sau khi xử lý - bufferIndex = 0; + + } + bufferIndex = 0; + } + if (Mode_game) + { + if (game_over) + { + if (millis() - period_gameover >= reset_stickman) + { + game_over = false; + dma_display->clearScreen(); + + } } } - //DrawObject(true); - DrawObject(); - HeldObject(); + + // Stickman region + if (Mode_game) + { + Drawbullet(); + Defend(); + } + else // Hung Vat + { + DrawObject(true); + DrawObject(); + HeldObject(); + } #pragma endregion // readDataFromSerial();