Skip to content

Commit

Permalink
change arduino export based on commands
Browse files Browse the repository at this point in the history
  • Loading branch information
timhendriks93 committed Jan 19, 2024
1 parent 87a5fdd commit 018936c
Show file tree
Hide file tree
Showing 9 changed files with 233 additions and 80 deletions.
50 changes: 24 additions & 26 deletions addon/ops/arduino_export.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
import re
import bpy

from bpy.types import Operator
from bpy_extras.io_utils import ExportHelper
from .base_export import BaseExport
from ..utils.servo_settings import get_pose_bone_by_servo_id


class ArduinoExport(Operator, BaseExport, ExportHelper):
Expand All @@ -13,7 +11,7 @@ class ArduinoExport(Operator, BaseExport, ExportHelper):
bl_description = "Save an Arduino header file with servo position values of the active armature"

filename_ext = ".h"
position_chunk_size = 50
chunk_size = 12

filter_glob: bpy.props.StringProperty(
default="*.h",
Expand Down Expand Up @@ -45,7 +43,6 @@ class ArduinoExport(Operator, BaseExport, ExportHelper):
)

def export(self, positions, filepath, context):
variable_type = 'int' if self.precision == 0 else 'float'
fps, frames, seconds = self.get_time_meta(context.scene)
filename = self.get_blend_filename()

Expand All @@ -56,6 +53,11 @@ def export(self, positions, filepath, context):
f"Scene: {context.scene.name}\n File: {filename}\n*/\n"
)

commands = self.get_commands(frames, positions)
length = len(commands)
lines = self.join_by_chunk_size(commands, self.chunk_size)
progmem = 'PROGMEM ' if self.progmem else ''

if self.progmem or self.animation_variables:
content += "\n#include <Arduino.h>\n"

Expand All @@ -65,33 +67,29 @@ def export(self, positions, filepath, context):
if self.animation_variables:
content += (
f"\nconst byte FPS = {fps};"
f"\nconst int FRAMES = {frames};\n"
)

for servo_id in positions:
pose_bone = get_pose_bone_by_servo_id(servo_id, context.scene)
bone_positions = list(map(str, positions[servo_id]))
variable_name = re.sub('[^a-zA-Z0-9_]', '', pose_bone.bone.name)
array_size = "FRAMES" if self.animation_variables else frames
content += (
f"\n// Servo ID: {servo_id}\n"
f"const {variable_type} {variable_name}[{array_size}] "
f"\nconst int FRAMES = {frames};"
f"\nconst int LENGTH = {length};\n\n"
)

if self.progmem:
content += 'PROGMEM '

content += '= {\n'

for i in range(0, len(bone_positions), self.position_chunk_size):
content += ' ' + \
', '.join(
bone_positions[i:i + self.position_chunk_size]) + ',\n'

content += '};\n'
array_size = "LENGTH" if self.animation_variables else length
content += f'const byte {progmem}ANIMATION_DATA[{array_size}] = {{\n{lines}}};\n'

if self.namespace:
content += f"\n}} // namespace {context.scene.name}\n"

with open(filepath, 'w', encoding='utf-8') as file:
file.write(content)

@classmethod
def join_by_chunk_size(cls, iterable, chunk_size):
output = ''
str_iterable = list(map(cls.format_hex, iterable))

for i in range(0, len(str_iterable), chunk_size):
output += ' ' + ', '.join(str_iterable[i:i + chunk_size]) + ',\n'

return output

@classmethod
def format_hex(cls, byte):
return f'{byte:#04x}'
25 changes: 16 additions & 9 deletions addon/ops/base_export.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,7 @@
class BaseExport:
COMMAND_START = 0x3C
COMMAND_END = 0x3E

precision: bpy.props.IntProperty(
name="Precision",
description="The number of decimal digits to round to",
default=0,
min=0,
max=6
)
LINE_BREAK = 10

@classmethod
def poll(cls, context):
Expand All @@ -35,7 +28,7 @@ def execute(self, context):
bpy.ops.servo_animation.stop_live_mode()

try:
positions = calculate_positions(context, self.precision)
positions = calculate_positions(context)
self.export(positions, self.filepath, context)
except RuntimeError as error:
self.report({'ERROR'}, str(error))
Expand All @@ -62,6 +55,20 @@ def get_command(cls, servo_id, position):

return command

@classmethod
def get_commands(cls, frames, positions):
commands = []

for frame in range(frames):
for servo_id in range(255):
if servo_id not in positions:
continue
position = positions[servo_id][frame]
commands += cls.get_command(servo_id, position)
commands.append(cls.LINE_BREAK)

return commands

@staticmethod
def get_time_meta(scene):
fps = scene.render.fps
Expand Down
14 changes: 2 additions & 12 deletions addon/ops/servoanim_export.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,9 @@ class ServoanimExport(Operator, BaseExport, ExportHelper):
maxlen=255
)

LINE_BREAK = 10

def export(self, positions, filepath, context):
_fps, frames, _seconds = self.get_time_meta(context.scene)
content = []

for frame in range(frames):
for servo_id in range(255):
if servo_id not in positions:
continue
position = positions[servo_id][frame]
content += self.get_command(servo_id, position)
content.append(self.LINE_BREAK)
commands = self.get_commands(frames, positions)

with open(filepath, 'wb') as file:
file.write(bytes(content))
file.write(bytes(commands))
3 changes: 1 addition & 2 deletions addon/ui/bone_panel.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,7 @@ def draw_servo_id(self, servo_settings, context):
def draw_current(self, context):
layout = self.layout
box = layout.box()
position, angle, in_range = calculate_position(
context.active_pose_bone, None)
position, angle, in_range = calculate_position(context.active_pose_bone)

if not in_range:
box.label(text="Position is out of range", icon="ERROR")
Expand Down
11 changes: 4 additions & 7 deletions addon/utils/converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ def matrix_visual(pose_bone):
)


def calculate_position(pose_bone, precision):
def calculate_position(pose_bone):
servo_settings = pose_bone.bone.servo_settings
rotation_euler = matrix_visual(pose_bone).to_euler()
rotation_axis_index = int(servo_settings.rotation_axis)
Expand All @@ -42,7 +42,7 @@ def calculate_position(pose_bone, precision):

angle = servo_settings.neutral_angle - rotation_in_degrees
position = round(range_map(angle, 0, servo_settings.rotation_range,
servo_settings.position_min, servo_settings.position_max), precision)
servo_settings.position_min, servo_settings.position_max))

check_min = servo_settings.position_min
check_max = servo_settings.position_max
Expand All @@ -55,7 +55,7 @@ def calculate_position(pose_bone, precision):
return position, round(angle, 2), in_range


def calculate_positions(context, precision):
def calculate_positions(context):
pose_bones = []
scene = context.scene
window_manager = context.window_manager
Expand All @@ -70,17 +70,14 @@ def calculate_positions(context, precision):
pose_bones.append(pose_bone)
positions[servo_settings.servo_id] = []

if precision == 0:
precision = None

window_manager.progress_begin(min=start, max=end)

for frame in range(start, end):
scene.frame_set(frame)

for pose_bone in pose_bones:
bone = pose_bone.bone
position, _angle, in_range = calculate_position(pose_bone, precision)
position, _angle, in_range = calculate_position(pose_bone)

if not in_range:
raise RuntimeError(
Expand Down
104 changes: 94 additions & 10 deletions examples/IK/ik.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,99 @@

const byte FPS = 30;
const int FRAMES = 100;
const int LENGTH = 1100;

// Servo ID: 0
const int NeckLeft[FRAMES] PROGMEM = {
375, 376, 377, 380, 384, 387, 391, 396, 400, 403, 406, 408, 410, 410, 409, 406, 402, 396, 390, 382, 373, 364, 355, 346, 338, 330, 323, 318, 314, 311, 309, 307, 305, 305, 305, 305, 306, 307, 309, 311, 314, 317, 320, 323, 327, 331, 335, 339, 343, 347,
351, 356, 360, 364, 369, 374, 380, 386, 392, 398, 404, 410, 415, 420, 425, 429, 432, 435, 436, 437, 437, 436, 435, 434, 432, 430, 428, 426, 423, 421, 418, 415, 412, 409, 406, 403, 400, 397, 394, 391, 388, 386, 384, 381, 380, 378, 377, 376, 375, 375,
};

// Servo ID: 1
const int NeckRight[FRAMES] PROGMEM = {
375, 376, 379, 383, 388, 394, 401, 409, 417, 426, 434, 443, 450, 457, 463, 468, 471, 472, 471, 469, 466, 462, 457, 452, 447, 441, 437, 432, 428, 424, 420, 416, 411, 407, 402, 398, 394, 389, 384, 380, 375, 370, 366, 361, 356, 352, 347, 342, 337, 333,
328, 324, 319, 315, 312, 309, 308, 307, 306, 306, 306, 307, 308, 309, 310, 311, 312, 313, 313, 313, 313, 314, 315, 316, 318, 320, 322, 324, 327, 329, 332, 335, 338, 341, 344, 347, 350, 353, 356, 359, 362, 364, 366, 369, 370, 372, 373, 374, 375, 375,
const byte PROGMEM ANIMATION_DATA[LENGTH] = {
0x3c, 0x00, 0x01, 0x77, 0x3e, 0x3c, 0x01, 0x01, 0x77, 0x3e, 0x0a, 0x3c,
0x00, 0x01, 0x78, 0x3e, 0x3c, 0x01, 0x01, 0x78, 0x3e, 0x0a, 0x3c, 0x00,
0x01, 0x79, 0x3e, 0x3c, 0x01, 0x01, 0x7b, 0x3e, 0x0a, 0x3c, 0x00, 0x01,
0x7c, 0x3e, 0x3c, 0x01, 0x01, 0x7f, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x80,
0x3e, 0x3c, 0x01, 0x01, 0x84, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x83, 0x3e,
0x3c, 0x01, 0x01, 0x8a, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x87, 0x3e, 0x3c,
0x01, 0x01, 0x91, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x8c, 0x3e, 0x3c, 0x01,
0x01, 0x99, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x90, 0x3e, 0x3c, 0x01, 0x01,
0xa1, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x93, 0x3e, 0x3c, 0x01, 0x01, 0xaa,
0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x96, 0x3e, 0x3c, 0x01, 0x01, 0xb2, 0x3e,
0x0a, 0x3c, 0x00, 0x01, 0x98, 0x3e, 0x3c, 0x01, 0x01, 0xbb, 0x3e, 0x0a,
0x3c, 0x00, 0x01, 0x9a, 0x3e, 0x3c, 0x01, 0x01, 0xc2, 0x3e, 0x0a, 0x3c,
0x00, 0x01, 0x9a, 0x3e, 0x3c, 0x01, 0x01, 0xc9, 0x3e, 0x0a, 0x3c, 0x00,
0x01, 0x99, 0x3e, 0x3c, 0x01, 0x01, 0xcf, 0x3e, 0x0a, 0x3c, 0x00, 0x01,
0x96, 0x3e, 0x3c, 0x01, 0x01, 0xd4, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x92,
0x3e, 0x3c, 0x01, 0x01, 0xd7, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x8c, 0x3e,
0x3c, 0x01, 0x01, 0xd8, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x86, 0x3e, 0x3c,
0x01, 0x01, 0xd7, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x7e, 0x3e, 0x3c, 0x01,
0x01, 0xd5, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x75, 0x3e, 0x3c, 0x01, 0x01,
0xd2, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x6c, 0x3e, 0x3c, 0x01, 0x01, 0xce,
0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x63, 0x3e, 0x3c, 0x01, 0x01, 0xc9, 0x3e,
0x0a, 0x3c, 0x00, 0x01, 0x5a, 0x3e, 0x3c, 0x01, 0x01, 0xc4, 0x3e, 0x0a,
0x3c, 0x00, 0x01, 0x52, 0x3e, 0x3c, 0x01, 0x01, 0xbf, 0x3e, 0x0a, 0x3c,
0x00, 0x01, 0x4a, 0x3e, 0x3c, 0x01, 0x01, 0xb9, 0x3e, 0x0a, 0x3c, 0x00,
0x01, 0x43, 0x3e, 0x3c, 0x01, 0x01, 0xb5, 0x3e, 0x0a, 0x3c, 0x00, 0x01,
0x3e, 0x3e, 0x3c, 0x01, 0x01, 0xb0, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x3a,
0x3e, 0x3c, 0x01, 0x01, 0xac, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x37, 0x3e,
0x3c, 0x01, 0x01, 0xa8, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x35, 0x3e, 0x3c,
0x01, 0x01, 0xa4, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x33, 0x3e, 0x3c, 0x01,
0x01, 0xa0, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x31, 0x3e, 0x3c, 0x01, 0x01,
0x9b, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x31, 0x3e, 0x3c, 0x01, 0x01, 0x97,
0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x31, 0x3e, 0x3c, 0x01, 0x01, 0x92, 0x3e,
0x0a, 0x3c, 0x00, 0x01, 0x31, 0x3e, 0x3c, 0x01, 0x01, 0x8e, 0x3e, 0x0a,
0x3c, 0x00, 0x01, 0x32, 0x3e, 0x3c, 0x01, 0x01, 0x8a, 0x3e, 0x0a, 0x3c,
0x00, 0x01, 0x33, 0x3e, 0x3c, 0x01, 0x01, 0x85, 0x3e, 0x0a, 0x3c, 0x00,
0x01, 0x35, 0x3e, 0x3c, 0x01, 0x01, 0x80, 0x3e, 0x0a, 0x3c, 0x00, 0x01,
0x37, 0x3e, 0x3c, 0x01, 0x01, 0x7c, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x3a,
0x3e, 0x3c, 0x01, 0x01, 0x77, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x3d, 0x3e,
0x3c, 0x01, 0x01, 0x72, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x40, 0x3e, 0x3c,
0x01, 0x01, 0x6e, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x43, 0x3e, 0x3c, 0x01,
0x01, 0x69, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x47, 0x3e, 0x3c, 0x01, 0x01,
0x64, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x4b, 0x3e, 0x3c, 0x01, 0x01, 0x60,
0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x4f, 0x3e, 0x3c, 0x01, 0x01, 0x5b, 0x3e,
0x0a, 0x3c, 0x00, 0x01, 0x53, 0x3e, 0x3c, 0x01, 0x01, 0x56, 0x3e, 0x0a,
0x3c, 0x00, 0x01, 0x57, 0x3e, 0x3c, 0x01, 0x01, 0x51, 0x3e, 0x0a, 0x3c,
0x00, 0x01, 0x5b, 0x3e, 0x3c, 0x01, 0x01, 0x4d, 0x3e, 0x0a, 0x3c, 0x00,
0x01, 0x5f, 0x3e, 0x3c, 0x01, 0x01, 0x48, 0x3e, 0x0a, 0x3c, 0x00, 0x01,
0x64, 0x3e, 0x3c, 0x01, 0x01, 0x44, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x68,
0x3e, 0x3c, 0x01, 0x01, 0x3f, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x6c, 0x3e,
0x3c, 0x01, 0x01, 0x3b, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x71, 0x3e, 0x3c,
0x01, 0x01, 0x38, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x76, 0x3e, 0x3c, 0x01,
0x01, 0x35, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x7c, 0x3e, 0x3c, 0x01, 0x01,
0x34, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x82, 0x3e, 0x3c, 0x01, 0x01, 0x33,
0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x88, 0x3e, 0x3c, 0x01, 0x01, 0x32, 0x3e,
0x0a, 0x3c, 0x00, 0x01, 0x8e, 0x3e, 0x3c, 0x01, 0x01, 0x32, 0x3e, 0x0a,
0x3c, 0x00, 0x01, 0x94, 0x3e, 0x3c, 0x01, 0x01, 0x32, 0x3e, 0x0a, 0x3c,
0x00, 0x01, 0x9a, 0x3e, 0x3c, 0x01, 0x01, 0x33, 0x3e, 0x0a, 0x3c, 0x00,
0x01, 0x9f, 0x3e, 0x3c, 0x01, 0x01, 0x34, 0x3e, 0x0a, 0x3c, 0x00, 0x01,
0xa4, 0x3e, 0x3c, 0x01, 0x01, 0x35, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0xa9,
0x3e, 0x3c, 0x01, 0x01, 0x36, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0xad, 0x3e,
0x3c, 0x01, 0x01, 0x37, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0xb0, 0x3e, 0x3c,
0x01, 0x01, 0x38, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0xb3, 0x3e, 0x3c, 0x01,
0x01, 0x39, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0xb4, 0x3e, 0x3c, 0x01, 0x01,
0x39, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0xb5, 0x3e, 0x3c, 0x01, 0x01, 0x39,
0x3e, 0x0a, 0x3c, 0x00, 0x01, 0xb5, 0x3e, 0x3c, 0x01, 0x01, 0x39, 0x3e,
0x0a, 0x3c, 0x00, 0x01, 0xb4, 0x3e, 0x3c, 0x01, 0x01, 0x3a, 0x3e, 0x0a,
0x3c, 0x00, 0x01, 0xb3, 0x3e, 0x3c, 0x01, 0x01, 0x3b, 0x3e, 0x0a, 0x3c,
0x00, 0x01, 0xb2, 0x3e, 0x3c, 0x01, 0x01, 0x3c, 0x3e, 0x0a, 0x3c, 0x00,
0x01, 0xb0, 0x3e, 0x3c, 0x01, 0x01, 0x3e, 0x3e, 0x0a, 0x3c, 0x00, 0x01,
0xae, 0x3e, 0x3c, 0x01, 0x01, 0x40, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0xac,
0x3e, 0x3c, 0x01, 0x01, 0x42, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0xaa, 0x3e,
0x3c, 0x01, 0x01, 0x44, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0xa7, 0x3e, 0x3c,
0x01, 0x01, 0x47, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0xa5, 0x3e, 0x3c, 0x01,
0x01, 0x49, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0xa2, 0x3e, 0x3c, 0x01, 0x01,
0x4c, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x9f, 0x3e, 0x3c, 0x01, 0x01, 0x4f,
0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x9c, 0x3e, 0x3c, 0x01, 0x01, 0x52, 0x3e,
0x0a, 0x3c, 0x00, 0x01, 0x99, 0x3e, 0x3c, 0x01, 0x01, 0x55, 0x3e, 0x0a,
0x3c, 0x00, 0x01, 0x96, 0x3e, 0x3c, 0x01, 0x01, 0x58, 0x3e, 0x0a, 0x3c,
0x00, 0x01, 0x93, 0x3e, 0x3c, 0x01, 0x01, 0x5b, 0x3e, 0x0a, 0x3c, 0x00,
0x01, 0x90, 0x3e, 0x3c, 0x01, 0x01, 0x5e, 0x3e, 0x0a, 0x3c, 0x00, 0x01,
0x8d, 0x3e, 0x3c, 0x01, 0x01, 0x61, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x8a,
0x3e, 0x3c, 0x01, 0x01, 0x64, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x87, 0x3e,
0x3c, 0x01, 0x01, 0x67, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x84, 0x3e, 0x3c,
0x01, 0x01, 0x6a, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x82, 0x3e, 0x3c, 0x01,
0x01, 0x6c, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x80, 0x3e, 0x3c, 0x01, 0x01,
0x6e, 0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x7d, 0x3e, 0x3c, 0x01, 0x01, 0x71,
0x3e, 0x0a, 0x3c, 0x00, 0x01, 0x7c, 0x3e, 0x3c, 0x01, 0x01, 0x72, 0x3e,
0x0a, 0x3c, 0x00, 0x01, 0x7a, 0x3e, 0x3c, 0x01, 0x01, 0x74, 0x3e, 0x0a,
0x3c, 0x00, 0x01, 0x79, 0x3e, 0x3c, 0x01, 0x01, 0x75, 0x3e, 0x0a, 0x3c,
0x00, 0x01, 0x78, 0x3e, 0x3c, 0x01, 0x01, 0x76, 0x3e, 0x0a, 0x3c, 0x00,
0x01, 0x77, 0x3e, 0x3c, 0x01, 0x01, 0x77, 0x3e, 0x0a, 0x3c, 0x00, 0x01,
0x77, 0x3e, 0x3c, 0x01, 0x01, 0x77, 0x3e, 0x0a,
};
18 changes: 14 additions & 4 deletions examples/Scenes/scene-a.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,21 @@ namespace SceneA {

const byte FPS = 30;
const int FRAMES = 100;
const int LENGTH = 600;

// Servo ID: 0
const int Bone[FRAMES] PROGMEM = {
1472, 1473, 1477, 1483, 1492, 1502, 1515, 1529, 1544, 1562, 1580, 1599, 1619, 1640, 1661, 1682, 1704, 1726, 1747, 1768, 1789, 1809, 1828, 1846, 1864, 1879, 1893, 1906, 1916, 1925, 1931, 1935, 1936, 1934, 1926, 1914, 1898, 1879, 1855, 1828, 1799, 1767, 1732, 1695, 1657, 1617, 1577, 1535, 1493, 1451,
1409, 1367, 1327, 1287, 1249, 1212, 1177, 1145, 1116, 1089, 1065, 1046, 1030, 1018, 1010, 1008, 1009, 1013, 1018, 1026, 1035, 1046, 1059, 1073, 1088, 1105, 1122, 1141, 1160, 1179, 1199, 1220, 1240, 1260, 1281, 1301, 1320, 1339, 1358, 1375, 1392, 1407, 1421, 1434, 1445, 1454, 1462, 1467, 1471, 1472,
const byte PROGMEM ANIMATION_DATA[LENGTH] = {
60, 0, 5, 192, 62, 10, 60, 0, 5, 193, 62, 10, 60, 0, 5, 197, 62, 10, 60, 0, 5, 203, 62, 10, 60, 0, 5, 212, 62, 10, 60, 0, 5, 222, 62, 10, 60, 0, 5, 235, 62, 10, 60, 0, 5, 249, 62, 10, 60, 0,
6, 8, 62, 10, 60, 0, 6, 26, 62, 10, 60, 0, 6, 44, 62, 10, 60, 0, 6, 63, 62, 10, 60, 0, 6, 83, 62, 10, 60, 0, 6, 104, 62, 10, 60, 0, 6, 125, 62, 10, 60, 0, 6, 146, 62, 10, 60, 0, 6, 168,
62, 10, 60, 0, 6, 190, 62, 10, 60, 0, 6, 211, 62, 10, 60, 0, 6, 232, 62, 10, 60, 0, 6, 253, 62, 10, 60, 0, 7, 17, 62, 10, 60, 0, 7, 36, 62, 10, 60, 0, 7, 54, 62, 10, 60, 0, 7, 72, 62, 10,
60, 0, 7, 87, 62, 10, 60, 0, 7, 101, 62, 10, 60, 0, 7, 114, 62, 10, 60, 0, 7, 124, 62, 10, 60, 0, 7, 133, 62, 10, 60, 0, 7, 139, 62, 10, 60, 0, 7, 143, 62, 10, 60, 0, 7, 144, 62, 10, 60, 0,
7, 142, 62, 10, 60, 0, 7, 134, 62, 10, 60, 0, 7, 122, 62, 10, 60, 0, 7, 106, 62, 10, 60, 0, 7, 87, 62, 10, 60, 0, 7, 63, 62, 10, 60, 0, 7, 36, 62, 10, 60, 0, 7, 7, 62, 10, 60, 0, 6, 231,
62, 10, 60, 0, 6, 196, 62, 10, 60, 0, 6, 159, 62, 10, 60, 0, 6, 121, 62, 10, 60, 0, 6, 81, 62, 10, 60, 0, 6, 41, 62, 10, 60, 0, 5, 255, 62, 10, 60, 0, 5, 213, 62, 10, 60, 0, 5, 171, 62, 10,
60, 0, 5, 129, 62, 10, 60, 0, 5, 87, 62, 10, 60, 0, 5, 47, 62, 10, 60, 0, 5, 7, 62, 10, 60, 0, 4, 225, 62, 10, 60, 0, 4, 188, 62, 10, 60, 0, 4, 153, 62, 10, 60, 0, 4, 121, 62, 10, 60, 0,
4, 92, 62, 10, 60, 0, 4, 65, 62, 10, 60, 0, 4, 41, 62, 10, 60, 0, 4, 22, 62, 10, 60, 0, 4, 6, 62, 10, 60, 0, 3, 250, 62, 10, 60, 0, 3, 242, 62, 10, 60, 0, 3, 240, 62, 10, 60, 0, 3, 241,
62, 10, 60, 0, 3, 245, 62, 10, 60, 0, 3, 250, 62, 10, 60, 0, 4, 2, 62, 10, 60, 0, 4, 11, 62, 10, 60, 0, 4, 22, 62, 10, 60, 0, 4, 35, 62, 10, 60, 0, 4, 49, 62, 10, 60, 0, 4, 64, 62, 10,
60, 0, 4, 81, 62, 10, 60, 0, 4, 98, 62, 10, 60, 0, 4, 117, 62, 10, 60, 0, 4, 136, 62, 10, 60, 0, 4, 155, 62, 10, 60, 0, 4, 175, 62, 10, 60, 0, 4, 196, 62, 10, 60, 0, 4, 216, 62, 10, 60, 0,
4, 236, 62, 10, 60, 0, 5, 1, 62, 10, 60, 0, 5, 21, 62, 10, 60, 0, 5, 40, 62, 10, 60, 0, 5, 59, 62, 10, 60, 0, 5, 78, 62, 10, 60, 0, 5, 95, 62, 10, 60, 0, 5, 112, 62, 10, 60, 0, 5, 127,
62, 10, 60, 0, 5, 141, 62, 10, 60, 0, 5, 154, 62, 10, 60, 0, 5, 165, 62, 10, 60, 0, 5, 174, 62, 10, 60, 0, 5, 182, 62, 10, 60, 0, 5, 187, 62, 10, 60, 0, 5, 191, 62, 10, 60, 0, 5, 192, 62, 10,
};

} // namespace SceneA
Loading

0 comments on commit 018936c

Please sign in to comment.