Skip to content

Commit 69b2d19

Browse files
committed
remove abstraction
1 parent 6ed67c2 commit 69b2d19

6 files changed

Lines changed: 119 additions & 134 deletions

File tree

EPXDisplay.ts

Lines changed: 100 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -1,144 +1,117 @@
11
namespace EPXDisplay {
22

3-
export class MicrobitSparkletDisplay {
4-
public strip: neopixel.Strip;
5-
6-
constructor() {
7-
this.strip = neopixel.create(DigitalPin.P0, 256, NeoPixelMode.RGB);
8-
pins.digitalWritePin(DigitalPin.P1, 1);
3+
/**
4+
* Play an animation.
5+
*/
6+
//% blockId="expressivepixels_play" block="play animation %strip %anim" blockGap=8
7+
//% weight=88
8+
export function play(strip: neopixel.Strip, anim: Buffer) {
9+
const length = anim.length;
10+
let palette = [];
11+
12+
// Extract FrameCount
13+
let FrameCount = (anim[1] << 8) | anim[0];
14+
let LoopCount = anim[2];
15+
let FrameRate = anim[3];
16+
let PaletteLengthBytes = (anim[5] << 8) | anim[4];
17+
let PaletteLength = PaletteLengthBytes / 3;
18+
let FramesLength = (anim[9] << 24) | (anim[8] << 16) | (anim[7] << 8) | anim[6];
19+
let frameDelayMS = 1000.0 / FrameRate;
20+
let originalBrightness = strip.brightness;
21+
let activeFadeStep = 0;
22+
let activeFadeWait = 0;
23+
24+
let paletteOffset = 10;
25+
for(let idx = 0; idx < PaletteLength;idx++) {
26+
const c = neopixel.rgb(anim[paletteOffset + idx * 3], anim[paletteOffset + idx * 3 + 1], anim[paletteOffset + idx * 3 + 2]);
27+
palette.push(c);
928
}
10-
11-
/**
12-
* Play an animation.
13-
*/
14-
//% blockId="expressivepixels_play" block="%display|play animation %animation" blockGap=8
15-
//% weight=88
16-
play(anim: Buffer) {
17-
const length = anim.length;
18-
let palette = [];
19-
20-
// Extract FrameCount
21-
let FrameCount = (anim[1] << 8) | anim[0];
22-
let LoopCount = anim[2];
23-
let FrameRate = anim[3];
24-
let PaletteLengthBytes = (anim[5] << 8) | anim[4];
25-
let PaletteLength = PaletteLengthBytes / 3;
26-
let FramesLength = (anim[9] << 24) | (anim[8] << 16) | (anim[7] << 8) | anim[6];
27-
let frameDelayMS = 1000.0 / FrameRate;
28-
let originalBrightness = this.strip.brightness;
29-
let activeFadeStep = 0;
30-
let activeFadeWait = 0;
31-
32-
let paletteOffset = 10;
33-
for(let idx = 0; idx < PaletteLength;idx++) {
34-
const c = neopixel.rgb(anim[paletteOffset + idx * 3], anim[paletteOffset + idx * 3 + 1], anim[paletteOffset + idx * 3 + 2]);
35-
palette.push(c);
36-
}
37-
38-
if(LoopCount == 0)
39-
LoopCount = 1;
40-
while(LoopCount-- > 0)
41-
{
42-
let framesOffset = paletteOffset + PaletteLengthBytes;
43-
let frameByteOffset = 0;
44-
let paletteIdx = 0;
45-
46-
for(let frameIdx = 0; frameIdx < FrameCount;frameIdx++) {
47-
let framePixelCount = 0;
48-
let frameType = anim[framesOffset + frameByteOffset];
49-
frameByteOffset++;
5029

51-
if(frameType == 73) {
52-
// Read the number of pixels represented in this frame type
53-
framePixelCount = (anim[framesOffset + frameByteOffset + 0] << 8) | anim[framesOffset + frameByteOffset + 1];
54-
frameByteOffset += 2;
55-
56-
// Process each represented pixel
57-
for(let pixelPos = 0; pixelPos < framePixelCount;pixelPos++) {
58-
paletteIdx = anim[framesOffset + frameByteOffset];
59-
frameByteOffset++;
60-
if(paletteIdx < PaletteLength) {
61-
this.strip.setPixelColor(pixelPos, palette[paletteIdx]);
62-
}
30+
if(LoopCount == 0)
31+
LoopCount = 1;
32+
while(LoopCount-- > 0)
33+
{
34+
let framesOffset = paletteOffset + PaletteLengthBytes;
35+
let frameByteOffset = 0;
36+
let paletteIdx = 0;
37+
38+
for(let frameIdx = 0; frameIdx < FrameCount;frameIdx++) {
39+
let framePixelCount = 0;
40+
let frameType = anim[framesOffset + frameByteOffset];
41+
frameByteOffset++;
42+
43+
if(frameType == 73) {
44+
// Read the number of pixels represented in this frame type
45+
framePixelCount = (anim[framesOffset + frameByteOffset + 0] << 8) | anim[framesOffset + frameByteOffset + 1];
46+
frameByteOffset += 2;
47+
48+
// Process each represented pixel
49+
for(let pixelPos = 0; pixelPos < framePixelCount;pixelPos++) {
50+
paletteIdx = anim[framesOffset + frameByteOffset];
51+
frameByteOffset++;
52+
if(paletteIdx < PaletteLength) {
53+
strip.setPixelColor(pixelPos, palette[paletteIdx]);
6354
}
64-
this.strip.show();
65-
basic.pause(frameDelayMS);
6655
}
67-
else if(frameType== 80) { // 'P'
68-
let logicalPixelPosition = 0;
69-
70-
// Read the number of pixels represented in this frame type
71-
framePixelCount = (anim[framesOffset + frameByteOffset] << 8) | anim[framesOffset + frameByteOffset + 1];
72-
frameByteOffset += 2;
56+
strip.show();
57+
basic.pause(frameDelayMS);
58+
}
59+
else if(frameType== 80) { // 'P'
60+
let logicalPixelPosition = 0;
7361

74-
for(let pixelPos2 = 0; pixelPos2 < framePixelCount;pixelPos2++) {
75-
// Process each represented pixel
76-
if(this.strip._length > 256) {
77-
logicalPixelPosition = (anim[framesOffset + frameByteOffset] << 8) | anim[framesOffset + frameByteOffset + 1];
78-
frameByteOffset += 2;
79-
}
80-
else {
81-
logicalPixelPosition = anim[framesOffset + frameByteOffset];
82-
frameByteOffset ++;
83-
}
62+
// Read the number of pixels represented in this frame type
63+
framePixelCount = (anim[framesOffset + frameByteOffset] << 8) | anim[framesOffset + frameByteOffset + 1];
64+
frameByteOffset += 2;
8465

85-
paletteIdx = anim[framesOffset + frameByteOffset];
86-
frameByteOffset++;
87-
if(paletteIdx < PaletteLength) {
88-
this.strip.setPixelColor(logicalPixelPosition, palette[paletteIdx]);
89-
}
66+
for(let pixelPos2 = 0; pixelPos2 < framePixelCount;pixelPos2++) {
67+
// Process each represented pixel
68+
if(strip._length > 256) {
69+
logicalPixelPosition = (anim[framesOffset + frameByteOffset] << 8) | anim[framesOffset + frameByteOffset + 1];
70+
frameByteOffset += 2;
71+
}
72+
else {
73+
logicalPixelPosition = anim[framesOffset + frameByteOffset];
74+
frameByteOffset ++;
9075
}
91-
this.strip.show();
92-
basic.pause(frameDelayMS);
93-
}
94-
else if(frameType == 68 ) { // 'D'
95-
// Read the frame delay
96-
let waitMillis = (anim[framesOffset + frameByteOffset] << 8) | anim[framesOffset + frameByteOffset + 1];
97-
frameByteOffset += 2;
98-
basic.pause(waitMillis);
99-
}
100-
else if(frameType == 70) { 'F'
101-
// Read the frame delay
102-
let activeFadeMillis = (anim[framesOffset + frameByteOffset] << 8) | anim[framesOffset + frameByteOffset + 1];
103-
frameByteOffset += 2;
104-
105-
activeFadeStep = 9;
106-
activeFadeWait = (activeFadeMillis + 0.1) / 10;
107-
108-
while(activeFadeStep > 0)
109-
{
110-
let stepBrightness = ((originalBrightness + 0.1) / 10) * activeFadeStep;
111-
this.strip.setBrightness(stepBrightness);
112-
this.strip.show();
11376

114-
basic.pause(activeFadeWait);
115-
activeFadeStep--;
77+
paletteIdx = anim[framesOffset + frameByteOffset];
78+
frameByteOffset++;
79+
if(paletteIdx < PaletteLength) {
80+
strip.setPixelColor(logicalPixelPosition, palette[paletteIdx]);
11681
}
117-
this.strip.setBrightness(originalBrightness);
118-
this.strip.clear();
119-
this.strip.show();
12082
}
83+
strip.show();
84+
basic.pause(frameDelayMS);
85+
}
86+
else if(frameType == 68 ) { // 'D'
87+
// Read the frame delay
88+
let waitMillis = (anim[framesOffset + frameByteOffset] << 8) | anim[framesOffset + frameByteOffset + 1];
89+
frameByteOffset += 2;
90+
basic.pause(waitMillis);
91+
}
92+
else if(frameType == 70) { 'F'
93+
// Read the frame delay
94+
let activeFadeMillis = (anim[framesOffset + frameByteOffset] << 8) | anim[framesOffset + frameByteOffset + 1];
95+
frameByteOffset += 2;
96+
97+
activeFadeStep = 9;
98+
activeFadeWait = (activeFadeMillis + 0.1) / 10;
99+
100+
while(activeFadeStep > 0)
101+
{
102+
let stepBrightness = ((originalBrightness + 0.1) / 10) * activeFadeStep;
103+
strip.setBrightness(stepBrightness);
104+
strip.show();
105+
106+
basic.pause(activeFadeWait);
107+
activeFadeStep--;
108+
}
109+
strip.setBrightness(originalBrightness);
110+
strip.clear();
111+
strip.show();
121112
}
122-
this.strip.clear();
123113
}
114+
strip.clear();
124115
}
125-
126-
/**
127-
* Send all the changes to the display
128-
*/
129-
//% blockId="EPXDisplay_show" block="%display|show" blockGap=8
130-
//% weight=87
131-
show() {
132-
this.strip.show();
133-
}
134-
}
135-
136-
137-
//% blockId="EPXDisplay_create" block="Sparklet Display"
138-
//% help=github:github.com/microsoft/ExpressivePixelsMakeCode/blob/master/HelpStartup.md
139-
//% weight=90 blockGap=8
140-
//% blockSetVariable=display
141-
export function createMicrobitSparkletDisplay(): MicrobitSparkletDisplay {
142-
return new MicrobitSparkletDisplay();
143116
}
144117
}

0 commit comments

Comments
 (0)