diff --git a/libs/core/_locales/core-jsdoc-strings.json b/libs/core/_locales/core-jsdoc-strings.json index 0a8e4b8f..df251620 100644 --- a/libs/core/_locales/core-jsdoc-strings.json +++ b/libs/core/_locales/core-jsdoc-strings.json @@ -266,9 +266,6 @@ "basic.showAnimation": "Shows a sequence of LED screens as an animation.", "basic.showAnimation|param|interval": "time in milliseconds between each redraw", "basic.showAnimation|param|leds": "pattern of LEDs to turn on/off", - "basic.showArrow": "Draws an arrow on the LED screen", - "basic.showArrow|param|direction": "the direction of the arrow", - "basic.showArrow|param|interval": "the amount of time (milliseconds) to show the icon. Default is 600.", "basic.showCompass": "Draws needle on the screen which always points to north", "basic.showCompass|param|interval": "the amount of time (milliseconds) to show the needle. Default is 600.", "basic.showIcon": "Draws the selected icon on the LED screen", @@ -694,15 +691,25 @@ "storage.getString": "Reads a key value pair from the non volatile storage as a string", "storage.getString|param|key": "the key for accesing the value", "storage.getValue": "Reads a key value pair from the non volatile storage", + "storage.getValueInt": "Reads a key value pair from the non volatile storage", + "storage.getValueInt|param|key": "the key for accesing the value", "storage.getValue|param|key": "the key for accesing the value", + "storage.putNumber": "Saves a key value pair in the non volatile storage", + "storage.putNumber|param|key": "the key for accesing the value", + "storage.putNumber|param|value": "value to store", "storage.putString": "Saves a key value pair in the non volatile storage", "storage.putString|param|key": "the key for accesing the value", "storage.putString|param|value": "value to store", "storage.putValue": "Saves a key value pair in the non volatile storage", + "storage.putValueInt": "Saves a key value pair in the non volatile storage", + "storage.putValueInt|param|key": "the key for accesing the value", + "storage.putValueInt|param|value": "value to store", "storage.putValue|param|key": "the key for accesing the value", "storage.putValue|param|value": "value to store", "storage.remove": "Reads a key value pair from the non volatile storage", - "storage.removeKey": "Deletes the key from the non volatile storage", - "storage.removeKey|param|key": "the key for accesing the value", + "storage.removeKeyInt": "Deletes the key from the non volatile storage", + "storage.removeKeyInt|param|key": "the key for accesing the value", + "storage.removeKeyStr": "Deletes the key from the non volatile storage", + "storage.removeKeyStr|param|key": "the key for accesing the value", "storage.remove|param|key": "the key for accesing the value" } \ No newline at end of file diff --git a/libs/core/_locales/core-strings.json b/libs/core/_locales/core-strings.json index f92eb5bd..ad179d75 100644 --- a/libs/core/_locales/core-strings.json +++ b/libs/core/_locales/core-strings.json @@ -22,14 +22,6 @@ "Array.shift|block": "get and remove first value from %list", "Array.unshift|block": "%list| insert %value| at beginning", "Array|block": "Array", - "ArrowNames.East|block": "East", - "ArrowNames.NorthEast|block": "North East", - "ArrowNames.NorthWest|block": "North West", - "ArrowNames.North|block": "North", - "ArrowNames.SouthEast|block": "South East", - "ArrowNames.SouthWest|block": "South West", - "ArrowNames.South|block": "South", - "ArrowNames.West|block": "West", "BaudRate.BaudRate115200|block": "115200", "BaudRate.BaudRate1200|block": "1200", "BaudRate.BaudRate14400|block": "14400", @@ -117,43 +109,16 @@ "IconNames.ArrowSouth|block": "arrow south", "IconNames.ArrowWest|block": "arrow west", "IconNames.Asleep|block": "asleep", - "IconNames.Butterfly|block": "butterfly", - "IconNames.Chessboard|block": "chess board", "IconNames.Confused|block": "confused", - "IconNames.Cow|block": "cow", - "IconNames.Diamond|block": "diamond", - "IconNames.Duck|block": "duck", - "IconNames.EigthNote|block": "eigth note", "IconNames.Fabulous|block": "fabulous", - "IconNames.Ghost|block": "ghost", - "IconNames.Giraffe|block": "giraffe", "IconNames.Happy|block": "happy", "IconNames.Heart|block": "heart", - "IconNames.House|block": "house", - "IconNames.LeftTriangle|block": "left triangle", "IconNames.Meh|block": "meh", "IconNames.No|block": "no", - "IconNames.Pitchfork|block": "pitchfork", - "IconNames.QuarterNote|block": "quarter note", - "IconNames.Rabbit|block": "rabbit", - "IconNames.Rollerskate|block": "roller skate", "IconNames.Sad|block": "sad", - "IconNames.Scissors|block": "scissors", "IconNames.Silly|block": "silly", - "IconNames.Skull|block": "skull", - "IconNames.SmallDiamond|block": "small diamond", "IconNames.SmallHeart|block": "small heart", - "IconNames.SmallSquare|block": "small square", - "IconNames.Snake|block": "snake", - "IconNames.Square|block": "square", - "IconNames.StickFigure|block": "stick figure", "IconNames.Surprised|block": "surprised", - "IconNames.Sword|block": "sword", - "IconNames.TShirt|block": "t-shirt", - "IconNames.Target|block": "target", - "IconNames.Tortoise|block": "tortoise", - "IconNames.Triangle|block": "triangle", - "IconNames.Umbrella|block": "umbrella", "IconNames.Yes|block": "yes", "Image.scrollImage|block": "scroll image %sprite(myImage)|with offset %frameoffset|and interval (ms) %interval", "Image.showImage|block": "show image %sprite(myImage)|at offset %offset ||and interval (ms) %interval", @@ -279,7 +244,6 @@ "basic.rgbw|block": "red %red|green %green|blue %blue|white %white", "basic.rgb|block": "red %red|green %green|blue %blue", "basic.setLedColor|block": "set led to %color=colorNumberPicker", - "basic.showArrow|block": "show arrow %i=device_arrow", "basic.showCompass|block": "show compass needle for $interval|ms", "basic.showIcon|block": "show icon %i || for %interval ms", "basic.showLeds|block": "show leds", @@ -328,8 +292,6 @@ "game.setScore|block": "set score %points", "game.startCountdown|block": "start countdown|(ms) %duration", "game|block": "game", - "images.arrowImage|block": "arrow image %i", - "images.arrowNumber|block": "%arrow", "images.createBigImage|block": "create big image", "images.createImage|block": "create image", "images.iconImage|block": "icon image %i", @@ -447,12 +409,16 @@ "serial.writeString|block": "serial|write string %text", "serial.writeValue|block": "serial|write value %name|= %value", "serial|block": "serial", - "storage.getNumber|block": "read from %key as number", - "storage.getString|block": "read from %key", + "storage.getNumber|block": "read from number %key", + "storage.getString|block": "read from string %key", + "storage.getValueInt|block": "get number from %key", "storage.getValue|block": "get number from %key", - "storage.putString|block": "Save into %key a value of %value", - "storage.putValue|block": "Put into %key a value of %value as number", - "storage.removeKey|block": "Clear %key", + "storage.putNumber|block": "Save into number %key a value of %value", + "storage.putString|block": "Save into string %key a value of %value", + "storage.putValueInt|block": "Put into %key a value of %value as Int", + "storage.putValue|block": "Put into %key a value of %value as String", + "storage.removeKeyInt|block": "Clear number %key", + "storage.removeKeyStr|block": "Clear string %key", "storage.remove|block": "remove %key", "storage|block": "storage", "{id:category}AnalogInPin": "AnalogInPin", diff --git a/libs/core/icons.ts b/libs/core/icons.ts index 45968f42..658343ab 100644 --- a/libs/core/icons.ts +++ b/libs/core/icons.ts @@ -65,87 +65,6 @@ enum IconNames { //% block="meh" //% jres=icons.meh Meh, - //% block="t-shirt" - //% jres=icons.tshirt - TShirt, - //% block="roller skate" - //% jres=icons.rollerskate - Rollerskate, - //% block="duck" - //% jres=icons.duck - Duck, - //% block="house" - //% jres=icons.house - House, - //% block="tortoise" - //% jres=icons.tortoise - Tortoise, - //% block="butterfly" - //% jres=icons.butterfly - Butterfly, - //% block="stick figure" - //% jres=icons.stickfigure - StickFigure, - //% block="ghost" - //% jres=icons.ghost - Ghost, - //% block="sword" - //% jres=icons.sword - Sword, - //% block="giraffe" - //% jres=icons.giraffe - Giraffe, - //% block="skull" - //% jres=icons.skull - Skull, - //% block="umbrella" - //% jres=icons.umbrella - Umbrella, - //% block="snake" - //% jres=icons.snake - Snake, - //% block="rabbit" - //% jres=icons.rabbit - Rabbit, - //% block="cow" - //% jres=icons.cow - Cow, - //% block="quarter note" - //% jres=icons.quarternote - QuarterNote, - //% block="eigth note" - //% jres=icons.eigthnote - EigthNote, - //% block="pitchfork" - //% jres=icons.pitchfork - Pitchfork, - //% block="target" - //% jres=icons.target - Target, - //% block="triangle" - //% jres=icons.triangle - Triangle, - //% block="left triangle" - //% jres=icons.lefttriangle - LeftTriangle, - //% block="chess board" - //% jres=icons.chessboard - Chessboard, - //% block="diamond" - //% jres=icons.diamond - Diamond, - //% block="small diamond" - //% jres=icons.smalldiamond - SmallDiamond, - //% block="square" - //% jres=icons.square - Square, - //% block="small square" - //% jres=icons.smallsquare - SmallSquare, - //% block="scissors" - //% jres=icons.scissors - Scissors, //% block="arrow north" //% jres=icons.arrownorth ArrowNorth, @@ -172,25 +91,6 @@ enum IconNames { ArrowNorthWest } -enum ArrowNames { - //% blockIdentity=images.arrowNumber block="North" - North = 0, - //% blockIdentity=images.arrowNumber block="North East" - NorthEast, - //% blockIdentity=images.arrowNumber block="East" - East, - //% blockIdentity=images.arrowNumber block="South East" - SouthEast, - //% blockIdentity=images.arrowNumber block="South" - South, - //% blockIdentity=images.arrowNumber block="South West" - SouthWest, - //% blockIdentity=images.arrowNumber block="West" - West, - //% blockIdentity=images.arrowNumber block="North West" - NorthWest, -} - namespace basic { @@ -216,93 +116,10 @@ namespace basic { res.showImage(0, interval) } - /** - * Draws an arrow on the LED screen - * @param direction the direction of the arrow - * @param interval the amount of time (milliseconds) to show the icon. Default is 600. - */ - //% weight=50 blockGap=8 - //% blockId=basic_show_arrow - //% block="show arrow %i=device_arrow" - //% parts="ledmatrix" - //% help=basic/show-arrow - //% deprecated - //% group="LED matrix" - export function showArrow(direction: number, interval = 600) { - let res = images.arrowImage(direction) - res.showImage(0, interval) - } - } namespace images { - - //% weight=50 blockGap=8 - //% help=images/arrow-image - //% blockId=builtin_arrow_image block="arrow image %i" - //% deprecated=true - export function arrowImage(i: ArrowNames): Image { - switch (i) { - // compass directions - case ArrowNames.North: return images.createImage(` - . . # . . - . # # # . - # . # . # - . . # . . - . . # . .`); - case ArrowNames.NorthEast: return images.createImage(` - . . # # # - . . . # # - . . # . # - . # . . . - # . . . .`); - case ArrowNames.East: return images.createImage(` - . . # . . - . . . # . - # # # # # - . . . # . - . . # . .`); - case ArrowNames.SouthEast: return images.createImage(` - # . . . . - . # . . . - . . # . # - . . . # # - . . # # #`); - case ArrowNames.South: return images.createImage(` - . . # . . - . . # . . - # . # . # - . # # # . - . . # . .`); - case ArrowNames.SouthWest: return images.createImage(` - . . . . # - . . . # . - # . # . . - # # . . . - # # # . .`); - case ArrowNames.West: return images.createImage(` - . . # . . - . # . . . - # # # # # - . # . . . - . . # . .`); - case ArrowNames.NorthWest: return images.createImage(` - # # # . . - # # . . . - # . # . . - . . . # . - . . . . #`); - default: return images.createImage(` - . . . . . - . . . . . - . . . . . - . . . . . - . . . . . - `); - } - } - //% weight=50 blockGap=8 //% help=images/icon-image @@ -393,173 +210,6 @@ namespace images { . . # . . . # . # . # . . . #`); - case IconNames.Triangle: return images.createImage(` - . . . . . - . . # . . - . # . # . - # # # # # - . . . . .`); - case IconNames.LeftTriangle: return images.createImage(` - # . . . . - # # . . . - # . # . . - # . . # . - # # # # #`); - case IconNames.Chessboard: return images.createImage(` - . # . # . - # . # . # - . # . # . - # . # . # - . # . # .`); - case IconNames.Diamond: return images.createImage(` - . . # . . - . # . # . - # . . . # - . # . # . - . . # . .`); - case IconNames.SmallDiamond: return images.createImage(` - . . . . . - . . # . . - . # . # . - . . # . . - . . . . .`); - case IconNames.Square: return images.createImage(` - # # # # # - # . . . # - # . . . # - # . . . # - # # # # #`); - case IconNames.SmallSquare: return images.createImage(` - . . . . . - . # # # . - . # . # . - . # # # . - . . . . .`); - - case IconNames.Scissors: return images.createImage(` - # # . . # - # # . # . - . . # . . - # # . # . - # # . . #`); - // The following images were designed by Abbie Brooks. - case IconNames.TShirt: return images.createImage(` - # # . # # - # # # # # - . # # # . - . # # # . - . # # # .`); - case IconNames.Rollerskate: return images.createImage(` - . . . # # - . . . # # - # # # # # - # # # # # - . # . # .`); - case IconNames.Duck: return images.createImage(` - . # # . . - # # # . . - . # # # # - . # # # . - . . . . .`); - case IconNames.House: return images.createImage(` - . . # . . - . # # # . - # # # # # - . # # # . - . # . # .`); - case IconNames.Tortoise: return images.createImage(` - . . . . . - . # # # . - # # # # # - . # . # . - . . . . .`); - case IconNames.Butterfly: return images.createImage(` - # # . # # - # # # # # - . . # . . - # # # # # - # # . # #`); - case IconNames.StickFigure: return images.createImage(` - . . # . . - # # # # # - . . # . . - . # . # . - # . . . #`); - case IconNames.Ghost: return images.createImage(` - . # # # . - # . # . # - # # # # # - # # # # # - # . # . #`); - case IconNames.Sword: return images.createImage(` - . . # . . - . . # . . - . . # . . - . # # # . - . . # . .`); - case IconNames.Giraffe: return images.createImage(` - # # . . . - . # . . . - . # . . . - . # # # . - . # . # .`); - case IconNames.Skull: return images.createImage(` - . # # # . - # . # . # - # # # # # - . # # # . - . # # # .`); - case IconNames.Umbrella: return images.createImage(` - . # # # . - # # # # # - . . # . . - # . # . . - # # # . .`); - case IconNames.Snake: return images.createImage(` - # # . . . - # # . # # - . # . # . - . # # # . - . . . . .`); - // animals - case IconNames.Rabbit: return images.createImage(` - # . # . . - # . # . . - # # # # . - # # . # . - # # # # .`); - case IconNames.Cow: return images.createImage(` - # . . . # - # . . . # - # # # # # - . # # # . - . . # . .`); - // musical notes - case IconNames.QuarterNote: return images.createImage(` - . . # . . - . . # . . - . . # . . - # # # . . - # # # . .`); - case IconNames.EigthNote: return images.createImage(` - . . # . . - . . # # . - . . # . # - # # # . . - # # # . .`); - // other icons - case IconNames.Pitchfork: return images.createImage(` - # . # . # - # . # . # - # # # # # - . . # . . - . . # . .`); - case IconNames.Target: return images.createImage(` - . . # . . - . # # # . - # # . # # - . # # # . - . . # . .`); // arrows case IconNames.ArrowNorth: return images.createImage(` . . # . . @@ -619,12 +269,4 @@ namespace images { } } - //% weight=50 blockGap=8 - //% help=images/arrow-number - //% blockId=device_arrow block="%arrow" - //% shim=TD_ID - //% deprecated=true - export function arrowNumber(arrow: ArrowNames): number { - return arrow; - } } diff --git a/libs/core/shims.d.ts b/libs/core/shims.d.ts index ff4a0af4..d4bd878a 100644 --- a/libs/core/shims.d.ts +++ b/libs/core/shims.d.ts @@ -1322,13 +1322,26 @@ declare namespace storage { * @param value value to store */ //% weight=100 blockGap=16 - //% block="Put into %key a value of %value as number" - //% blockId=storage_put_value + //% block="Put into %key a value of %value as String" + //% blockId=storage_put_value_str //% //% group="Put" //% blockHidden=true value.defl=0 shim=storage::putValue function putValue(key: string, value?: string): void; + /** + * Saves a key value pair in the non volatile storage + * @param key the key for accesing the value + * @param value value to store + */ + //% weight=100 blockGap=16 + //% block="Put into %key a value of %value as Int" + //% blockId=storage_put_value_int + //% + //% group="Put" + //% blockHidden=true value.defl=0 shim=storage::putValueInt + function putValueInt(key: string, value?: int32): void; + /** * Reads a key value pair from the non volatile storage * @param key the key for accesing the value @@ -1340,6 +1353,17 @@ declare namespace storage { //% blockHidden=true shim=storage::getValue function getValue(key: string): string; + /** + * Reads a key value pair from the non volatile storage + * @param key the key for accesing the value + */ + //% weight=100 blockGap=16 + //% block="get number from %key" + //% blockId=storage_get_value_int + //% group="Get" + //% blockHidden=true shim=storage::getValueInt + function getValueInt(key: string): int32; + /** * Reads a key value pair from the non volatile storage * @param key the key for accesing the value diff --git a/libs/core/storage.cpp b/libs/core/storage.cpp index a1cb7112..90acd2c5 100644 --- a/libs/core/storage.cpp +++ b/libs/core/storage.cpp @@ -10,13 +10,30 @@ namespace storage { * @param value value to store */ //% weight=100 blockGap=16 - //% block="Put into %key a value of %value as number" - //% blockId=storage_put_value + //% block="Put into %key a value of %value as String" + //% blockId=storage_put_value_str //% value.defl=0 //% group="Put" //% blockHidden=true void putValue(String key, String value) { - uBit.storage.put(MSTR(key), (uint8_t *)&value, sizeof(int)); + ManagedString managedKey = MSTR(key); + uBit.storage.put(managedKey, (uint8_t *)&value, sizeof(int)); + } + + /** + * Saves a key value pair in the non volatile storage + * @param key the key for accesing the value + * @param value value to store + */ + //% weight=100 blockGap=16 + //% block="Put into %key a value of %value as Int" + //% blockId=storage_put_value_int + //% value.defl=0 + //% group="Put" + //% blockHidden=true + void putValueInt(String key, int value) { + ManagedString managedKey = MSTR(key); + uBit.storage.put(managedKey, (uint8_t *)&value, sizeof(int)); } /** @@ -40,6 +57,27 @@ namespace storage { } } + /** + * Reads a key value pair from the non volatile storage + * @param key the key for accesing the value + */ + //% weight=100 blockGap=16 + //% block="get number from %key" + //% blockId=storage_get_value_int + //% group="Get" + //% blockHidden=true + int getValueInt(String key) { + KeyValuePair* data = uBit.storage.get(MSTR(key)); + int stored; + if(data == NULL) { + return 0; + } else { + memcpy(&stored, data->value, sizeof(int)); + delete data; + return stored; + } + } + /** * Reads a key value pair from the non volatile storage * @param key the key for accesing the value diff --git a/libs/core/storage.ts b/libs/core/storage.ts index e85c4c9c..f8f298dd 100644 --- a/libs/core/storage.ts +++ b/libs/core/storage.ts @@ -15,8 +15,8 @@ enum StorageSlots { s7 = 6, } -let storages = ['s1', 's2', 's3', 's4', 's5', 's6', 's7', 's8', 's9', 's10', 's11', 's12']; - +let storagesStr = ['s1', 's2', 's3', 's4', 's5', 's6', 's7']; +let storagesInt = ['i1', 'i2', 'i3', 'i4', 'i5', 'i6', 'i7']; /** * Provides access to persistent storage functionality. */ @@ -30,12 +30,27 @@ namespace storage { * @param value value to store */ //% weight=100 blockGap=16 - //% block="Save into %key a value of %value" + //% block="Save into string %key a value of %value" //% blockId=storage_put_string //% value.shadowOptions.toString=true //% group="Put" export function putString(key: StorageSlots, value: string) : void { - putValue(storages[key], value); + putValue(storagesStr[key], value); + } + + + /** + * Saves a key value pair in the non volatile storage + * @param key the key for accesing the value + * @param value value to store + */ + //% weight=100 blockGap=16 + //% block="Save into number %key a value of %value" + //% blockId=storage_put_number + //% group="Put" + export function putNumber(key: StorageSlots, value: number) : void { + let managedValue = (value * 1000) | 0; + putValueInt(storagesInt[key], managedValue); } /** @@ -43,16 +58,12 @@ namespace storage { * @param key the key for accesing the value */ //% weight=100 blockGap=16 - //% block="read from %key as number" + //% block="read from number %key" //% blockId=storage_get_number //% group="Get" export function getNumber(key: StorageSlots) : number { - let value = getValue(storages[key]); - if(value === '') { - return 0; - } else { - return parseFloat(value); - } + let value = getValueInt(storagesInt[key]); + return value / 1000; } /** @@ -60,11 +71,11 @@ namespace storage { * @param key the key for accesing the value */ //% weight=100 blockGap=16 - //% block="read from %key" + //% block="read from string %key" //% blockId=storage_get_string //% group="Get" export function getString(key: StorageSlots) : string { - return getValue(storages[key]); + return getValue(storagesStr[key]); } /** @@ -72,11 +83,23 @@ namespace storage { * @param key the key for accesing the value */ //% weight=100 blockGap=16 - //% block="Clear %key" - //% blockId=storage_remove_key + //% block="Clear string %key" + //% blockId=storage_remove_key_string //% group="Remove" - export function removeKey(key: StorageSlots) : void { - remove(storages[key]); + export function removeKeyStr(key: StorageSlots) : void { + remove(storagesStr[key]); + } + + /** + * Deletes the key from the non volatile storage + * @param key the key for accesing the value + */ + //% weight=100 blockGap=16 + //% block="Clear number %key" + //% blockId=storage_remove_key_int + //% group="Remove" + export function removeKeyInt(key: StorageSlots) : void { + remove(storagesInt[key]); } diff --git a/sim/state/storage.ts b/sim/state/storage.ts index 52cc5d63..5c67a83c 100644 --- a/sim/state/storage.ts +++ b/sim/state/storage.ts @@ -1,10 +1,15 @@ namespace pxsim.storage { - export function putValue(key: string, value: string) : void { + function putValue(key: string, value: string) : void { sessionStorage.setItem('simulatorValue_'+key, value); } + function putValueInt(key: string, value: number) : void { + sessionStorage.setItem('simulatorValue_'+key, value+""); + } + + export function getValue(key: string) : string { if(sessionStorage.getItem('simulatorValue_'+key)) { return sessionStorage.getItem('simulatorValue_'+key); @@ -13,7 +18,19 @@ namespace pxsim.storage { } } - export function remove(key: string) : void { + export function getValueInt(key: string) : number { + if(sessionStorage.getItem('simulatorValue_'+key)) { + return parseFloat(sessionStorage.getItem('simulatorValue_'+key)); + } else { + return 0; + } + } + + export function removeStr(key: string) : void { + sessionStorage.removeItem('simulatorValue_'+key); + } + + export function removeInt(key: string) : void { sessionStorage.removeItem('simulatorValue_'+key); }