nanoFramework.M5Core2 1.1.232
前缀已预留
dotnet add package nanoFramework.M5Core2 --version 1.1.232
NuGet\Install-Package nanoFramework.M5Core2 -Version 1.1.232
<PackageReference Include="nanoFramework.M5Core2" Version="1.1.232" />
paket add nanoFramework.M5Core2 --version 1.1.232
#r "nuget: nanoFramework.M5Core2, 1.1.232"
// Install nanoFramework.M5Core2 as a Cake Addin #addin nuget:?package=nanoFramework.M5Core2&version=1.1.232 // Install nanoFramework.M5Core2 as a Cake Tool #tool nuget:?package=nanoFramework.M5Core2&version=1.1.232
欢迎使用 .NET nanoFramework M5Stack 库存储库
构建状态
组件 | 构建状态 | NuGet 包 |
---|---|---|
nanoFramework.M5Core | ||
nanoFramework.M5Stick | ||
nanoFramework.M5StickCPlus | ||
nanoFramework.M5Core2 | ||
nanoFramework.Fire | ||
nanoFramework.AtomLite | ||
nanoFramework.AtomMatrix | ||
nanoFramework.Tough |
用法
这些 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并能容纳2 Mb或更多的非常大的数据量,而没有PSRAM的设备则不能超过几个Kb或几十Kb。
// This will allocate 2 Mb of memory for the graphics
M5Core2.InitializeScreen(2 * 1024 * 1024);
按钮
除了电源按钮之外的主要按钮都被公开了。
在M5Stack和Fire上,它们被称为ButtonLeft
、ButtonCenter
和ButtonRight
。您可以访问事件。例如:
M5Stack.ButtonLeft.Press += (sender, e) =>
{
Console.ForegroundColor = Color.Yellow;
Console.CursorLeft = 0;
Console.CursorTop = 0;
Console.Write($"Left Pressed ");
};
在M5StickC/CPlus上,它们被称为ButtonM5
和ButtonRight
。您可以访问按钮的状态、事件以及您需要的所有东西。例如:
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
枚举是一个标记,可以组合按钮和状态。按钮是互斥的,因此您只能有左键、中键或右键,状态有 Moving
和 LiftUp
。 Moving
发生在已经建立接触且触摸点在移动时。当接触被释放时会出现 LiftUp
。
DoubleTouch
是一个特定类型,它会通知您有另一个接触点发生。每个接触点都会接收到此标记。该事件将触发2次,每次为一个点。在双触控上下文中,您可能无法获得第二个点的 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();
有关更多信息,请参阅 串行端口文档。
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,您可以通过 Dac1
和 Dac2
属性访问它们。有关更多信息,请参阅 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 是左上角的 LED,从左到右,从上到下增长。
您可以通过 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是兼容的。 |
-
- nanoFramework.CoreLibrary (>= 1.15.5)
- nanoFramework.Graphics (>= 1.2.15)
- nanoFramework.Hardware.Esp32 (>= 1.6.19)
- nanoFramework.Iot.Device.Axp192 (>= 1.2.601)
- nanoFramework.Iot.Device.Bmm150 (>= 1.2.590)
- nanoFramework.Iot.Device.Button (>= 1.2.570)
- nanoFramework.Iot.Device.Ft6xx6x (>= 1.2.422)
- nanoFramework.Iot.Device.Mpu6886 (>= 1.2.601)
- nanoFramework.Iot.Device.Rtc (>= 1.2.601)
- nanoFramework.System.Device.Adc (>= 1.1.11)
- nanoFramework.System.Device.Dac (>= 1.5.13)
- nanoFramework.System.Device.Pwm (>= 1.1.10)
- nanoFramework.System.Device.Spi (>= 1.3.52)
- nanoFramework.System.Diagnostics.Stopwatch (>= 1.2.586)
- nanoFramework.System.IO.FileSystem (>= 1.1.54)
- nanoFramework.System.IO.Ports (>= 1.1.86)
- nanoFramework.System.Threading (>= 1.1.32)
NuGet包
此包不用于任何NuGet包。
GitHub仓库 (1)
显示依赖nanoFramework.M5Core2的最受欢迎的GitHub仓库前1名。
仓库 | 星星 |
---|---|
nanoframework/nanoFramework.IoT.Device
📦 本仓库包含各种传感器、芯片、显示器、帽子以及驱动程序的 .NET nanoFramework 实现
|
版本 | 下载 | 最后更新 |
---|---|---|
1.1.232 | 87 | 7/31/2024 |
1.1.229 | 98 | 7/19/2024 |
1.1.228 | 75 | 7/17/2024 |
1.1.227 | 76 | 7/12/2024 |
1.1.225 | 143 | 6/28/2024 |
1.1.223 | 111 | 6/19/2024 |
1.1.220 | 148 | 5/31/2024 |
1.1.217 | 174 | 5/15/2024 |
1.1.215 | 103 | 5/10/2024 |
1.1.213 | 188 | 4/17/2024 |
1.1.211 | 109 | 4/15/2024 |
1.1.209 | 113 | 4/5/2024 |
1.1.207 | 139 | 3/27/2024 |
1.1.203 | 236 | 2/28/2024 |
1.1.201 | 220 | 1/31/2024 |
1.1.199 | 102 | 1/26/2024 |
1.1.197 | 103 | 1/24/2024 |
1.1.187 | 481 | 11/17/2023 |
1.1.185 | 155 | 11/14/2023 |
1.1.183 | 170 | 11/9/2023 |
1.1.180 | 132 | 11/8/2023 |
1.1.177 | 360 | 10/11/2023 |
1.1.175 | 208 | 9/29/2023 |
1.1.171 | 241 | 9/8/2023 |
1.1.169 | 162 | 9/6/2023 |
1.1.167 | 262 | 8/18/2023 |
1.1.163 | 385 | 8/2/2023 |
1.1.161 | 173 | 7/28/2023 |
1.1.157 | 228 | 7/19/2023 |
1.1.155 | 184 | 7/14/2023 |
1.1.152 | 430 | 6/21/2023 |
1.1.150 | 224 | 6/14/2023 |
1.1.148 | 192 | 6/7/2023 |
1.1.146 | 238 | 5/31/2023 |
1.1.144 | 354 | 5/24/2023 |
1.1.142 | 198 | 5/17/2023 |
1.1.139 | 204 | 5/11/2023 |
1.1.137 | 204 | 5/5/2023 |
1.1.135 | 339 | 4/5/2023 |
1.1.133 | 269 | 3/29/2023 |
1.1.131 | 227 | 3/24/2023 |
1.1.128 | 265 | 3/17/2023 |
1.1.125 | 277 | 3/16/2023 |
1.1.123 | 275 | 3/13/2023 |
1.1.121 | 456 | 3/9/2023 |
1.1.119 | 493 | 2/27/2023 |
1.1.117 | 272 | 2/27/2023 |
1.1.115 | 271 | 2/22/2023 |
1.1.113 | 292 | 2/20/2023 |
1.1.111 | 270 | 2/16/2023 |
1.1.106 | 458 | 1/10/2023 |
1.1.104 | 315 | 1/9/2023 |
1.1.102 | 324 | 1/6/2023 |
1.1.100 | 326 | 1/6/2023 |
1.1.98 | 330 | 1/5/2023 |
1.1.96 | 552 | 12/29/2022 |
1.1.90 | 556 | 11/15/2022 |
1.1.88 | 374 | 11/14/2022 |
1.1.86 | 415 | 11/5/2022 |
1.1.84 | 375 | 11/5/2022 |
1.1.82 | 386 | 11/4/2022 |
1.1.80 | 359 | 11/3/2022 |
1.1.78 | 362 | 11/1/2022 |
1.1.76 | 409 | 10/27/2022 |
1.1.70 | 514 | 10/13/2022 |
1.1.68 | 420 | 10/12/2022 |
1.1.64 | 426 | 10/7/2022 |
1.1.62 | 394 | 10/7/2022 |
1.1.58 | 537 | 9/23/2022 |
1.1.55 | 847 | 9/23/2022 |
1.1.53 | 462 | 9/22/2022 |
1.1.47 | 417 | 9/21/2022 |
1.1.45 | 477 | 9/16/2022 |
1.1.42 | 466 | 9/15/2022 |
1.1.40 | 476 | 9/8/2022 |
1.1.38 | 416 | 9/7/2022 |
1.1.36 | 431 | 9/3/2022 |
1.1.34 | 476 | 8/15/2022 |
1.1.32 | 472 | 8/6/2022 |
1.1.30 | 675 | 8/5/2022 |
1.1.28 | 417 | 8/4/2022 |
1.1.26 | 444 | 8/3/2022 |
1.1.24 | 435 | 8/3/2022 |
1.1.22 | 452 | 8/2/2022 |
1.1.20 | 458 | 7/30/2022 |
1.1.18 | 467 | 7/26/2022 |
1.1.16 | 441 | 7/24/2022 |
1.1.14 | 434 | 7/23/2022 |
1.1.12 | 478 | 7/13/2022 |
1.1.7 | 617 | 7/7/2022 |
1.1.5 | 453 | 7/7/2022 |
1.1.3 | 465 | 7/6/2022 |
1.1.1 | 450 | 7/5/2022 |
1.0.107.13280 | 469 | 7/1/2022 |
1.0.105.49254 | 466 | 6/30/2022 |
1.0.102.851 | 452 | 6/28/2022 |
1.0.100.17145 | 443 | 6/28/2022 |
1.0.98.48733 | 493 | 6/28/2022 |
1.0.96.40373 | 485 | 6/26/2022 |
1.0.92.59206 | 458 | 6/24/2022 |
1.0.90.38187 | 479 | 6/16/2022 |
1.0.88.50207 | 466 | 6/15/2022 |
1.0.86.52668 | 434 | 6/14/2022 |
1.0.83.14512 | 484 | 6/13/2022 |
1.0.81.41619 | 487 | 6/8/2022 |
1.0.79.53990 | 484 | 6/3/2022 |
1.0.77.26764 | 446 | 6/3/2022 |
1.0.75.37268 | 447 | 6/1/2022 |
1.0.72.43325 | 460 | 5/31/2022 |
1.0.70.15497 | 454 | 5/31/2022 |
1.0.68.55953 | 466 | 5/31/2022 |
1.0.66.24331 | 454 | 5/27/2022 |
1.0.64.6330 | 446 | 5/26/2022 |
1.0.62.28047 | 474 | 5/26/2022 |
1.0.60.49583 | 469 | 5/25/2022 |
1.0.58.20063 | 455 | 5/24/2022 |
1.0.56.35800 | 475 | 5/23/2022 |
1.0.54.60782 | 472 | 5/20/2022 |
1.0.51.48271 | 474 | 5/12/2022 |
1.0.49.30985 | 542 | 5/6/2022 |
1.0.46 | 489 | 5/5/2022 |
1.0.42 | 506 | 4/26/2022 |
1.0.40 | 473 | 4/25/2022 |
1.0.38 | 481 | 4/24/2022 |
1.0.36 | 470 | 4/23/2022 |
1.0.34 | 489 | 4/22/2022 |
1.0.32 | 473 | 4/22/2022 |
1.0.30 | 467 | 4/21/2022 |
1.0.26 | 481 | 4/21/2022 |
1.0.24 | 469 | 4/20/2022 |
1.0.22 | 456 | 4/19/2022 |
1.0.20 | 474 | 4/18/2022 |
1.0.18 | 526 | 4/17/2022 |
1.0.16 | 471 | 4/16/2022 |
1.0.14 | 473 | 4/15/2022 |
1.0.12 | 501 | 4/13/2022 |
1.0.10 | 500 | 4/6/2022 |
1.0.8 | 491 | 4/4/2022 |
1.0.6 | 477 | 4/3/2022 |
1.0.4 | 478 | 3/31/2022 |
1.0.2 | 136 | 3/31/2022 |
1.0.1-preview.68 | 109 | 3/30/2022 |
1.0.1-preview.67 | 126 | 3/25/2022 |
1.0.1-preview.66 | 117 | 3/25/2022 |
1.0.1-preview.65 | 110 | 3/25/2022 |
1.0.1-preview.64 | 109 | 3/23/2022 |
1.0.1-preview.63 | 91 | 3/22/2022 |
1.0.1-preview.62 | 102 | 3/21/2022 |
1.0.1-preview.61 | 112 | 3/20/2022 |
1.0.1-preview.60 | 113 | 3/19/2022 |
1.0.1-preview.58 | 114 | 3/16/2022 |
1.0.1-preview.57 | 118 | 3/16/2022 |
1.0.1-preview.56 | 119 | 3/14/2022 |
1.0.1-preview.55 | 116 | 3/14/2022 |
1.0.1-preview.54 | 108 | 3/11/2022 |
1.0.1-preview.53 | 109 | 3/9/2022 |
1.0.1-preview.52 | 119 | 3/8/2022 |
1.0.1-preview.51 | 119 | 3/7/2022 |
1.0.1-preview.50 | 112 | 3/4/2022 |
1.0.1-preview.49 | 122 | 3/3/2022 |
1.0.1-preview.48 | 117 | 2/27/2022 |
1.0.1-preview.47 | 109 | 2/26/2022 |
1.0.1-preview.46 | 107 | 2/25/2022 |
1.0.1-preview.45 | 117 | 2/18/2022 |
1.0.1-preview.43 | 114 | 2/16/2022 |
1.0.1-preview.42 | 119 | 2/12/2022 |
1.0.1-preview.41 | 113 | 2/10/2022 |
1.0.1-preview.40 | 128 | 2/9/2022 |
1.0.1-preview.39 | 124 | 2/8/2022 |
1.0.1-preview.38 | 123 | 2/6/2022 |
1.0.1-preview.37 | 123 | 2/5/2022 |
1.0.1-preview.36 | 127 | 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 | 131 | 1/31/2022 |
1.0.1-preview.31 | 187 | 1/29/2022 |
1.0.1-preview.30 | 139 | 1/28/2022 |
1.0.1-preview.28 | 137 | 1/28/2022 |
1.0.1-preview.26 | 141 | 1/27/2022 |
1.0.1-preview.25 | 147 | 1/27/2022 |
1.0.1-preview.24 | 146 | 1/26/2022 |
1.0.1-preview.23 | 144 | 1/24/2022 |
1.0.1-preview.22 | 141 | 1/21/2022 |
1.0.1-preview.21 | 132 | 1/21/2022 |
1.0.1-preview.20 | 136 | 1/21/2022 |
1.0.1-preview.19 | 128 | 1/21/2022 |
1.0.1-preview.18 | 135 | 1/20/2022 |
1.0.1-preview.17 | 132 | 1/20/2022 |
1.0.1-preview.16 | 136 | 1/16/2022 |
1.0.1-preview.15 | 143 | 1/14/2022 |
1.0.1-preview.14 | 133 | 1/14/2022 |
1.0.1-preview.13 | 139 | 1/12/2022 |
1.0.1-preview.12 | 151 | 1/11/2022 |
1.0.1-preview.9 | 147 | 1/5/2022 |
1.0.1-preview.8 | 137 | 12/31/2021 |
1.0.1-preview.7 | 132 | 12/31/2021 |
1.0.1-preview.6 | 144 | 12/29/2021 |
1.0.1-preview.5 | 127 | 12/28/2021 |
1.0.1-preview.3 | 138 | 12/27/2021 |
1.0.0 | 378 | 12/23/2021 |
1.0.0-preview.99 | 139 | 12/23/2021 |
1.0.0-preview.98 | 140 | 12/23/2021 |
1.0.0-preview.94 | 180 | 11/12/2021 |
1.0.0-preview.91 | 169 | 11/9/2021 |
1.0.0-preview.88 | 176 | 11/9/2021 |