11namespace 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