nanoFramework.M5StickCPlus 1.1.232

已保留前缀
dotnet add package nanoFramework.M5StickCPlus --version 1.1.232                
NuGet\Install-Package nanoFramework.M5StickCPlus -Version 1.1.232                
此命令旨在在 Visual Studio 的包管理器控制台中使用,因为它使用了 NuGet 模块的 Install-Package 版本。
<PackageReference Include="nanoFramework.M5StickCPlus" Version="1.1.232" />                
对于支持 PackageReference 的项目,将此 XML 节点复制到项目文件中以引用包。
paket add nanoFramework.M5StickCPlus --version 1.1.232                
#r "nuget: nanoFramework.M5StickCPlus, 1.1.232"                
#r 指令可以用于 F# Interactive 和 Polyglot Notebooks。将其复制到交互工具或脚本源代码中以引用包。
// Install nanoFramework.M5StickCPlus as a Cake Addin
#addin nuget:?package=nanoFramework.M5StickCPlus&version=1.1.232

// Install nanoFramework.M5StickCPlus as a Cake Tool
#tool nuget:?package=nanoFramework.M5StickCPlus&version=1.1.232                

Reliability Rating #yourfirstpr Discord

nanoFramework logo


欢迎来到 .NET nanoFramework M5Stack 库存储库

构建状态

组件 构建状态 NuGet 包
nanoFramework.M5Core Build Status NuGet
nanoFramework.M5Stick Build Status NuGet
nanoFramework.M5StickCPlus Build Status NuGet
nanoFramework.M5Core2 Build Status NuGet
nanoFramework.Fire Build Status NuGet
nanoFramework.AtomLite Build Status NuGet
nanoFramework.AtomMatrix Build Status NuGet
nanoFramework.Tough Build Status NuGet

用法

这些 NuGet 包为 M5Stack 产品提供支持

注意 1:在尝试将 NuGet 包添加到您的项目或在使用以下节中介绍的设备(MS Visual Studio,VS)闪烁之前,请打开 VS > 工具 > 选项 > NuGet 包管理器 > 包来源,并确保其中包含指向 https://api.nuget.org/v3/index.json 的条目,如果没有,请添加。注意 2:当在 VS > 项目 > 管理NuGet包时,请确保在包来源下拉菜单(右上方角落)中“nuget.org”被选中。

NuGet包同样支持屏幕,并且需要用正确的镜像进行烧录(使用nanoff dotnet CLI)。在下方的示例中,请将COM3替换为您的设备连接的COM端口的正确编号。(在Windows中,您可以在设备管理器中检查此信息)。

对于M5Core

nanoff --target M5Core --update --serialport COM3

对于M5StickC

nanoff --target M5StickC --update --serialport COM3 --baud 115200

对于M5StickCPlus

nanoff --target M5StickCPlus --update --serialport COM3

对于M5Core2、Tough和Fire

nanoff --target M5Core2 --update --serialport COM3

对于Atom Lite和Matrix

nanoff --target ESP32_PICO --update --serialport COM3

注意3:如果nanoff命令失败,请确保您已经遵循了上面第1条的说明。

一旦您有了NuGet包,您就可以享受访问屏幕、加速度计、获取Grove I2C连接器、在按钮上添加事件。您甚至都不需要担心任何东西,所有操作都会以最透明的方式为您完成!

注意4:您将访问的所有类都使用Lazy模式进行实例化,包括屏幕。这具有使用尽可能少的内存和设置时间的好处。

下方的示例中,我们将使用M5Core或M5Stick作为示例,它们的工作方式都非常相似。

命名空间

确保您将正确的命名空间引用添加到您的C#程序头中,例如:using nanoFramework;

屏幕

要访问屏幕,您需要初始化它(请注意,InitializeScreen()是针对特定目标的)例如:

对于Core

M5Core.InitializeScreen();

对于StickCPlus

M5StickCPlus.InitializeScreen();

初始化后,您可以访问Screen静态类和Console静态类。

Screen类提供了直接在屏幕上写点、画颜色或写文本的基本图形。

例如,您可以像这样在位置0,0处写一个10x10的蓝色方块:

ushort[] toSend = new ushort[100];
ushort blue = ColorUtility.To16Bpp(Color.Blue);

for (int i = 0; i < toSend.Length; i++)
{
    toSend[i] = blue;
}

Screen.Write(0, 0, 10, 10, toSend);

Console类与经典的System.Console类似。为了使用它,您必须使用方法的完全限定名来引用它,如下所示:

nanoFramework.Console.Clear();

// Test the console display
nanoFramework.Console.Write("This is a short text. ");
nanoFramework.Console.ForegroundColor = nanoFramework.Presentation.Media.Color.Red;
nanoFramework.Console.WriteLine("This one displays in red after the previous one and is already at the next line.");
nanoFramework.Console.BackgroundColor = nanoFramework.Presentation.Media.Color.Yellow;
nanoFramework.Console.ForegroundColor = nanoFramework.Presentation.Media.Color.RoyalBlue;
nanoFramework.Console.WriteLine("And this is blue on yellow background");
nanoFramework.Console.ResetColor();
nanoFramework.Console.CursorLeft = 0;
nanoFramework.Console.CursorTop = 8;
nanoFramework.Console.Write("This is white on black again and on 9th line");

注意:您还可以更改默认字体,您需要作为属性提供它。光标位置是以最大的可能字符计算的。

M5Core2和Fire有PSRAM,因此您也可以获得全屏缓冲。请参阅图形示例,了解您可以使用它的所有功能。

如果您在M5Stack的任何设备上有强大的图形需求,您可以调整请求的内存。虽然M5Core2和Fire都有PSRAM并能够容纳很大的量,例如2Mb或更多,而没有PSRAM的设备最多只能超过几Kb或几十Kb。

// This will allocate 2 Mb of memory for the graphics
M5Core2.InitializeScreen(2 * 1024 * 1024);

按钮

除了电源按钮之外,主要按钮都是可访问的。

在M5Stack和Fire中,它们分别称为ButtonLeftButtonCenterButtonRight。您还可以访问事件。例如:

M5Stack.ButtonLeft.Press += (sender, e) =>
{
    Console.ForegroundColor = Color.Yellow;
    Console.CursorLeft = 0;
    Console.CursorTop = 0;
    Console.Write($"Left Pressed  ");
};

在M5StickC/CPlus中,它们分别称为ButtonM5ButtonRight。您可以获取对按钮的状态、事件以及所需的一切信息。例如:

while (!M5StickC.ButtonRight.IsPressed)
{
    Thread.Sleep(10);
}

M5StickC.M5Button.IsHoldingEnabled = true;
M5StickC.M5Button.Holding += (sender, e) =>
{
    Console.Write("M5 button hold long.");
};

在Atom Lite/Matrix中,它称为Button。您可以获取对按钮的状态、事件以及所需的一切信息。例如:

AtomLite.Button.Press +=> (sender, e)
{
    var color = AtomLite.NeoPixel.GetColor();
    if(color.R > 0)
    {
        AtomLite.NeoPixel.SetColor(Color.FromArgb(255, 0, 255, 0));
    }
    else if (color.G > 0)
    {
        AtomLite.NeoPixel.SetColor(Color.FromArgb(255, 0, 0, 255));
    }
    else
    {
        AtomLite.NeoPixel.SetColor(Color.FromArgb(255, 255, 0, 0));
    }
};

注意:M5Core2具有触摸屏,按钮是“虚拟”的。请参阅下一部分了解如何使用它们。

M5Core2触摸面板和按钮

触摸面板与屏幕一起提供。它们同时初始化并激活。要获取触摸事件,您需要注册到TouchEvent事件

M5Core2.InitializeScreen();
M5Core2.TouchEvent += TouchEventCallback;

以下是一个检查您是否在按钮上并且获取各种元素的示例

void TouchEventCallback(object sender, TouchEventArgs e)
{
    const string StrLB = "LEFT BUTTON PRESSED  ";
    const string StrMB = "MIDDLE BUTTON PRESSED  ";
    const string StrRB = "RIGHT BUTTON PRESSED  ";
    const string StrXY1 = "TOUCHED at X= ";
    const string StrXY2 = ",Y= ";
    const string StrID = ",Id= ";
    const string StrDoubleTouch = "Double touch. ";
    const string StrMove = "Moving... ";
    const string StrLiftUp = "Lift up. ";

    Debug.WriteLine($"Touch Panel Event Received Category= {e.EventCategory} Subcategory= {e.TouchEventCategory}");
    Console.CursorLeft = 0;
    Console.CursorTop = 0;

    Debug.WriteLine(StrXY1 + e.X + StrXY2 + e.Y + StrID + e.Id);
    Console.WriteLine(StrXY1 + e.X + StrXY2 + e.Y + StrID + e.Id + "  ");

    if ((e.TouchEventCategory & TouchEventCategory.LeftButton) == TouchEventCategory.LeftButton)
    {
        Debug.WriteLine(StrLB);
        Console.WriteLine(StrLB);
    }
    else if ((e.TouchEventCategory & TouchEventCategory.MiddleButton) == TouchEventCategory.MiddleButton)
    {
        Debug.WriteLine(StrMB);
        Console.WriteLine(StrMB);
    }
    else if ((e.TouchEventCategory & TouchEventCategory.RightButton) == TouchEventCategory.RightButton)
    {
        Debug.WriteLine(StrRB);
        Console.WriteLine(StrRB);
    }

    if ((e.TouchEventCategory & TouchEventCategory.Moving) == TouchEventCategory.Moving)
    {
        Debug.WriteLine(StrMove);
        Console.Write(StrMove);
    }

    if ((e.TouchEventCategory & TouchEventCategory.LiftUp) == TouchEventCategory.LiftUp)
    {
        Debug.WriteLine(StrLiftUp);
        Console.Write(StrLiftUp);
    }

    if ((e.TouchEventCategory & TouchEventCategory.DoubleTouch) == TouchEventCategory.DoubleTouch)
    {
        Debug.WriteLine(StrDoubleTouch);
        Console.Write(StrDoubleTouch);
    }

    Console.WriteLine("                                    ");
    Console.WriteLine("                                    ");
    Console.WriteLine("                                    ");
}

TouchEventCategory枚举是标志,并且可以组合按钮和状态。按钮是互斥的,因此您只能有左、中或右按钮,状态是MovingLiftUpMoving发生在已有接触且触摸点移动的时候。LiftUp将在接触释放时出现。

DoubleTouch是一个特定的标识,表明有另一个接触点事件发生。每个接触点将接收此标志。事件将触发两次,一次针对每个点。在双击上下文中,您可能不会接收到第二个点的LiftUp事件,但您将接收到因双击标志消失和第一个点的最终LiftUp而引起的变化。

电源管理

M5Core和M5StickC/CPlus公开了它们的电源管理元素。除非您了解自己在做什么,否则不建议更改任何默认值。

请参阅M5StickC/CPlus中使用的AXP192的详细示例;M5Core2和IP5306用于M5Core和Fire。

加速度计和陀螺仪

您可以通过以下方式访问加速度计和陀螺仪

var ag = M5Core.AccelerometerGyroscope;
// Do not move the M5Core/M5Stick during the calibration
ag.Calibrate(100);
var acc = ag.GetAccelerometer();
var gyr = ag.GetGyroscope();
Debug.WriteLine($"Accelerometer data x:{acc.X} y:{acc.Y} z:{acc.Z}");
Debug.WriteLine($"Gyroscope data x:{gyr.X} y:{gyr.Y} z:{gyr.Z}\n");

有关此传感器的更多详细用法,请参阅MPU6886文档

磁力计

M5Core有一个磁力计,您也可以访问它

var mag = M5Core.Magnetometer;
// It is more than strongly recommended to calibrate the magnetometer.
// Move the M5Core in all directions to have a proper calibration.
mag.CalibrateMagnetometer(100);
var magVal = mag.ReadMagnetometer();
Console.WriteLine($"x={magVal.X:N2}   ");
Console.WriteLine($"y={magVal.Y:N2}   ");
Console.WriteLine($"Z={magVal.Z:N2}   ");
var headDir = Math.Atan2(magVal.X, magVal.Y) * 180.0 / Math.PI;
Console.WriteLine($"h={headDir:N2}  ");

串行端口

M5Core和M5Core2可以提供一个串行端口,只需像我这样获取它

// You can access any of the Serial Port feature
M5Core.SerialPort.Open(115200);
// Do anything else you need
M5Core.SerialPort.Close();

有关更多信息,请参阅SerialPort文档

ADC通道

M5Core、M5Core2、Fire和Atom Lite/Matrix预先设置了ADC通道,可以像这样访问它们

// This will give you the ADC1 channel 7 which is on pin 35 of M5Core
AdcChannel myChannel = M5Core.GetAdcGpio(35);

有关ADC通道和引脚的映射,请参阅M5Stack文档。

I2C设备/Grove

您可以像这样获取I2cDevice/Grove

// In this example, the I2C address of the device is 0x42:
I2cDevice myDevice = M5Core.GetGrove(0x42);
// replacing GetGrove by GetI2cDevice will have the same impact

SPI设备

M5Core、M5Core2、Fire和Atom Lite/Matrix还提供了一个SpiDevice

// In this case GPIO5 will be used as chip select:
SpiDevice mySpi = M5Core.GetSpiDevice(5);

GPIO控制器

类似于之前,您可以从任何M5Core、M5Core2、Fire和M5StickC/CPlus获取GpioController

// This will open the GPIO 36 as output
var pin5 = M5StickC.GpioController.OpenPin(36, PinMode.Output);

DAC

M5Core、M5Core2、Fire和Atom Lite/Matrix公开了2个DAC,您可以通过Dac1Dac2属性访问它们。有关更多信息,请参阅DAC文档

I2S(声音)

在M5Core2上,可以通过安装包nanoFramework.System.Device.I2s使用I2S播放wav文件。要在M5Core2上播放wav文件,请使用以下初始化

int bckPin = 12;
int dataPin = 2;
int wsPin = 0;
I2sWavPlayer.Bus bus = I2sWavPlayer.Bus.One;
var audioFile = "D:\\Variation-CLJ013901.wav";
using (var player = new I2sWavPlayer(bus, audioFile, bckPin, dataPin, wsPin))
{
    M5Core2.Power.Gpio2Value = PinValue.High; //speaker power on
    player.Play();
    M5Core2.Power.Gpio2Value = PinValue.Low; //speaker power off
}

LED

M5StickC/CPlus公开了一个LED。您可以通过Led属性访问它

// This will toggle the led:
M5StickC.Led.Toggle();

红外LED

M5StickC/CPlus和Atom Lite/Matrix公开了一个红外LED。您可以通过InfraredLed属性访问它。这将为您提供TransmitterChannel。查看示例包以了解如何使用它。

AtomLite上的NeoPixel

Atom Lite公开了一个rgb LED。您可以通过NeoPixel属性访问它

// This will set NeoPixel to green:
AtomLite.NeoPixel.Image.SetPixel(0, 0, Color.Green);
AtomLite.NeoPixel.Update();

AtomMatrix上的RGB LED矩阵和Fire上的LED条形灯

Atom Matrix有一个25 RGB LED的矩阵。LED数组中的LED位置遵循矩阵中的放置位置,0代表位于顶部的左侧,从左到右,从上到下增长。

您可以通过在AtomMatrix上的LedMatrix属性上这样访问它来获取它

// This will set the RGB LED at position 2, 2 to green
AtomMatrix.LedMatrix.Image.SetPixel(2, 2, Color.Green);

同样,您可以在Fire上访问LedBar属性

// This will set the second RGB LED to green
Fire.LedBar.Image.SetPixel(2, 0, Color.Green);

更新完所有要更改的LED后,像这样刷新到LED上

// This will update all RGB LED 
AtomMatrix.LedMatrix.Update();

在Fire上

// This will update all RGB LED 
Fire.LedBar.Update();

SD卡

M5Core、M5Core2、Fire和Tough都有SD卡读取器。您可以简单像这样访问它

SDCard sdCard = M5Core.SDCard;
try
{
    // This will actually mount the SD Card, if no card, you will get an exception
    sdCard.Mount();
    // Mounting properly a card can take a bit of time, so wait for the card to be mounted
    // Note: it is recommended to use a cancellation token or equivalent to make sure you are not in a dead loop
    while (!sdCard.IsMounted)
    {
        Thread.Sleep(10);
    }

    // You can now access the files on the SD Card
    // As an example you can read a json file and deserialize it
    // D: is the drive from the SD Card
    const string ParamFile = "D:\\params.json";
    using FileStream fs = new FileStream(ParamFile, FileMode.Open, FileAccess.Read);
    // In this case, you will need to have a class called Configuration and a properly serialized file
    Configuration config = (Configuration)JsonConvert.DeserializeObject(fs, typeof(Configuration));
}
catch
{
    // Something wrong happened
}

有关如何使用文件系统的更多示例,请参阅此处

反馈和文档

欲提供反馈、报告问题以及了解如何贡献,请参考主仓库

加入我们的Discord社区这里

致谢

本项目的贡献者名单可在CONTRIBUTORS中找到。

许可

nanoFramework 类库在MIT 许可证下授权。

行为准则

本项目采用了贡献者协约定义的行为准则,以阐明我们社区中预期的行为。更多信息请参阅.NET 基金会行为准则

.NET Foundation

本由.NET Foundation 支持。

产品 兼容和额外计算的目标框架版本。
.NET Framework net is compatible. 
兼容目标框架(s)
包含的目标框架(s) (在包中)
了解更多关于目标框架.NET 标准化的信息。

NuGet 包

此包未由任何 NuGet 包使用。

GitHub 仓库

此包未由任何流行的 GitHub 仓库使用。

版本 下载 最后更新
1.1.232 35 7/31/2024
1.1.229 75 7/19/2024
1.1.228 52 7/17/2024
1.1.227 49 7/12/2024
1.1.225 88 6/28/2024
1.1.223 85 6/19/2024
1.1.220 82 5/31/2024
1.1.217 91 5/15/2024
1.1.215 91 5/10/2024
1.1.213 92 4/17/2024
1.1.211 83 4/15/2024
1.1.209 98 4/5/2024
1.1.207 90 3/27/2024
1.1.203 102 2/28/2024
1.1.201 113 1/31/2024
1.1.199 88 1/26/2024
1.1.197 89 1/24/2024
1.1.187 196 11/17/2023
1.1.185 99 11/14/2023
1.1.183 95 11/9/2023
1.1.180 93 11/8/2023
1.1.177 125 10/11/2023
1.1.175 117 9/29/2023
1.1.171 130 9/8/2023
1.1.169 128 9/6/2023
1.1.167 126 8/18/2023
1.1.163 140 8/2/2023
1.1.161 126 7/28/2023
1.1.157 127 7/19/2023
1.1.155 132 7/14/2023
1.1.152 128 6/21/2023
1.1.150 129 6/14/2023
1.1.148 131 6/7/2023
1.1.146 131 5/31/2023
1.1.144 133 5/24/2023
1.1.142 148 5/17/2023
1.1.139 157 5/11/2023
1.1.137 151 5/5/2023
1.1.135 197 4/5/2023
1.1.133 202 3/29/2023
1.1.131 214 3/24/2023
1.1.128 218 3/17/2023
1.1.125 205 3/16/2023
1.1.123 204 3/13/2023
1.1.121 235 3/9/2023
1.1.119 237 2/27/2023
1.1.117 243 2/27/2023
1.1.115 251 2/22/2023
1.1.113 235 2/20/2023
1.1.111 229 2/16/2023
1.1.106 309 1/10/2023
1.1.104 299 1/9/2023
1.1.102 273 1/6/2023
1.1.100 281 1/6/2023
1.1.98 298 1/5/2023
1.1.96 289 12/29/2022
1.1.90 325 11/15/2022
1.1.88 330 11/14/2022
1.1.86 352 11/5/2022
1.1.84 372 11/5/2022
1.1.82 343 11/4/2022
1.1.80 341 11/3/2022
1.1.78 347 11/1/2022
1.1.76 372 10/27/2022
1.1.70 414 10/13/2022
1.1.68 392 10/12/2022
1.1.64 400 10/7/2022
1.1.62 366 10/7/2022
1.1.58 455 9/23/2022
1.1.55 474 9/23/2022
1.1.53 438 9/22/2022
1.1.47 412 9/21/2022
1.1.45 427 9/16/2022
1.1.42 432 9/15/2022
1.1.40 453 9/8/2022
1.1.38 421 9/7/2022
1.1.36 413 9/3/2022
1.1.34 416 8/15/2022
1.1.32 433 8/6/2022
1.1.30 419 8/5/2022
1.1.28 416 8/4/2022
1.1.26 437 8/3/2022
1.1.24 411 8/3/2022
1.1.22 428 8/2/2022
1.1.20 443 7/30/2022
1.1.18 436 7/26/2022
1.1.16 430 7/24/2022
1.1.14 433 7/23/2022
1.1.12 460 7/13/2022
1.1.7 479 7/7/2022
1.1.5 458 7/7/2022
1.1.3 464 7/6/2022
1.1.1 441 7/5/2022
1.0.107.13280 445 7/1/2022
1.0.105.49254 454 6/30/2022
1.0.102.851 438 6/28/2022
1.0.100.17145 432 6/28/2022
1.0.98.48733 444 6/28/2022
1.0.96.40373 444 6/26/2022
1.0.92.59206 437 6/24/2022
1.0.90.38187 429 6/16/2022
1.0.88.50207 416 6/15/2022
1.0.86.52668 416 6/14/2022
1.0.83.14512 424 6/13/2022
1.0.81.41619 446 6/8/2022
1.0.79.53990 437 6/3/2022
1.0.77.26764 453 6/3/2022
1.0.75.37268 450 6/1/2022
1.0.72.43325 424 5/31/2022
1.0.70.15497 432 5/31/2022
1.0.68.55953 451 5/31/2022
1.0.66.24331 456 5/27/2022
1.0.64.6330 420 5/26/2022
1.0.62.28047 423 5/26/2022
1.0.60.49583 433 5/25/2022
1.0.58.20063 450 5/24/2022
1.0.56.35800 436 5/23/2022
1.0.54.60782 434 5/20/2022
1.0.51.48271 449 5/12/2022
1.0.49.30985 440 5/6/2022
1.0.46 449 5/5/2022
1.0.42 462 4/26/2022
1.0.40 432 4/25/2022
1.0.38 431 4/24/2022
1.0.36 435 4/23/2022
1.0.34 430 4/22/2022
1.0.32 455 4/22/2022
1.0.30 454 4/21/2022
1.0.26 480 4/21/2022
1.0.24 458 4/20/2022
1.0.22 438 4/19/2022
1.0.20 447 4/18/2022
1.0.18 458 4/17/2022
1.0.16 453 4/16/2022
1.0.14 435 4/15/2022
1.0.12 446 4/13/2022
1.0.10 444 4/6/2022
1.0.8 437 4/4/2022
1.0.6 441 4/3/2022
1.0.4 444 3/31/2022
1.0.2 450 3/31/2022
1.0.1-preview.68 114 3/30/2022
1.0.1-preview.67 117 3/25/2022
1.0.1-preview.66 116 3/25/2022
1.0.1-preview.65 114 3/25/2022
1.0.1-preview.64 113 3/23/2022
1.0.1-preview.63 95 3/22/2022
1.0.1-preview.62 101 3/21/2022
1.0.1-preview.61 110 3/20/2022
1.0.1-preview.60 111 3/19/2022
1.0.1-preview.58 117 3/16/2022
1.0.1-preview.57 119 3/16/2022
1.0.1-preview.56 114 3/14/2022
1.0.1-preview.55 118 3/14/2022
1.0.1-preview.54 112 3/11/2022
1.0.1-preview.53 111 3/9/2022
1.0.1-preview.52 122 3/8/2022
1.0.1-preview.51 113 3/7/2022
1.0.1-preview.50 106 3/4/2022
1.0.1-preview.49 112 3/3/2022
1.0.1-preview.48 112 2/27/2022
1.0.1-preview.47 109 2/26/2022
1.0.1-preview.46 103 2/25/2022
1.0.1-preview.45 116 2/18/2022
1.0.1-preview.43 111 2/16/2022
1.0.1-preview.42 113 2/12/2022
1.0.1-preview.41 109 2/10/2022
1.0.1-preview.40 117 2/9/2022
1.0.1-preview.39 117 2/8/2022
1.0.1-preview.38 124 2/6/2022
1.0.1-preview.37 128 2/5/2022
1.0.1-preview.36 123 2/4/2022
1.0.1-preview.35 128 2/3/2022
1.0.1-preview.34 131 1/31/2022
1.0.1-preview.32 131 1/31/2022
1.0.1-preview.31 134 1/29/2022
1.0.1-preview.30 125 1/28/2022
1.0.1-preview.28 127 1/28/2022
1.0.1-preview.26 126 1/27/2022
1.0.1-preview.25 129 1/27/2022
1.0.1-preview.24 124 1/26/2022
1.0.1-preview.23 128 1/24/2022
1.0.1-preview.22 129 1/21/2022
1.0.1-preview.21 129 1/21/2022
1.0.1-preview.20 130 1/21/2022
1.0.1-preview.19 126 1/21/2022
1.0.1-preview.18 128 1/20/2022
1.0.1-preview.17 143 1/20/2022
1.0.1-preview.16 132 1/16/2022
1.0.1-preview.15 121 1/14/2022
1.0.1-preview.14 136 1/14/2022
1.0.1-preview.13 134 1/12/2022
1.0.1-preview.12 133 1/11/2022
1.0.1-preview.9 135 1/5/2022
1.0.1-preview.8 130 12/31/2021
1.0.1-preview.7 125 12/31/2021
1.0.1-preview.6 131 12/29/2021
1.0.1-preview.5 130 12/28/2021
1.0.1-preview.3 135 12/27/2021
1.0.0 313 12/23/2021
1.0.0-preview.99 138 12/23/2021
1.0.0-preview.98 138 12/23/2021
1.0.0-preview.94 173 11/12/2021
1.0.0-preview.91 163 11/9/2021
1.0.0-preview.88 166 11/9/2021
1.0.0-preview.86 150 11/3/2021
1.0.0-preview.83 203 10/28/2021
1.0.0-preview.81 187 10/27/2021