diff --git a/LightDataTransfer.sln b/LightDataTransfer.sln new file mode 100644 index 0000000..40c2ad7 --- /dev/null +++ b/LightDataTransfer.sln @@ -0,0 +1,16 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LightDataTransfer", "LightDataTransfer\LightDataTransfer.csproj", "{26F6569B-0003-489E-AEA1-3F7112188B44}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {26F6569B-0003-489E-AEA1-3F7112188B44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {26F6569B-0003-489E-AEA1-3F7112188B44}.Debug|Any CPU.Build.0 = Debug|Any CPU + {26F6569B-0003-489E-AEA1-3F7112188B44}.Release|Any CPU.ActiveCfg = Release|Any CPU + {26F6569B-0003-489E-AEA1-3F7112188B44}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/LightDataTransfer/LightDataTransfer.csproj b/LightDataTransfer/LightDataTransfer.csproj new file mode 100644 index 0000000..d0eac1a --- /dev/null +++ b/LightDataTransfer/LightDataTransfer.csproj @@ -0,0 +1,18 @@ + + + + Exe + net7.0 + enable + ARM64 + enable + Linux + + + + + + + + + diff --git a/LightDataTransfer/Program.cs b/LightDataTransfer/Program.cs new file mode 100644 index 0000000..a45c85f --- /dev/null +++ b/LightDataTransfer/Program.cs @@ -0,0 +1,70 @@ +using System.Device.Gpio; +using System.Device.Gpio.Drivers; +using MorseSharp; +using MorseSharp.Converter; + +TextMorseConverter converter = new TextMorseConverter(Language.English); +const int redPin = 17; +const int greenPin = 27; +const int bluePin = 22; + +// Здесь мы используем SysFsDriver, потому что он быстрее всех остальных +// https://github.com/dotnet/iot/issues/1490 +using GpioController gpio = new GpioController(PinNumberingScheme.Logical, new SysFsDriver()); + +gpio.OpenPin(redPin, PinMode.Output); +gpio.OpenPin(greenPin, PinMode.Output); +gpio.OpenPin(bluePin, PinMode.Output); +gpio.Write(redPin, PinValue.High); +gpio.Write(greenPin, PinValue.High); +gpio.Write(bluePin, PinValue.High); + +var morse = await converter.ConvertTextToMorse("Hello world"); +Console.WriteLine("Morse: " + morse); +while (true) +{ + Console.Write("Enter speed multiplier: "); + int speedMultiplier = Convert.ToInt32(Console.ReadLine()); + Console.Write("Morse: "); + for (int i = 0; i < morse.Length; i++) + { + Console.Write(morse[i]); + switch (morse[i]) + { + case '.': + gpio.Write(redPin, PinValue.Low); + Thread.Sleep(1 * speedMultiplier); + if (morse[i + 1] is not ' ' and not '/') + { + gpio.Write(redPin, PinValue.High); + Thread.Sleep(1 * speedMultiplier); + } + break; + case '_': + gpio.Write(redPin, PinValue.Low); + Thread.Sleep(3 * speedMultiplier); + if (morse[i + 1] is not ' ' and not '/') + { + gpio.Write(redPin, PinValue.High); + Thread.Sleep(1 * speedMultiplier); + } + break; + case '/': + gpio.Write(redPin, PinValue.High); + Thread.Sleep(1 * speedMultiplier); + break; + case ' ': + gpio.Write(redPin, PinValue.High); + Thread.Sleep(3 * speedMultiplier); + break; + default: + Console.WriteLine("Unknown morse code: " + morse[i]); + break; + } + } + Console.WriteLine(); +} + +gpio.ClosePin(redPin); +gpio.ClosePin(greenPin); +gpio.ClosePin(bluePin); \ No newline at end of file diff --git a/README.md b/README.md index aaa79d6..67ec191 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,34 @@ # MorseToLed +Проект который я делал для конкурса от НКБ ВС, нужно было передать информацию через свет с помощью linux устройства (передатчик) и android смартфона (получатель). + +Здесь представлена часть проекта для Raspberry Pi, которая передаёт информацию с помощью морзе. Далее планировалось перенести код в библиотеку и написать в ней небольшой преобразователь текста в морзе, а так же обеспечить возможность подключить внешний преобразователь текста в морзе в стиле Dependency Injection. + +## Но + +На этапе разработки приложения под android, я хотел попробовать Avalonia framework, но он оказался ещё слишком сырым для android, поэтому я перешёл на maui, но и там всё было не так просто. Так же 2-х летнее расставание с Android studio не позволило бы мне написать приложение в оставшееся время. + +# Результат + +* Этот репозиторий +* Добавление поддержки русского языка в библиотеку [MorseSharp](https://github.com/p6laris/MorseSharp) + +Для откладки этого проекта я нашёл готовое приложение на android [MorseBuddy](https://github.com/anantaraha/morsebuddy) и с его помощью добился скорости стабильного чтения в 65 у.е. + +Так же вдохновлялся этим проектом, из которого подчеркнул идею считывания на основе яркости пикселя ([ссылка](https://www.codeproject.com/Articles/46174/Computer-Vision-Decoding-a-Morse-Code-Flashing-LED)) + +Результат + +### Скорость + +В коде 1 у.е.равна 1 мс + +`В скобочках результат при 65 у.е.` +* `.` - 1 у.е. (65 мс) +* `-` - 3 у.е. (195 мс) +* `меж слов` - 1 у.е. (65 м + два пробела = 195 мс) +* `пробел` - 1 у.е. (65 м) + +# Библиотеки + +* [MorseSharp](https://github.com/p6laris/MorseSharp) \ No newline at end of file diff --git a/img/demo.jpg b/img/demo.jpg new file mode 100644 index 0000000..bdd93db Binary files /dev/null and b/img/demo.jpg differ