diff --git a/animations/face_alert/face_alert.gif b/animations/face_alert/face_alert.gif new file mode 100644 index 0000000..26e1586 Binary files /dev/null and b/animations/face_alert/face_alert.gif differ diff --git a/animations/face_alert/frame_001.png b/animations/face_alert/frame_001.png new file mode 100644 index 0000000..b3352ff Binary files /dev/null and b/animations/face_alert/frame_001.png differ diff --git a/animations/face_alert/frame_002.png b/animations/face_alert/frame_002.png new file mode 100644 index 0000000..09a949d Binary files /dev/null and b/animations/face_alert/frame_002.png differ diff --git a/animations/face_alert/frame_003.png b/animations/face_alert/frame_003.png new file mode 100644 index 0000000..76d00aa Binary files /dev/null and b/animations/face_alert/frame_003.png differ diff --git a/animations/face_alert/frame_004.png b/animations/face_alert/frame_004.png new file mode 100644 index 0000000..e0c51ba Binary files /dev/null and b/animations/face_alert/frame_004.png differ diff --git a/animations/face_alert/frame_005.png b/animations/face_alert/frame_005.png new file mode 100644 index 0000000..385443e Binary files /dev/null and b/animations/face_alert/frame_005.png differ diff --git a/animations/face_alert/frame_006.png b/animations/face_alert/frame_006.png new file mode 100644 index 0000000..e0c51ba Binary files /dev/null and b/animations/face_alert/frame_006.png differ diff --git a/animations/face_alert/frame_007.png b/animations/face_alert/frame_007.png new file mode 100644 index 0000000..55d0122 Binary files /dev/null and b/animations/face_alert/frame_007.png differ diff --git a/animations/face_alert/frame_008.png b/animations/face_alert/frame_008.png new file mode 100644 index 0000000..e0c51ba Binary files /dev/null and b/animations/face_alert/frame_008.png differ diff --git a/animations/face_alert/frame_009.png b/animations/face_alert/frame_009.png new file mode 100644 index 0000000..385443e Binary files /dev/null and b/animations/face_alert/frame_009.png differ diff --git a/animations/face_alert/frame_010.png b/animations/face_alert/frame_010.png new file mode 100644 index 0000000..e0c51ba Binary files /dev/null and b/animations/face_alert/frame_010.png differ diff --git a/animations/face_alert/frame_011.png b/animations/face_alert/frame_011.png new file mode 100644 index 0000000..e0c51ba Binary files /dev/null and b/animations/face_alert/frame_011.png differ diff --git a/animations/face_alert/frame_012.png b/animations/face_alert/frame_012.png new file mode 100644 index 0000000..e0c51ba Binary files /dev/null and b/animations/face_alert/frame_012.png differ diff --git a/animations/face_alert/frame_013.png b/animations/face_alert/frame_013.png new file mode 100644 index 0000000..e0c51ba Binary files /dev/null and b/animations/face_alert/frame_013.png differ diff --git a/animations/face_alert/frame_014.png b/animations/face_alert/frame_014.png new file mode 100644 index 0000000..e0c51ba Binary files /dev/null and b/animations/face_alert/frame_014.png differ diff --git a/animations/face_alert/frame_015.png b/animations/face_alert/frame_015.png new file mode 100644 index 0000000..e0c51ba Binary files /dev/null and b/animations/face_alert/frame_015.png differ diff --git a/animations/face_alert/frame_016.png b/animations/face_alert/frame_016.png new file mode 100644 index 0000000..e0c51ba Binary files /dev/null and b/animations/face_alert/frame_016.png differ diff --git a/animations/face_alert/frame_017.png b/animations/face_alert/frame_017.png new file mode 100644 index 0000000..e0c51ba Binary files /dev/null and b/animations/face_alert/frame_017.png differ diff --git a/animations/face_alert/frame_018.png b/animations/face_alert/frame_018.png new file mode 100644 index 0000000..e0c51ba Binary files /dev/null and b/animations/face_alert/frame_018.png differ diff --git a/animations/face_alert/frame_019.png b/animations/face_alert/frame_019.png new file mode 100644 index 0000000..e0c51ba Binary files /dev/null and b/animations/face_alert/frame_019.png differ diff --git a/animations/face_alert/frame_020.png b/animations/face_alert/frame_020.png new file mode 100644 index 0000000..e0c51ba Binary files /dev/null and b/animations/face_alert/frame_020.png differ diff --git a/animations/face_following/face_following.gif b/animations/face_following/face_following.gif new file mode 100644 index 0000000..f5983fb Binary files /dev/null and b/animations/face_following/face_following.gif differ diff --git a/animations/face_following/frame_001.png b/animations/face_following/frame_001.png new file mode 100644 index 0000000..f6c75c5 Binary files /dev/null and b/animations/face_following/frame_001.png differ diff --git a/animations/face_following/frame_002.png b/animations/face_following/frame_002.png new file mode 100644 index 0000000..ee59859 Binary files /dev/null and b/animations/face_following/frame_002.png differ diff --git a/animations/face_following/frame_003.png b/animations/face_following/frame_003.png new file mode 100644 index 0000000..ea09d60 Binary files /dev/null and b/animations/face_following/frame_003.png differ diff --git a/animations/face_following/frame_004.png b/animations/face_following/frame_004.png new file mode 100644 index 0000000..b57c2f1 Binary files /dev/null and b/animations/face_following/frame_004.png differ diff --git a/animations/face_following/frame_005.png b/animations/face_following/frame_005.png new file mode 100644 index 0000000..4dee018 Binary files /dev/null and b/animations/face_following/frame_005.png differ diff --git a/animations/face_following/frame_006.png b/animations/face_following/frame_006.png new file mode 100644 index 0000000..95e9014 Binary files /dev/null and b/animations/face_following/frame_006.png differ diff --git a/animations/face_following/frame_007.png b/animations/face_following/frame_007.png new file mode 100644 index 0000000..78b133c Binary files /dev/null and b/animations/face_following/frame_007.png differ diff --git a/animations/face_following/frame_008.png b/animations/face_following/frame_008.png new file mode 100644 index 0000000..f660fcf Binary files /dev/null and b/animations/face_following/frame_008.png differ diff --git a/animations/face_following/frame_009.png b/animations/face_following/frame_009.png new file mode 100644 index 0000000..c059909 Binary files /dev/null and b/animations/face_following/frame_009.png differ diff --git a/animations/face_following/frame_010.png b/animations/face_following/frame_010.png new file mode 100644 index 0000000..78622af Binary files /dev/null and b/animations/face_following/frame_010.png differ diff --git a/animations/face_following/frame_011.png b/animations/face_following/frame_011.png new file mode 100644 index 0000000..2a19b2c Binary files /dev/null and b/animations/face_following/frame_011.png differ diff --git a/animations/face_following/frame_012.png b/animations/face_following/frame_012.png new file mode 100644 index 0000000..4e5e4bc Binary files /dev/null and b/animations/face_following/frame_012.png differ diff --git a/animations/face_following/frame_013.png b/animations/face_following/frame_013.png new file mode 100644 index 0000000..a6153fa Binary files /dev/null and b/animations/face_following/frame_013.png differ diff --git a/animations/face_following/frame_014.png b/animations/face_following/frame_014.png new file mode 100644 index 0000000..dc48ac5 Binary files /dev/null and b/animations/face_following/frame_014.png differ diff --git a/animations/face_following/frame_015.png b/animations/face_following/frame_015.png new file mode 100644 index 0000000..d5f6348 Binary files /dev/null and b/animations/face_following/frame_015.png differ diff --git a/animations/face_following/frame_016.png b/animations/face_following/frame_016.png new file mode 100644 index 0000000..5be6487 Binary files /dev/null and b/animations/face_following/frame_016.png differ diff --git a/animations/face_following/frame_017.png b/animations/face_following/frame_017.png new file mode 100644 index 0000000..e70b1f0 Binary files /dev/null and b/animations/face_following/frame_017.png differ diff --git a/animations/face_following/frame_018.png b/animations/face_following/frame_018.png new file mode 100644 index 0000000..2065baf Binary files /dev/null and b/animations/face_following/frame_018.png differ diff --git a/animations/face_following/frame_019.png b/animations/face_following/frame_019.png new file mode 100644 index 0000000..f960d79 Binary files /dev/null and b/animations/face_following/frame_019.png differ diff --git a/animations/face_following/frame_020.png b/animations/face_following/frame_020.png new file mode 100644 index 0000000..55dbdcc Binary files /dev/null and b/animations/face_following/frame_020.png differ diff --git a/animations/face_following/frame_021.png b/animations/face_following/frame_021.png new file mode 100644 index 0000000..ce42ae1 Binary files /dev/null and b/animations/face_following/frame_021.png differ diff --git a/animations/face_following/frame_022.png b/animations/face_following/frame_022.png new file mode 100644 index 0000000..a6e127e Binary files /dev/null and b/animations/face_following/frame_022.png differ diff --git a/animations/face_following/frame_023.png b/animations/face_following/frame_023.png new file mode 100644 index 0000000..2cd5118 Binary files /dev/null and b/animations/face_following/frame_023.png differ diff --git a/animations/face_following/frame_024.png b/animations/face_following/frame_024.png new file mode 100644 index 0000000..09786bf Binary files /dev/null and b/animations/face_following/frame_024.png differ diff --git a/animations/face_happy/face_happy.gif b/animations/face_happy/face_happy.gif new file mode 100644 index 0000000..1ef4937 Binary files /dev/null and b/animations/face_happy/face_happy.gif differ diff --git a/animations/face_happy/frame_001.png b/animations/face_happy/frame_001.png new file mode 100644 index 0000000..f98f12b Binary files /dev/null and b/animations/face_happy/frame_001.png differ diff --git a/animations/face_happy/frame_002.png b/animations/face_happy/frame_002.png new file mode 100644 index 0000000..f98f12b Binary files /dev/null and b/animations/face_happy/frame_002.png differ diff --git a/animations/face_happy/frame_003.png b/animations/face_happy/frame_003.png new file mode 100644 index 0000000..f98f12b Binary files /dev/null and b/animations/face_happy/frame_003.png differ diff --git a/animations/face_happy/frame_004.png b/animations/face_happy/frame_004.png new file mode 100644 index 0000000..f98f12b Binary files /dev/null and b/animations/face_happy/frame_004.png differ diff --git a/animations/face_happy/frame_005.png b/animations/face_happy/frame_005.png new file mode 100644 index 0000000..f98f12b Binary files /dev/null and b/animations/face_happy/frame_005.png differ diff --git a/animations/face_happy/frame_006.png b/animations/face_happy/frame_006.png new file mode 100644 index 0000000..f98f12b Binary files /dev/null and b/animations/face_happy/frame_006.png differ diff --git a/animations/face_happy/frame_007.png b/animations/face_happy/frame_007.png new file mode 100644 index 0000000..f98f12b Binary files /dev/null and b/animations/face_happy/frame_007.png differ diff --git a/animations/face_happy/frame_008.png b/animations/face_happy/frame_008.png new file mode 100644 index 0000000..f98f12b Binary files /dev/null and b/animations/face_happy/frame_008.png differ diff --git a/animations/face_happy/frame_009.png b/animations/face_happy/frame_009.png new file mode 100644 index 0000000..f98f12b Binary files /dev/null and b/animations/face_happy/frame_009.png differ diff --git a/animations/face_happy/frame_010.png b/animations/face_happy/frame_010.png new file mode 100644 index 0000000..f98f12b Binary files /dev/null and b/animations/face_happy/frame_010.png differ diff --git a/animations/face_happy/frame_011.png b/animations/face_happy/frame_011.png new file mode 100644 index 0000000..0e10e89 Binary files /dev/null and b/animations/face_happy/frame_011.png differ diff --git a/animations/face_happy/frame_012.png b/animations/face_happy/frame_012.png new file mode 100644 index 0000000..0e58e8e Binary files /dev/null and b/animations/face_happy/frame_012.png differ diff --git a/animations/face_happy/frame_013.png b/animations/face_happy/frame_013.png new file mode 100644 index 0000000..0e10e89 Binary files /dev/null and b/animations/face_happy/frame_013.png differ diff --git a/animations/face_happy/frame_014.png b/animations/face_happy/frame_014.png new file mode 100644 index 0000000..f98f12b Binary files /dev/null and b/animations/face_happy/frame_014.png differ diff --git a/animations/face_happy/frame_015.png b/animations/face_happy/frame_015.png new file mode 100644 index 0000000..f98f12b Binary files /dev/null and b/animations/face_happy/frame_015.png differ diff --git a/animations/face_happy/frame_016.png b/animations/face_happy/frame_016.png new file mode 100644 index 0000000..f98f12b Binary files /dev/null and b/animations/face_happy/frame_016.png differ diff --git a/animations/face_happy/frame_017.png b/animations/face_happy/frame_017.png new file mode 100644 index 0000000..f98f12b Binary files /dev/null and b/animations/face_happy/frame_017.png differ diff --git a/animations/face_happy/frame_018.png b/animations/face_happy/frame_018.png new file mode 100644 index 0000000..f98f12b Binary files /dev/null and b/animations/face_happy/frame_018.png differ diff --git a/animations/face_happy/frame_019.png b/animations/face_happy/frame_019.png new file mode 100644 index 0000000..f98f12b Binary files /dev/null and b/animations/face_happy/frame_019.png differ diff --git a/animations/face_happy/frame_020.png b/animations/face_happy/frame_020.png new file mode 100644 index 0000000..f98f12b Binary files /dev/null and b/animations/face_happy/frame_020.png differ diff --git a/animations/face_happy/frame_021.png b/animations/face_happy/frame_021.png new file mode 100644 index 0000000..f98f12b Binary files /dev/null and b/animations/face_happy/frame_021.png differ diff --git a/animations/face_happy/frame_022.png b/animations/face_happy/frame_022.png new file mode 100644 index 0000000..f98f12b Binary files /dev/null and b/animations/face_happy/frame_022.png differ diff --git a/animations/face_happy/frame_023.png b/animations/face_happy/frame_023.png new file mode 100644 index 0000000..f98f12b Binary files /dev/null and b/animations/face_happy/frame_023.png differ diff --git a/animations/face_happy/frame_024.png b/animations/face_happy/frame_024.png new file mode 100644 index 0000000..f98f12b Binary files /dev/null and b/animations/face_happy/frame_024.png differ diff --git a/animations/face_happy/frame_025.png b/animations/face_happy/frame_025.png new file mode 100644 index 0000000..f98f12b Binary files /dev/null and b/animations/face_happy/frame_025.png differ diff --git a/animations/face_happy/frame_026.png b/animations/face_happy/frame_026.png new file mode 100644 index 0000000..f98f12b Binary files /dev/null and b/animations/face_happy/frame_026.png differ diff --git a/animations/face_happy/frame_027.png b/animations/face_happy/frame_027.png new file mode 100644 index 0000000..f98f12b Binary files /dev/null and b/animations/face_happy/frame_027.png differ diff --git a/animations/face_happy/frame_028.png b/animations/face_happy/frame_028.png new file mode 100644 index 0000000..f98f12b Binary files /dev/null and b/animations/face_happy/frame_028.png differ diff --git a/animations/face_happy/frame_029.png b/animations/face_happy/frame_029.png new file mode 100644 index 0000000..f98f12b Binary files /dev/null and b/animations/face_happy/frame_029.png differ diff --git a/animations/face_happy/frame_030.png b/animations/face_happy/frame_030.png new file mode 100644 index 0000000..f98f12b Binary files /dev/null and b/animations/face_happy/frame_030.png differ diff --git a/animations/face_idle/face_idle.gif b/animations/face_idle/face_idle.gif new file mode 100644 index 0000000..d926b3d Binary files /dev/null and b/animations/face_idle/face_idle.gif differ diff --git a/animations/face_idle/frame_001.png b/animations/face_idle/frame_001.png new file mode 100644 index 0000000..bb2a7ad Binary files /dev/null and b/animations/face_idle/frame_001.png differ diff --git a/animations/face_idle/frame_002.png b/animations/face_idle/frame_002.png new file mode 100644 index 0000000..bb2a7ad Binary files /dev/null and b/animations/face_idle/frame_002.png differ diff --git a/animations/face_idle/frame_003.png b/animations/face_idle/frame_003.png new file mode 100644 index 0000000..bb2a7ad Binary files /dev/null and b/animations/face_idle/frame_003.png differ diff --git a/animations/face_idle/frame_004.png b/animations/face_idle/frame_004.png new file mode 100644 index 0000000..bb2a7ad Binary files /dev/null and b/animations/face_idle/frame_004.png differ diff --git a/animations/face_idle/frame_005.png b/animations/face_idle/frame_005.png new file mode 100644 index 0000000..8e6844a Binary files /dev/null and b/animations/face_idle/frame_005.png differ diff --git a/animations/face_idle/frame_006.png b/animations/face_idle/frame_006.png new file mode 100644 index 0000000..8e6844a Binary files /dev/null and b/animations/face_idle/frame_006.png differ diff --git a/animations/face_idle/frame_007.png b/animations/face_idle/frame_007.png new file mode 100644 index 0000000..8e6844a Binary files /dev/null and b/animations/face_idle/frame_007.png differ diff --git a/animations/face_idle/frame_008.png b/animations/face_idle/frame_008.png new file mode 100644 index 0000000..8e6844a Binary files /dev/null and b/animations/face_idle/frame_008.png differ diff --git a/animations/face_idle/frame_009.png b/animations/face_idle/frame_009.png new file mode 100644 index 0000000..8e6844a Binary files /dev/null and b/animations/face_idle/frame_009.png differ diff --git a/animations/face_idle/frame_010.png b/animations/face_idle/frame_010.png new file mode 100644 index 0000000..8e6844a Binary files /dev/null and b/animations/face_idle/frame_010.png differ diff --git a/animations/face_idle/frame_011.png b/animations/face_idle/frame_011.png new file mode 100644 index 0000000..b708371 Binary files /dev/null and b/animations/face_idle/frame_011.png differ diff --git a/animations/face_idle/frame_012.png b/animations/face_idle/frame_012.png new file mode 100644 index 0000000..8e6844a Binary files /dev/null and b/animations/face_idle/frame_012.png differ diff --git a/animations/face_idle/frame_013.png b/animations/face_idle/frame_013.png new file mode 100644 index 0000000..8e6844a Binary files /dev/null and b/animations/face_idle/frame_013.png differ diff --git a/animations/face_idle/frame_014.png b/animations/face_idle/frame_014.png new file mode 100644 index 0000000..8e6844a Binary files /dev/null and b/animations/face_idle/frame_014.png differ diff --git a/animations/face_idle/frame_015.png b/animations/face_idle/frame_015.png new file mode 100644 index 0000000..8e6844a Binary files /dev/null and b/animations/face_idle/frame_015.png differ diff --git a/animations/face_idle/frame_016.png b/animations/face_idle/frame_016.png new file mode 100644 index 0000000..01df8cc Binary files /dev/null and b/animations/face_idle/frame_016.png differ diff --git a/animations/face_idle/frame_017.png b/animations/face_idle/frame_017.png new file mode 100644 index 0000000..5304be4 Binary files /dev/null and b/animations/face_idle/frame_017.png differ diff --git a/animations/face_idle/frame_018.png b/animations/face_idle/frame_018.png new file mode 100644 index 0000000..4fe30ff Binary files /dev/null and b/animations/face_idle/frame_018.png differ diff --git a/animations/face_idle/frame_019.png b/animations/face_idle/frame_019.png new file mode 100644 index 0000000..bb2a7ad Binary files /dev/null and b/animations/face_idle/frame_019.png differ diff --git a/animations/face_idle/frame_020.png b/animations/face_idle/frame_020.png new file mode 100644 index 0000000..bb2a7ad Binary files /dev/null and b/animations/face_idle/frame_020.png differ diff --git a/animations/face_idle/frame_021.png b/animations/face_idle/frame_021.png new file mode 100644 index 0000000..bb2a7ad Binary files /dev/null and b/animations/face_idle/frame_021.png differ diff --git a/animations/face_idle/frame_022.png b/animations/face_idle/frame_022.png new file mode 100644 index 0000000..bb2a7ad Binary files /dev/null and b/animations/face_idle/frame_022.png differ diff --git a/animations/face_idle/frame_023.png b/animations/face_idle/frame_023.png new file mode 100644 index 0000000..bb2a7ad Binary files /dev/null and b/animations/face_idle/frame_023.png differ diff --git a/animations/face_idle/frame_024.png b/animations/face_idle/frame_024.png new file mode 100644 index 0000000..bb2a7ad Binary files /dev/null and b/animations/face_idle/frame_024.png differ diff --git a/animations/face_idle/frame_025.png b/animations/face_idle/frame_025.png new file mode 100644 index 0000000..13ca29d Binary files /dev/null and b/animations/face_idle/frame_025.png differ diff --git a/animations/face_idle/frame_026.png b/animations/face_idle/frame_026.png new file mode 100644 index 0000000..13ca29d Binary files /dev/null and b/animations/face_idle/frame_026.png differ diff --git a/animations/face_idle/frame_027.png b/animations/face_idle/frame_027.png new file mode 100644 index 0000000..13ca29d Binary files /dev/null and b/animations/face_idle/frame_027.png differ diff --git a/animations/face_idle/frame_028.png b/animations/face_idle/frame_028.png new file mode 100644 index 0000000..13ca29d Binary files /dev/null and b/animations/face_idle/frame_028.png differ diff --git a/animations/face_idle/frame_029.png b/animations/face_idle/frame_029.png new file mode 100644 index 0000000..13ca29d Binary files /dev/null and b/animations/face_idle/frame_029.png differ diff --git a/animations/face_idle/frame_030.png b/animations/face_idle/frame_030.png new file mode 100644 index 0000000..13ca29d Binary files /dev/null and b/animations/face_idle/frame_030.png differ diff --git a/animations/face_idle/frame_031.png b/animations/face_idle/frame_031.png new file mode 100644 index 0000000..2ab9d38 Binary files /dev/null and b/animations/face_idle/frame_031.png differ diff --git a/animations/face_idle/frame_032.png b/animations/face_idle/frame_032.png new file mode 100644 index 0000000..13ca29d Binary files /dev/null and b/animations/face_idle/frame_032.png differ diff --git a/animations/face_idle/frame_033.png b/animations/face_idle/frame_033.png new file mode 100644 index 0000000..13ca29d Binary files /dev/null and b/animations/face_idle/frame_033.png differ diff --git a/animations/face_idle/frame_034.png b/animations/face_idle/frame_034.png new file mode 100644 index 0000000..13ca29d Binary files /dev/null and b/animations/face_idle/frame_034.png differ diff --git a/animations/face_idle/frame_035.png b/animations/face_idle/frame_035.png new file mode 100644 index 0000000..13ca29d Binary files /dev/null and b/animations/face_idle/frame_035.png differ diff --git a/animations/face_idle/frame_036.png b/animations/face_idle/frame_036.png new file mode 100644 index 0000000..2de614d Binary files /dev/null and b/animations/face_idle/frame_036.png differ diff --git a/animations/face_idle/frame_037.png b/animations/face_idle/frame_037.png new file mode 100644 index 0000000..5304be4 Binary files /dev/null and b/animations/face_idle/frame_037.png differ diff --git a/animations/face_idle/frame_038.png b/animations/face_idle/frame_038.png new file mode 100644 index 0000000..4fe30ff Binary files /dev/null and b/animations/face_idle/frame_038.png differ diff --git a/animations/face_idle/frame_039.png b/animations/face_idle/frame_039.png new file mode 100644 index 0000000..bb2a7ad Binary files /dev/null and b/animations/face_idle/frame_039.png differ diff --git a/animations/face_idle/frame_040.png b/animations/face_idle/frame_040.png new file mode 100644 index 0000000..bb2a7ad Binary files /dev/null and b/animations/face_idle/frame_040.png differ diff --git a/animations/status_boot/frame_001.png b/animations/status_boot/frame_001.png new file mode 100644 index 0000000..0c1580d Binary files /dev/null and b/animations/status_boot/frame_001.png differ diff --git a/animations/status_boot/frame_002.png b/animations/status_boot/frame_002.png new file mode 100644 index 0000000..1442df3 Binary files /dev/null and b/animations/status_boot/frame_002.png differ diff --git a/animations/status_boot/frame_003.png b/animations/status_boot/frame_003.png new file mode 100644 index 0000000..4be17a7 Binary files /dev/null and b/animations/status_boot/frame_003.png differ diff --git a/animations/status_boot/frame_004.png b/animations/status_boot/frame_004.png new file mode 100644 index 0000000..1564c5e Binary files /dev/null and b/animations/status_boot/frame_004.png differ diff --git a/animations/status_boot/frame_005.png b/animations/status_boot/frame_005.png new file mode 100644 index 0000000..4c3bfae Binary files /dev/null and b/animations/status_boot/frame_005.png differ diff --git a/animations/status_boot/frame_006.png b/animations/status_boot/frame_006.png new file mode 100644 index 0000000..0194179 Binary files /dev/null and b/animations/status_boot/frame_006.png differ diff --git a/animations/status_boot/frame_007.png b/animations/status_boot/frame_007.png new file mode 100644 index 0000000..e303a21 Binary files /dev/null and b/animations/status_boot/frame_007.png differ diff --git a/animations/status_boot/frame_008.png b/animations/status_boot/frame_008.png new file mode 100644 index 0000000..2d3e8fb Binary files /dev/null and b/animations/status_boot/frame_008.png differ diff --git a/animations/status_boot/frame_009.png b/animations/status_boot/frame_009.png new file mode 100644 index 0000000..396be59 Binary files /dev/null and b/animations/status_boot/frame_009.png differ diff --git a/animations/status_boot/frame_010.png b/animations/status_boot/frame_010.png new file mode 100644 index 0000000..3e60ccf Binary files /dev/null and b/animations/status_boot/frame_010.png differ diff --git a/animations/status_boot/frame_011.png b/animations/status_boot/frame_011.png new file mode 100644 index 0000000..e600635 Binary files /dev/null and b/animations/status_boot/frame_011.png differ diff --git a/animations/status_boot/frame_012.png b/animations/status_boot/frame_012.png new file mode 100644 index 0000000..dbcb6cc Binary files /dev/null and b/animations/status_boot/frame_012.png differ diff --git a/animations/status_boot/frame_013.png b/animations/status_boot/frame_013.png new file mode 100644 index 0000000..602b4b4 Binary files /dev/null and b/animations/status_boot/frame_013.png differ diff --git a/animations/status_boot/frame_014.png b/animations/status_boot/frame_014.png new file mode 100644 index 0000000..4a56115 Binary files /dev/null and b/animations/status_boot/frame_014.png differ diff --git a/animations/status_boot/frame_015.png b/animations/status_boot/frame_015.png new file mode 100644 index 0000000..038403c Binary files /dev/null and b/animations/status_boot/frame_015.png differ diff --git a/animations/status_boot/frame_016.png b/animations/status_boot/frame_016.png new file mode 100644 index 0000000..89b10ac Binary files /dev/null and b/animations/status_boot/frame_016.png differ diff --git a/animations/status_boot/frame_017.png b/animations/status_boot/frame_017.png new file mode 100644 index 0000000..89b10ac Binary files /dev/null and b/animations/status_boot/frame_017.png differ diff --git a/animations/status_boot/frame_018.png b/animations/status_boot/frame_018.png new file mode 100644 index 0000000..7fb4765 Binary files /dev/null and b/animations/status_boot/frame_018.png differ diff --git a/animations/status_boot/frame_019.png b/animations/status_boot/frame_019.png new file mode 100644 index 0000000..04b0fe4 Binary files /dev/null and b/animations/status_boot/frame_019.png differ diff --git a/animations/status_boot/frame_020.png b/animations/status_boot/frame_020.png new file mode 100644 index 0000000..99e2ba2 Binary files /dev/null and b/animations/status_boot/frame_020.png differ diff --git a/animations/status_boot/frame_021.png b/animations/status_boot/frame_021.png new file mode 100644 index 0000000..2f620f0 Binary files /dev/null and b/animations/status_boot/frame_021.png differ diff --git a/animations/status_boot/frame_022.png b/animations/status_boot/frame_022.png new file mode 100644 index 0000000..bb2d25e Binary files /dev/null and b/animations/status_boot/frame_022.png differ diff --git a/animations/status_boot/frame_023.png b/animations/status_boot/frame_023.png new file mode 100644 index 0000000..5c08e36 Binary files /dev/null and b/animations/status_boot/frame_023.png differ diff --git a/animations/status_boot/frame_024.png b/animations/status_boot/frame_024.png new file mode 100644 index 0000000..8efb5ba Binary files /dev/null and b/animations/status_boot/frame_024.png differ diff --git a/animations/status_boot/frame_025.png b/animations/status_boot/frame_025.png new file mode 100644 index 0000000..568eac2 Binary files /dev/null and b/animations/status_boot/frame_025.png differ diff --git a/animations/status_boot/frame_026.png b/animations/status_boot/frame_026.png new file mode 100644 index 0000000..cc19367 Binary files /dev/null and b/animations/status_boot/frame_026.png differ diff --git a/animations/status_boot/frame_027.png b/animations/status_boot/frame_027.png new file mode 100644 index 0000000..4b39445 Binary files /dev/null and b/animations/status_boot/frame_027.png differ diff --git a/animations/status_boot/frame_028.png b/animations/status_boot/frame_028.png new file mode 100644 index 0000000..bb2a7ad Binary files /dev/null and b/animations/status_boot/frame_028.png differ diff --git a/animations/status_boot/frame_029.png b/animations/status_boot/frame_029.png new file mode 100644 index 0000000..bb2a7ad Binary files /dev/null and b/animations/status_boot/frame_029.png differ diff --git a/animations/status_boot/frame_030.png b/animations/status_boot/frame_030.png new file mode 100644 index 0000000..bb2a7ad Binary files /dev/null and b/animations/status_boot/frame_030.png differ diff --git a/animations/status_boot/frame_031.png b/animations/status_boot/frame_031.png new file mode 100644 index 0000000..bb2a7ad Binary files /dev/null and b/animations/status_boot/frame_031.png differ diff --git a/animations/status_boot/frame_032.png b/animations/status_boot/frame_032.png new file mode 100644 index 0000000..bb2a7ad Binary files /dev/null and b/animations/status_boot/frame_032.png differ diff --git a/animations/status_boot/frame_033.png b/animations/status_boot/frame_033.png new file mode 100644 index 0000000..bb2a7ad Binary files /dev/null and b/animations/status_boot/frame_033.png differ diff --git a/animations/status_boot/frame_034.png b/animations/status_boot/frame_034.png new file mode 100644 index 0000000..bb2a7ad Binary files /dev/null and b/animations/status_boot/frame_034.png differ diff --git a/animations/status_boot/frame_035.png b/animations/status_boot/frame_035.png new file mode 100644 index 0000000..bb2a7ad Binary files /dev/null and b/animations/status_boot/frame_035.png differ diff --git a/animations/status_boot/frame_036.png b/animations/status_boot/frame_036.png new file mode 100644 index 0000000..bb2a7ad Binary files /dev/null and b/animations/status_boot/frame_036.png differ diff --git a/animations/status_boot/frame_037.png b/animations/status_boot/frame_037.png new file mode 100644 index 0000000..bb2a7ad Binary files /dev/null and b/animations/status_boot/frame_037.png differ diff --git a/animations/status_boot/frame_038.png b/animations/status_boot/frame_038.png new file mode 100644 index 0000000..bb2a7ad Binary files /dev/null and b/animations/status_boot/frame_038.png differ diff --git a/animations/status_boot/frame_039.png b/animations/status_boot/frame_039.png new file mode 100644 index 0000000..bb2a7ad Binary files /dev/null and b/animations/status_boot/frame_039.png differ diff --git a/animations/status_boot/frame_040.png b/animations/status_boot/frame_040.png new file mode 100644 index 0000000..bb2a7ad Binary files /dev/null and b/animations/status_boot/frame_040.png differ diff --git a/animations/status_boot/status_boot.gif b/animations/status_boot/status_boot.gif new file mode 100644 index 0000000..129048b Binary files /dev/null and b/animations/status_boot/status_boot.gif differ diff --git a/animations/status_low_battery/frame_001.png b/animations/status_low_battery/frame_001.png new file mode 100644 index 0000000..1c841e3 Binary files /dev/null and b/animations/status_low_battery/frame_001.png differ diff --git a/animations/status_low_battery/frame_002.png b/animations/status_low_battery/frame_002.png new file mode 100644 index 0000000..1c841e3 Binary files /dev/null and b/animations/status_low_battery/frame_002.png differ diff --git a/animations/status_low_battery/frame_003.png b/animations/status_low_battery/frame_003.png new file mode 100644 index 0000000..1c841e3 Binary files /dev/null and b/animations/status_low_battery/frame_003.png differ diff --git a/animations/status_low_battery/frame_004.png b/animations/status_low_battery/frame_004.png new file mode 100644 index 0000000..e8bcd34 Binary files /dev/null and b/animations/status_low_battery/frame_004.png differ diff --git a/animations/status_low_battery/frame_005.png b/animations/status_low_battery/frame_005.png new file mode 100644 index 0000000..e8bcd34 Binary files /dev/null and b/animations/status_low_battery/frame_005.png differ diff --git a/animations/status_low_battery/frame_006.png b/animations/status_low_battery/frame_006.png new file mode 100644 index 0000000..e8bcd34 Binary files /dev/null and b/animations/status_low_battery/frame_006.png differ diff --git a/animations/status_low_battery/frame_007.png b/animations/status_low_battery/frame_007.png new file mode 100644 index 0000000..1c841e3 Binary files /dev/null and b/animations/status_low_battery/frame_007.png differ diff --git a/animations/status_low_battery/frame_008.png b/animations/status_low_battery/frame_008.png new file mode 100644 index 0000000..1c841e3 Binary files /dev/null and b/animations/status_low_battery/frame_008.png differ diff --git a/animations/status_low_battery/frame_009.png b/animations/status_low_battery/frame_009.png new file mode 100644 index 0000000..1c841e3 Binary files /dev/null and b/animations/status_low_battery/frame_009.png differ diff --git a/animations/status_low_battery/frame_010.png b/animations/status_low_battery/frame_010.png new file mode 100644 index 0000000..e8bcd34 Binary files /dev/null and b/animations/status_low_battery/frame_010.png differ diff --git a/animations/status_low_battery/frame_011.png b/animations/status_low_battery/frame_011.png new file mode 100644 index 0000000..e8bcd34 Binary files /dev/null and b/animations/status_low_battery/frame_011.png differ diff --git a/animations/status_low_battery/frame_012.png b/animations/status_low_battery/frame_012.png new file mode 100644 index 0000000..e8bcd34 Binary files /dev/null and b/animations/status_low_battery/frame_012.png differ diff --git a/animations/status_low_battery/frame_013.png b/animations/status_low_battery/frame_013.png new file mode 100644 index 0000000..1c841e3 Binary files /dev/null and b/animations/status_low_battery/frame_013.png differ diff --git a/animations/status_low_battery/frame_014.png b/animations/status_low_battery/frame_014.png new file mode 100644 index 0000000..1c841e3 Binary files /dev/null and b/animations/status_low_battery/frame_014.png differ diff --git a/animations/status_low_battery/frame_015.png b/animations/status_low_battery/frame_015.png new file mode 100644 index 0000000..1c841e3 Binary files /dev/null and b/animations/status_low_battery/frame_015.png differ diff --git a/animations/status_low_battery/frame_016.png b/animations/status_low_battery/frame_016.png new file mode 100644 index 0000000..e8bcd34 Binary files /dev/null and b/animations/status_low_battery/frame_016.png differ diff --git a/animations/status_low_battery/frame_017.png b/animations/status_low_battery/frame_017.png new file mode 100644 index 0000000..e8bcd34 Binary files /dev/null and b/animations/status_low_battery/frame_017.png differ diff --git a/animations/status_low_battery/frame_018.png b/animations/status_low_battery/frame_018.png new file mode 100644 index 0000000..e8bcd34 Binary files /dev/null and b/animations/status_low_battery/frame_018.png differ diff --git a/animations/status_low_battery/frame_019.png b/animations/status_low_battery/frame_019.png new file mode 100644 index 0000000..1c841e3 Binary files /dev/null and b/animations/status_low_battery/frame_019.png differ diff --git a/animations/status_low_battery/frame_020.png b/animations/status_low_battery/frame_020.png new file mode 100644 index 0000000..1c841e3 Binary files /dev/null and b/animations/status_low_battery/frame_020.png differ diff --git a/animations/status_low_battery/frame_021.png b/animations/status_low_battery/frame_021.png new file mode 100644 index 0000000..1c841e3 Binary files /dev/null and b/animations/status_low_battery/frame_021.png differ diff --git a/animations/status_low_battery/frame_022.png b/animations/status_low_battery/frame_022.png new file mode 100644 index 0000000..e8bcd34 Binary files /dev/null and b/animations/status_low_battery/frame_022.png differ diff --git a/animations/status_low_battery/frame_023.png b/animations/status_low_battery/frame_023.png new file mode 100644 index 0000000..e8bcd34 Binary files /dev/null and b/animations/status_low_battery/frame_023.png differ diff --git a/animations/status_low_battery/frame_024.png b/animations/status_low_battery/frame_024.png new file mode 100644 index 0000000..e8bcd34 Binary files /dev/null and b/animations/status_low_battery/frame_024.png differ diff --git a/animations/status_low_battery/status_low_battery.gif b/animations/status_low_battery/status_low_battery.gif new file mode 100644 index 0000000..45a2a0f Binary files /dev/null and b/animations/status_low_battery/status_low_battery.gif differ diff --git a/animations/turn_left/frame_001.png b/animations/turn_left/frame_001.png new file mode 100644 index 0000000..e3adea8 Binary files /dev/null and b/animations/turn_left/frame_001.png differ diff --git a/animations/turn_left/frame_002.png b/animations/turn_left/frame_002.png new file mode 100644 index 0000000..ac6cadc Binary files /dev/null and b/animations/turn_left/frame_002.png differ diff --git a/animations/turn_left/frame_003.png b/animations/turn_left/frame_003.png new file mode 100644 index 0000000..a79c52d Binary files /dev/null and b/animations/turn_left/frame_003.png differ diff --git a/animations/turn_left/frame_004.png b/animations/turn_left/frame_004.png new file mode 100644 index 0000000..1f5e9c5 Binary files /dev/null and b/animations/turn_left/frame_004.png differ diff --git a/animations/turn_left/frame_005.png b/animations/turn_left/frame_005.png new file mode 100644 index 0000000..6ee6ccd Binary files /dev/null and b/animations/turn_left/frame_005.png differ diff --git a/animations/turn_left/frame_006.png b/animations/turn_left/frame_006.png new file mode 100644 index 0000000..43606e7 Binary files /dev/null and b/animations/turn_left/frame_006.png differ diff --git a/animations/turn_left/frame_007.png b/animations/turn_left/frame_007.png new file mode 100644 index 0000000..97dc212 Binary files /dev/null and b/animations/turn_left/frame_007.png differ diff --git a/animations/turn_left/frame_008.png b/animations/turn_left/frame_008.png new file mode 100644 index 0000000..d1a4b72 Binary files /dev/null and b/animations/turn_left/frame_008.png differ diff --git a/animations/turn_left/frame_009.png b/animations/turn_left/frame_009.png new file mode 100644 index 0000000..d1a4b72 Binary files /dev/null and b/animations/turn_left/frame_009.png differ diff --git a/animations/turn_left/frame_010.png b/animations/turn_left/frame_010.png new file mode 100644 index 0000000..d1a4b72 Binary files /dev/null and b/animations/turn_left/frame_010.png differ diff --git a/animations/turn_left/frame_011.png b/animations/turn_left/frame_011.png new file mode 100644 index 0000000..d1a4b72 Binary files /dev/null and b/animations/turn_left/frame_011.png differ diff --git a/animations/turn_left/frame_012.png b/animations/turn_left/frame_012.png new file mode 100644 index 0000000..d1a4b72 Binary files /dev/null and b/animations/turn_left/frame_012.png differ diff --git a/animations/turn_left/frame_013.png b/animations/turn_left/frame_013.png new file mode 100644 index 0000000..4104547 Binary files /dev/null and b/animations/turn_left/frame_013.png differ diff --git a/animations/turn_left/frame_014.png b/animations/turn_left/frame_014.png new file mode 100644 index 0000000..4104547 Binary files /dev/null and b/animations/turn_left/frame_014.png differ diff --git a/animations/turn_left/frame_015.png b/animations/turn_left/frame_015.png new file mode 100644 index 0000000..4104547 Binary files /dev/null and b/animations/turn_left/frame_015.png differ diff --git a/animations/turn_left/frame_016.png b/animations/turn_left/frame_016.png new file mode 100644 index 0000000..4104547 Binary files /dev/null and b/animations/turn_left/frame_016.png differ diff --git a/animations/turn_left/turn_left.gif b/animations/turn_left/turn_left.gif new file mode 100644 index 0000000..e897f5e Binary files /dev/null and b/animations/turn_left/turn_left.gif differ diff --git a/animations/turn_right/frame_001.png b/animations/turn_right/frame_001.png new file mode 100644 index 0000000..448a59c Binary files /dev/null and b/animations/turn_right/frame_001.png differ diff --git a/animations/turn_right/frame_002.png b/animations/turn_right/frame_002.png new file mode 100644 index 0000000..f7a41f7 Binary files /dev/null and b/animations/turn_right/frame_002.png differ diff --git a/animations/turn_right/frame_003.png b/animations/turn_right/frame_003.png new file mode 100644 index 0000000..7330a8a Binary files /dev/null and b/animations/turn_right/frame_003.png differ diff --git a/animations/turn_right/frame_004.png b/animations/turn_right/frame_004.png new file mode 100644 index 0000000..dab81aa Binary files /dev/null and b/animations/turn_right/frame_004.png differ diff --git a/animations/turn_right/frame_005.png b/animations/turn_right/frame_005.png new file mode 100644 index 0000000..6a0656e Binary files /dev/null and b/animations/turn_right/frame_005.png differ diff --git a/animations/turn_right/frame_006.png b/animations/turn_right/frame_006.png new file mode 100644 index 0000000..9f2525b Binary files /dev/null and b/animations/turn_right/frame_006.png differ diff --git a/animations/turn_right/frame_007.png b/animations/turn_right/frame_007.png new file mode 100644 index 0000000..48360a5 Binary files /dev/null and b/animations/turn_right/frame_007.png differ diff --git a/animations/turn_right/frame_008.png b/animations/turn_right/frame_008.png new file mode 100644 index 0000000..0b9870c Binary files /dev/null and b/animations/turn_right/frame_008.png differ diff --git a/animations/turn_right/frame_009.png b/animations/turn_right/frame_009.png new file mode 100644 index 0000000..0b9870c Binary files /dev/null and b/animations/turn_right/frame_009.png differ diff --git a/animations/turn_right/frame_010.png b/animations/turn_right/frame_010.png new file mode 100644 index 0000000..0b9870c Binary files /dev/null and b/animations/turn_right/frame_010.png differ diff --git a/animations/turn_right/frame_011.png b/animations/turn_right/frame_011.png new file mode 100644 index 0000000..0b9870c Binary files /dev/null and b/animations/turn_right/frame_011.png differ diff --git a/animations/turn_right/frame_012.png b/animations/turn_right/frame_012.png new file mode 100644 index 0000000..0b9870c Binary files /dev/null and b/animations/turn_right/frame_012.png differ diff --git a/animations/turn_right/frame_013.png b/animations/turn_right/frame_013.png new file mode 100644 index 0000000..4104547 Binary files /dev/null and b/animations/turn_right/frame_013.png differ diff --git a/animations/turn_right/frame_014.png b/animations/turn_right/frame_014.png new file mode 100644 index 0000000..4104547 Binary files /dev/null and b/animations/turn_right/frame_014.png differ diff --git a/animations/turn_right/frame_015.png b/animations/turn_right/frame_015.png new file mode 100644 index 0000000..4104547 Binary files /dev/null and b/animations/turn_right/frame_015.png differ diff --git a/animations/turn_right/frame_016.png b/animations/turn_right/frame_016.png new file mode 100644 index 0000000..4104547 Binary files /dev/null and b/animations/turn_right/frame_016.png differ diff --git a/animations/turn_right/turn_right.gif b/animations/turn_right/turn_right.gif new file mode 100644 index 0000000..a0ad5ce Binary files /dev/null and b/animations/turn_right/turn_right.gif differ diff --git a/scripts/generate_animations.py b/scripts/generate_animations.py new file mode 100644 index 0000000..78ee57c --- /dev/null +++ b/scripts/generate_animations.py @@ -0,0 +1,403 @@ +#!/usr/bin/env python3 +"""Generate LED panel animations for Lux robot (128x96 px landscape).""" + +import math +import os +from PIL import Image, ImageDraw +import imageio.v3 as iio + +W, H = 128, 96 +BG = (0, 0, 0) +AMBER = (255, 160, 0) +AMBER_DIM = (80, 50, 0) +WHITE = (255, 255, 255) +CYAN = (0, 200, 255) +RED = (255, 30, 30) +GREEN = (0, 200, 80) +YELLOW = (255, 220, 0) + +OUT = os.path.join(os.path.dirname(__file__), "..", "animations") + + +def ensure_dir(name): + d = os.path.join(OUT, name) + os.makedirs(d, exist_ok=True) + return d + + +def save_anim(name, frames, fps=10): + d = ensure_dir(name) + for i, f in enumerate(frames): + f.save(os.path.join(d, f"frame_{i+1:03d}.png")) + gif_path = os.path.join(d, f"{name}.gif") + iio.imwrite( + gif_path, + [f.copy().convert("RGBA") for f in frames], + duration=int(1000 / fps), + loop=0, + plugin="pillow", + ) + print(f" {name}: {len(frames)} frames, {gif_path}") + + +# ── TURN SIGNALS ────────────────────────────────────────────── + +def make_arrow(direction, sweep_step, total_steps=8): + """Draw a sweeping turn signal arrow.""" + img = Image.new("RGB", (W, H), BG) + draw = ImageDraw.Draw(img) + + # Arrow shape: thick chevron + shaft + cx, cy = W // 2, H // 2 + sign = -1 if direction == "left" else 1 + + # Sweep: segments light up progressively + for seg in range(total_steps): + if seg > sweep_step: + break + alpha = 1.0 if seg <= sweep_step else 0.3 + color = tuple(int(c * alpha) for c in AMBER) + + # Shaft segments + sx = cx + sign * (seg * 7 - 28) + draw.rectangle([sx - 3, cy - 6, sx + 3, cy + 6], fill=color) + + # Arrow head + if sweep_step >= total_steps // 2: + tip_x = cx + sign * 36 + draw.polygon([ + (tip_x, cy), + (tip_x - sign * 20, cy - 24), + (tip_x - sign * 20, cy - 12), + (tip_x - sign * 8, cy - 12), + (tip_x - sign * 8, cy + 12), + (tip_x - sign * 20, cy + 12), + (tip_x - sign * 20, cy + 24), + ], fill=AMBER) + else: + tip_x = cx + sign * 36 + dim = AMBER_DIM + draw.polygon([ + (tip_x, cy), + (tip_x - sign * 20, cy - 24), + (tip_x - sign * 20, cy - 12), + (tip_x - sign * 8, cy - 12), + (tip_x - sign * 8, cy + 12), + (tip_x - sign * 20, cy + 12), + (tip_x - sign * 20, cy + 24), + ], fill=dim) + + return img + + +def gen_turn_signal(direction): + frames = [] + steps = 8 + # Sweep on + for s in range(steps): + frames.append(make_arrow(direction, s, steps)) + # Hold + for _ in range(4): + frames.append(make_arrow(direction, steps - 1, steps)) + # Off + off = Image.new("RGB", (W, H), BG) + for _ in range(4): + frames.append(off) + save_anim(f"turn_{direction}", frames, fps=10) + + +# ── FACES ───────────────────────────────────────────────────── + +def draw_eye(draw, cx, cy, w, h, pupil_dy=0, blink=0.0): + """Draw a rounded robot eye. blink 0=open, 1=closed.""" + eh = max(2, int(h * (1.0 - blink))) + ey = cy - eh // 2 + draw.rounded_rectangle([cx - w // 2, ey, cx + w // 2, ey + eh], radius=min(6, eh // 2), fill=CYAN) + if blink < 0.6: + # Pupil + pw, ph = w // 3, max(2, eh // 3) + draw.rounded_rectangle( + [cx - pw // 2, cy - ph // 2 + pupil_dy, cx + pw // 2, cy + ph // 2 + pupil_dy], + radius=2, fill=WHITE + ) + + +def draw_mouth(draw, cy, style="smile", width=30): + cx = W // 2 + if style == "smile": + draw.arc([cx - width, cy - width // 2, cx + width, cy + width // 2 + 10], + start=10, end=170, fill=CYAN, width=3) + elif style == "neutral": + draw.line([cx - width // 2, cy, cx + width // 2, cy], fill=CYAN, width=2) + elif style == "open": + draw.ellipse([cx - 12, cy - 8, cx + 12, cy + 8], fill=CYAN) + elif style == "focused": + draw.line([cx - width // 2, cy, cx + width // 2, cy], fill=CYAN, width=3) + + +def gen_happy_face(): + frames = [] + eye_w, eye_h = 24, 20 + eye_y = 34 + eye_sep = 22 + mouth_y = 68 + + for i in range(30): + img = Image.new("RGB", (W, H), BG) + draw = ImageDraw.Draw(img) + + # Blink at frame 10-12 + blink = 0.0 + if i == 10: + blink = 0.5 + elif i == 11: + blink = 1.0 + elif i == 12: + blink = 0.5 + + # Slight eye squint for happiness (smaller height) + h = int(eye_h * 0.85) + draw_eye(draw, W // 2 - eye_sep, eye_y, eye_w, h, blink=blink) + draw_eye(draw, W // 2 + eye_sep, eye_y, eye_w, h, blink=blink) + draw_mouth(draw, mouth_y, "smile", width=28) + + # Cheek dots + draw.ellipse([W // 2 - 44, 48, W // 2 - 36, 56], fill=(0, 100, 150)) + draw.ellipse([W // 2 + 36, 48, W // 2 + 44, 56], fill=(0, 100, 150)) + + frames.append(img) + + save_anim("face_happy", frames, fps=10) + + +def gen_idle_face(): + frames = [] + eye_w, eye_h = 22, 18 + eye_y = 36 + eye_sep = 22 + mouth_y = 68 + + for i in range(40): + img = Image.new("RGB", (W, H), BG) + draw = ImageDraw.Draw(img) + + # Gentle breathing: slight eye movement + breath = math.sin(i * 2 * math.pi / 40) * 2 + pupil_dy = int(breath) + + # Blink at frames 15-17, 35-37 + blink = 0.0 + if i in (15, 35): + blink = 0.5 + elif i in (16, 36): + blink = 1.0 + elif i in (17, 37): + blink = 0.5 + + draw_eye(draw, W // 2 - eye_sep, eye_y, eye_w, eye_h, pupil_dy=pupil_dy, blink=blink) + draw_eye(draw, W // 2 + eye_sep, eye_y, eye_w, eye_h, pupil_dy=pupil_dy, blink=blink) + draw_mouth(draw, mouth_y, "neutral") + + frames.append(img) + + save_anim("face_idle", frames, fps=8) + + +def gen_alert_face(): + frames = [] + eye_w, eye_h = 28, 26 + eye_y = 34 + eye_sep = 24 + mouth_y = 70 + + for i in range(20): + img = Image.new("RGB", (W, H), BG) + draw = ImageDraw.Draw(img) + + # Pop-in effect: eyes grow from small to large in first 4 frames + scale = min(1.0, (i + 1) / 4) + ew = int(eye_w * scale) + eh = int(eye_h * scale) + + # Slight shake + shake = 0 + if 4 <= i <= 8: + shake = int(math.sin(i * 5) * 2) + + draw_eye(draw, W // 2 - eye_sep + shake, eye_y, max(4, ew), max(4, eh)) + draw_eye(draw, W // 2 + eye_sep + shake, eye_y, max(4, ew), max(4, eh)) + + if scale >= 1.0: + # Eyebrows raised + draw.line([W // 2 - eye_sep - 14, eye_y - 18, W // 2 - eye_sep + 14, eye_y - 18], + fill=CYAN, width=3) + draw.line([W // 2 + eye_sep - 14, eye_y - 18, W // 2 + eye_sep + 14, eye_y - 18], + fill=CYAN, width=3) + + draw_mouth(draw, mouth_y, "open") + frames.append(img) + + save_anim("face_alert", frames, fps=10) + + +def gen_following_face(): + frames = [] + eye_w, eye_h = 24, 20 + eye_y = 34 + eye_sep = 20 + mouth_y = 68 + + for i in range(24): + img = Image.new("RGB", (W, H), BG) + draw = ImageDraw.Draw(img) + + # Focus: crosshair-like elements, pupils centered and intense + draw_eye(draw, W // 2 - eye_sep, eye_y, eye_w, eye_h) + draw_eye(draw, W // 2 + eye_sep, eye_y, eye_w, eye_h) + draw_mouth(draw, mouth_y, "focused") + + # Scanning line sweeping down + scan_y = 10 + (i * 3) % (H - 20) + draw.line([10, scan_y, W - 10, scan_y], fill=(0, 80, 120), width=1) + + # Corner brackets (targeting reticle) + c = (0, 150, 200) + bw = 3 + # top-left + draw.line([8, 8, 20, 8], fill=c, width=bw) + draw.line([8, 8, 8, 20], fill=c, width=bw) + # top-right + draw.line([W - 8, 8, W - 20, 8], fill=c, width=bw) + draw.line([W - 8, 8, W - 8, 20], fill=c, width=bw) + # bottom-left + draw.line([8, H - 8, 20, H - 8], fill=c, width=bw) + draw.line([8, H - 8, 8, H - 20], fill=c, width=bw) + # bottom-right + draw.line([W - 8, H - 8, W - 20, H - 8], fill=c, width=bw) + draw.line([W - 8, H - 8, W - 8, H - 20], fill=c, width=bw) + + frames.append(img) + + save_anim("face_following", frames, fps=8) + + +# ── STATUS ──────────────────────────────────────────────────── + +def gen_boot(): + frames = [] + total = 30 + + for i in range(total): + img = Image.new("RGB", (W, H), BG) + draw = ImageDraw.Draw(img) + t = i / total + + if t < 0.2: + # Scanline appears + y = int(t / 0.2 * H) + draw.line([0, y, W, y], fill=CYAN, width=2) + elif t < 0.5: + # Grid materializes + alpha = (t - 0.2) / 0.3 + gc = tuple(int(c * alpha) for c in (0, 60, 80)) + for x in range(0, W, 16): + draw.line([x, 0, x, H], fill=gc, width=1) + for y in range(0, H, 16): + draw.line([0, y, W, y], fill=gc, width=1) + # Center circle expanding + r = int(alpha * 30) + cx, cy = W // 2, H // 2 + draw.ellipse([cx - r, cy - r, cx + r, cy + r], outline=CYAN, width=2) + elif t < 0.7: + # Eyes powering on + alpha = (t - 0.5) / 0.2 + gc = tuple(int(c * 0.3) for c in (0, 60, 80)) + for x in range(0, W, 16): + draw.line([x, 0, x, H], fill=gc, width=1) + for y in range(0, H, 16): + draw.line([0, y, W, y], fill=gc, width=1) + + eye_c = tuple(int(c * alpha) for c in CYAN) + ew = int(22 * alpha) + eh = int(18 * alpha) + draw_eye(draw, W // 2 - 22, 36, max(4, ew), max(4, eh)) + draw_eye(draw, W // 2 + 22, 36, max(4, ew), max(4, eh)) + else: + # Full face fades in + alpha = min(1.0, (t - 0.7) / 0.2) + + # Fading grid + ga = max(0, 0.3 - alpha * 0.3) + gc = tuple(int(c * ga) for c in (0, 60, 80)) + for x in range(0, W, 16): + draw.line([x, 0, x, H], fill=gc, width=1) + for y in range(0, H, 16): + draw.line([0, y, W, y], fill=gc, width=1) + + draw_eye(draw, W // 2 - 22, 36, 22, 18) + draw_eye(draw, W // 2 + 22, 36, 22, 18) + if alpha > 0.5: + draw_mouth(draw, 68, "neutral") + + frames.append(img) + + # Hold final frame + for _ in range(10): + frames.append(frames[-1].copy()) + + save_anim("status_boot", frames, fps=12) + + +def gen_low_battery(): + frames = [] + + for i in range(24): + img = Image.new("RGB", (W, H), BG) + draw = ImageDraw.Draw(img) + + cx = W // 2 + blink = (i % 6) < 3 + + # Large centered battery icon + bw, bh = 76, 40 + bx = cx - bw // 2 + by = 10 + draw.rounded_rectangle([bx, by, bx + bw, by + bh], radius=5, outline=WHITE, width=3) + # Battery nub + draw.rectangle([bx + bw, by + 12, bx + bw + 7, by + bh - 12], fill=WHITE) + + # Fill level: critically low (blinking red) + fill_w = 14 + if blink: + draw.rectangle([bx + 5, by + 5, bx + 5 + fill_w, by + bh - 5], fill=RED) + + # Exclamation mark below battery + ey = by + bh + 8 + draw.rectangle([cx - 3, ey, cx + 3, ey + 16], fill=RED if blink else (120, 20, 20)) + draw.rectangle([cx - 3, ey + 20, cx + 3, ey + 26], fill=RED if blink else (120, 20, 20)) + + frames.append(img) + + save_anim("status_low_battery", frames, fps=6) + + +# ── MAIN ────────────────────────────────────────────────────── + +if __name__ == "__main__": + print("Generating LED panel animations (128x96)...") + + print("\nTurn signals:") + gen_turn_signal("left") + gen_turn_signal("right") + + print("\nFaces:") + gen_happy_face() + gen_idle_face() + gen_alert_face() + gen_following_face() + + print("\nStatus:") + gen_boot() + gen_low_battery() + + print("\nDone! All animations in:", os.path.abspath(OUT))