nanoFramework.M5Core 1.1.232

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

// Install nanoFramework.M5Core as a Cake Tool
#tool nuget:?package=nanoFramework.M5Core&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包,您就可以 Enjoy 访问屏幕、加速度计、获取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,可以容纳多达2 Mb或更多的非常大的数值,但那些没有的不能超过几个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 枚举是一个标志,可以组合按钮和状态。按钮是互斥的,因此您只能有左、中或右按钮,状态有 MovingLiftUp。当触摸点移动时发生 Moving。当接触释放时将出现 LiftUp

DoubleTouch 是一个特征,让您知道在发生另一个接触点。每个接触点都将接收到此标志。事件会触发两次,一次针对每个点。在双触控上下文中,您可能不会获得第二个点的 LiftUp 事件,但您会在 DoubleTouch 标志消失和第一个点的最终 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);

请参阅 M5Stack 文档以了解 ADC 通道和引脚的映射。

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 的位置遵循矩阵中的放置,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 Foundation 行为准则

.NET Foundation

本项目得到.NET Foundation的支持。

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

NuGet包

此包未由任何NuGet包使用。

GitHub仓库

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

版本 下载 最后更新
1.1.232 59 7/31/2024
1.1.229 66 7/19/2024
1.1.228 63 7/17/2024
1.1.227 62 7/12/2024
1.1.225 85 6/28/2024
1.1.223 78 6/19/2024
1.1.220 87 5/31/2024
1.1.217 92 5/15/2024
1.1.215 73 5/10/2024
1.1.213 97 4/17/2024
1.1.211 91 4/15/2024
1.1.209 94 4/5/2024
1.1.207 80 3/27/2024
1.1.203 101 2/28/2024
1.1.201 109 1/31/2024
1.1.199 95 1/26/2024
1.1.197 88 1/24/2024
1.1.187 223 11/17/2023
1.1.185 120 11/14/2023
1.1.183 123 11/9/2023
1.1.180 122 11/8/2023
1.1.177 155 10/11/2023
1.1.175 147 9/29/2023
1.1.171 160 9/8/2023
1.1.169 130 9/6/2023
1.1.167 170 8/18/2023
1.1.163 188 8/2/2023
1.1.161 154 7/28/2023
1.1.157 168 7/19/2023
1.1.155 157 7/14/2023
1.1.152 163 6/21/2023
1.1.150 131 6/14/2023
1.1.148 167 6/7/2023
1.1.146 154 5/31/2023
1.1.144 171 5/24/2023
1.1.142 176 5/17/2023
1.1.139 160 5/11/2023
1.1.137 197 5/5/2023
1.1.135 223 4/5/2023
1.1.133 240 3/29/2023
1.1.131 260 3/24/2023
1.1.128 244 3/17/2023
1.1.125 239 3/16/2023
1.1.123 244 3/13/2023
1.1.121 262 3/9/2023
1.1.119 280 2/27/2023
1.1.117 280 2/27/2023
1.1.115 293 2/22/2023
1.1.113 267 2/20/2023
1.1.111 247 2/16/2023
1.1.106 314 1/10/2023
1.1.104 302 1/9/2023
1.1.102 316 1/6/2023
1.1.100 306 1/6/2023
1.1.98 331 1/5/2023
1.1.96 322 12/29/2022
1.1.90 372 11/15/2022
1.1.88 363 11/14/2022
1.1.86 363 11/5/2022
1.1.84 399 11/5/2022
1.1.82 350 11/4/2022
1.1.80 374 11/3/2022
1.1.78 388 11/1/2022
1.1.76 384 10/27/2022
1.1.70 435 10/13/2022
1.1.68 423 10/12/2022
1.1.64 385 10/7/2022
1.1.62 411 10/7/2022
1.1.58 492 9/23/2022
1.1.55 466 9/23/2022
1.1.53 445 9/22/2022
1.1.47 463 9/21/2022
1.1.45 467 9/16/2022
1.1.42 460 9/15/2022
1.1.40 437 9/8/2022
1.1.38 446 9/7/2022
1.1.36 447 9/3/2022
1.1.34 467 8/15/2022
1.1.32 480 8/6/2022
1.1.30 431 8/5/2022
1.1.28 432 8/4/2022
1.1.26 474 8/3/2022
1.1.24 438 8/3/2022
1.1.22 452 8/2/2022
1.1.20 488 7/30/2022
1.1.18 441 7/26/2022
1.1.16 435 7/24/2022
1.1.14 453 7/23/2022
1.1.12 475 7/13/2022
1.1.7 466 7/7/2022
1.1.5 495 7/7/2022
1.1.3 493 7/6/2022
1.1.1 472 7/5/2022
1.0.107.13280 460 7/1/2022
1.0.105.49254 506 6/30/2022
1.0.102.851 490 6/28/2022
1.0.100.17145 479 6/28/2022
1.0.98.48733 489 6/28/2022
1.0.96.40373 464 6/26/2022
1.0.92.59206 488 6/24/2022
1.0.90.38187 469 6/16/2022
1.0.88.50207 446 6/15/2022
1.0.86.52668 444 6/14/2022
1.0.83.14512 494 6/13/2022
1.0.81.41619 452 6/8/2022
1.0.79.53990 459 6/3/2022
1.0.77.26764 448 6/3/2022
1.0.75.37268 468 6/1/2022
1.0.72.43325 462 5/31/2022
1.0.70.15497 454 5/31/2022
1.0.68.55953 477 5/31/2022
1.0.66.24331 445 5/27/2022
1.0.64.6330 464 5/26/2022
1.0.62.28047 433 5/26/2022
1.0.60.49583 439 5/25/2022
1.0.58.20063 451 5/24/2022
1.0.56.35800 457 5/23/2022
1.0.54.60782 454 5/20/2022
1.0.51.48271 482 5/12/2022
1.0.49.30985 464 5/6/2022
1.0.46 455 5/5/2022
1.0.42 468 4/26/2022
1.0.40 460 4/25/2022
1.0.38 464 4/24/2022
1.0.36 464 4/23/2022
1.0.34 462 4/22/2022
1.0.32 443 4/22/2022
1.0.30 453 4/21/2022
1.0.26 475 4/21/2022
1.0.24 453 4/20/2022
1.0.22 471 4/19/2022
1.0.20 453 4/18/2022
1.0.18 455 4/17/2022
1.0.16 459 4/16/2022
1.0.14 464 4/15/2022
1.0.12 510 4/13/2022
1.0.10 464 4/6/2022
1.0.8 466 4/4/2022
1.0.6 466 4/3/2022
1.0.4 472 3/31/2022
1.0.2 465 3/31/2022
1.0.1-preview.68 114 3/30/2022
1.0.1-preview.67 123 3/25/2022
1.0.1-preview.66 120 3/25/2022
1.0.1-preview.65 111 3/25/2022
1.0.1-preview.64 122 3/23/2022
1.0.1-preview.63 105 3/22/2022
1.0.1-preview.62 108 3/21/2022
1.0.1-preview.61 117 3/20/2022
1.0.1-preview.60 113 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 117 3/14/2022
1.0.1-preview.55 116 3/14/2022
1.0.1-preview.54 119 3/11/2022
1.0.1-preview.53 117 3/9/2022
1.0.1-preview.52 131 3/8/2022
1.0.1-preview.51 120 3/7/2022
1.0.1-preview.50 112 3/4/2022
1.0.1-preview.49 114 3/3/2022
1.0.1-preview.48 125 2/27/2022
1.0.1-preview.47 120 2/26/2022
1.0.1-preview.46 122 2/25/2022
1.0.1-preview.45 125 2/18/2022
1.0.1-preview.43 119 2/16/2022
1.0.1-preview.42 129 2/12/2022
1.0.1-preview.41 114 2/10/2022
1.0.1-preview.40 116 2/9/2022
1.0.1-preview.39 124 2/8/2022
1.0.1-preview.38 124 2/6/2022
1.0.1-preview.37 124 2/5/2022
1.0.1-preview.36 130 2/4/2022
1.0.1-preview.35 129 2/3/2022
1.0.1-preview.34 131 1/31/2022
1.0.1-preview.32 129 1/31/2022
1.0.1-preview.31 134 1/29/2022
1.0.1-preview.30 130 1/28/2022
1.0.1-preview.28 128 1/28/2022
1.0.1-preview.26 130 1/27/2022
1.0.1-preview.25 142 1/27/2022
1.0.1-preview.24 135 1/26/2022
1.0.1-preview.23 131 1/24/2022
1.0.1-preview.22 134 1/21/2022
1.0.1-preview.21 129 1/21/2022
1.0.1-preview.20 132 1/21/2022
1.0.1-preview.19 137 1/21/2022
1.0.1-preview.18 143 1/20/2022
1.0.1-preview.17 135 1/20/2022
1.0.1-preview.16 137 1/16/2022
1.0.1-preview.15 130 1/14/2022
1.0.1-preview.14 131 1/14/2022
1.0.1-preview.13 135 1/12/2022
1.0.1-preview.12 137 1/11/2022
1.0.1-preview.9 135 1/5/2022
1.0.1-preview.8 138 12/31/2021
1.0.1-preview.7 130 12/31/2021
1.0.1-preview.6 138 12/29/2021
1.0.1-preview.5 137 12/28/2021