ree
This commit is contained in:
parent
d9c3891bec
commit
40d5e5fd10
Binary file not shown.
@ -12,8 +12,10 @@
|
||||
#define WRITE 2
|
||||
|
||||
char count = 0;
|
||||
unsigned short delayAmount = 100;
|
||||
char textToSent[] = "The Commodore 64, also known as the C64, is an 8-bit home computer introduced in January 1982 by Commodore International. It has been listed in the Guinness World Records as the best-selling desktop computer model of all time, with independent estimates placing the number sold between 12.5 and 17 million units.";
|
||||
unsigned short delayAmount = 2;
|
||||
const char* ArduinoPingMsg = "ping F28339B0-78C6-4445-905A-76F77F667D95";
|
||||
const char* ArduinoPongMsg = "pong F28339B0-78C6-4445-905A-76F77F667D95";
|
||||
|
||||
|
||||
char mode;
|
||||
|
||||
@ -68,13 +70,27 @@ void initMode(const char modeToSet) {
|
||||
|
||||
}
|
||||
|
||||
String waitForLine() {
|
||||
return Serial.readStringUntil('\n');
|
||||
}
|
||||
|
||||
void waitForPing() {
|
||||
while (true) {
|
||||
while (Serial.available() == 0) {} //wait for data available
|
||||
String pingStr = waitForLine(); //read until timeout
|
||||
pingStr.trim();
|
||||
if (pingStr == ArduinoPingMsg) {
|
||||
Serial.println(ArduinoPongMsg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void setup() {
|
||||
delay(2000);
|
||||
mode = STANDBY;
|
||||
initMode(mode);
|
||||
|
||||
Serial.begin(9600);
|
||||
|
||||
waitForPing();
|
||||
}
|
||||
|
||||
void send4Bit(char c) {
|
||||
@ -94,8 +110,8 @@ void send4Bit(char c) {
|
||||
|
||||
digitalWrite(AR, HIGH);
|
||||
|
||||
// while (digitalRead(CR) == LOW) {}
|
||||
// while (digitalRead(CR) == HIGH) {}
|
||||
while (digitalRead(CR) == LOW) {}
|
||||
while (digitalRead(CR) == HIGH) {}
|
||||
|
||||
delay(delayAmount);
|
||||
|
||||
@ -120,8 +136,7 @@ void sendByte(char a, char byte) {
|
||||
send4Bit(lower);
|
||||
}
|
||||
|
||||
void startWrite() {
|
||||
Serial.print("start\n");
|
||||
void startWrite(String str) {
|
||||
mode = WRITE;
|
||||
initMode(mode);
|
||||
digitalWrite(AR, LOW);
|
||||
@ -129,7 +144,7 @@ void startWrite() {
|
||||
int i = 0;
|
||||
char c, sc;
|
||||
do {
|
||||
c = textToSent[i];
|
||||
c = str[i];
|
||||
sc = getScreenCode(c);
|
||||
i++;
|
||||
sendByte(c, sc);
|
||||
@ -147,16 +162,23 @@ void startWrite() {
|
||||
|
||||
void loop() {
|
||||
|
||||
if (mode == WRITE) {
|
||||
String line = waitForLine();
|
||||
|
||||
} else if (mode == READ) {
|
||||
|
||||
} else {
|
||||
startWrite();
|
||||
if (line.length() > 0) {
|
||||
startWrite(line);
|
||||
}
|
||||
|
||||
Serial.print("\nAAAAAAAA\n");
|
||||
|
||||
delay(1000);
|
||||
// if (mode == WRITE) {
|
||||
//
|
||||
// } else if (mode == READ) {
|
||||
//
|
||||
// } else {
|
||||
// startWrite();
|
||||
// }
|
||||
//
|
||||
// Serial.print("\nAAAAAAAA\n");
|
||||
|
||||
// delay(1000);
|
||||
|
||||
}
|
||||
@ -270,7 +270,7 @@ void recieveTest(char* title) {
|
||||
lower = 16;
|
||||
upper = 16;
|
||||
|
||||
*dirPtr = 0b11110000;
|
||||
*dirPtr = 0b11111000;
|
||||
*dataPtr = 0;
|
||||
|
||||
while (1) {
|
||||
|
||||
2
web/c64_inteface/.gitignore
vendored
Normal file
2
web/c64_inteface/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
bin/
|
||||
obj/
|
||||
7
web/c64_inteface/ArduinoMessageContainer.cs
Normal file
7
web/c64_inteface/ArduinoMessageContainer.cs
Normal file
@ -0,0 +1,7 @@
|
||||
namespace c64_inteface;
|
||||
|
||||
public class ArduinoMessageContainer
|
||||
{
|
||||
public string Message { get; set; } = "";
|
||||
public bool Ready { get; set; } = false;
|
||||
}
|
||||
124
web/c64_inteface/MonitorBackgroundService.cs
Normal file
124
web/c64_inteface/MonitorBackgroundService.cs
Normal file
@ -0,0 +1,124 @@
|
||||
using System.IO.Ports;
|
||||
|
||||
namespace c64_inteface;
|
||||
|
||||
public class MonitorBackgroundService : IHostedService, IDisposable
|
||||
{
|
||||
private const string ArduinoId = "F28339B0-78C6-4445-905A-76F77F667D95";
|
||||
private const string ArduinoPingMsg = "ping " + ArduinoId + "\n";
|
||||
private const string ArduinoPongMsg = "pong " + ArduinoId;
|
||||
|
||||
private readonly ILogger<MonitorBackgroundService> _logger;
|
||||
private readonly ArduinoMessageContainer _arduinoMessageContainer;
|
||||
private SerialPort? _arduinoPort;
|
||||
|
||||
public MonitorBackgroundService(ILogger<MonitorBackgroundService> logger, ArduinoMessageContainer arduinoMessageContainer)
|
||||
{
|
||||
_logger = logger;
|
||||
_arduinoMessageContainer = arduinoMessageContainer;
|
||||
}
|
||||
|
||||
public Task StartAsync(CancellationToken stoppingToken)
|
||||
{
|
||||
_logger.LogInformation("{Service} running.", nameof(MonitorBackgroundService));
|
||||
Task.Run(() => RunServiceAsync(stoppingToken), stoppingToken);
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
private async Task DoWork(CancellationToken cancellationToken)
|
||||
{
|
||||
_logger.LogInformation("DoWork running...");
|
||||
while (!cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
if (_arduinoMessageContainer.Ready)
|
||||
{
|
||||
try
|
||||
{
|
||||
_logger.LogInformation("Sending message: {Message}", _arduinoMessageContainer.Message);
|
||||
_arduinoPort?.WriteLine(_arduinoMessageContainer.Message);
|
||||
_arduinoMessageContainer.Ready = false;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Console.WriteLine(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private async Task RunServiceAsync(CancellationToken cancellationToken)
|
||||
{
|
||||
await FindArduinoPort(cancellationToken);
|
||||
await DoWork(cancellationToken);
|
||||
}
|
||||
|
||||
public Task StopAsync(CancellationToken stoppingToken)
|
||||
{
|
||||
_logger.LogInformation("{Service} is stopping.", nameof(MonitorBackgroundService));
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
private async Task FindArduinoPort(CancellationToken cancellationToken)
|
||||
{
|
||||
while (_arduinoPort is null && !cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
var ports = SerialPort.GetPortNames().ToList();
|
||||
|
||||
_logger.LogInformation("available ports: {Ports}", ports);
|
||||
|
||||
foreach (var portName in ports)
|
||||
{
|
||||
var port = new SerialPort(portName, 9600);
|
||||
|
||||
port.ReadTimeout = 1000;
|
||||
|
||||
try
|
||||
{
|
||||
port.Open();
|
||||
await Task.Delay(2000, cancellationToken);
|
||||
}
|
||||
catch (IOException)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
port.WriteLine(ArduinoPingMsg);
|
||||
|
||||
try
|
||||
{
|
||||
var response = port.ReadLine();
|
||||
|
||||
|
||||
_logger.LogInformation(response);
|
||||
|
||||
if (!response.Contains(ArduinoPongMsg))
|
||||
{
|
||||
_logger.LogInformation("{portName} not my arduino", portName);
|
||||
port.Close();
|
||||
continue;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, ex.Message);
|
||||
_logger.LogInformation("{portName} did not respond", portName);
|
||||
continue;
|
||||
}
|
||||
|
||||
_logger.LogInformation("Arduino found on {portName}", portName);
|
||||
|
||||
_arduinoPort = port;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
await Task.Delay(1000, cancellationToken);
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_arduinoPort?.Close();
|
||||
_arduinoPort?.Dispose();
|
||||
}
|
||||
}
|
||||
31
web/c64_inteface/Program.cs
Normal file
31
web/c64_inteface/Program.cs
Normal file
@ -0,0 +1,31 @@
|
||||
using c64_inteface;
|
||||
using Microsoft.AspNetCore.Http.HttpResults;
|
||||
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
|
||||
// Add services to the container.
|
||||
// Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi
|
||||
builder.Services.AddOpenApi();
|
||||
|
||||
builder.Services.AddSingleton<ArduinoMessageContainer>();
|
||||
builder.Services.AddHostedService<MonitorBackgroundService>();
|
||||
|
||||
var app = builder.Build();
|
||||
|
||||
// Configure the HTTP request pipeline.
|
||||
if (app.Environment.IsDevelopment())
|
||||
{
|
||||
app.MapOpenApi();
|
||||
}
|
||||
|
||||
app.UseHttpsRedirection();
|
||||
|
||||
app.MapGet("/api/{message}", (string message, ArduinoMessageContainer arduinoMessageContainer) =>
|
||||
{
|
||||
arduinoMessageContainer.Message = message.Trim();
|
||||
arduinoMessageContainer.Ready = true;
|
||||
return true;
|
||||
})
|
||||
.WithName("SendMessageToArduino");
|
||||
|
||||
app.Run();
|
||||
23
web/c64_inteface/Properties/launchSettings.json
Normal file
23
web/c64_inteface/Properties/launchSettings.json
Normal file
@ -0,0 +1,23 @@
|
||||
{
|
||||
"$schema": "https://json.schemastore.org/launchsettings.json",
|
||||
"profiles": {
|
||||
"http": {
|
||||
"commandName": "Project",
|
||||
"dotnetRunMessages": true,
|
||||
"launchBrowser": false,
|
||||
"applicationUrl": "http://localhost:5216",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
},
|
||||
"https": {
|
||||
"commandName": "Project",
|
||||
"dotnetRunMessages": true,
|
||||
"launchBrowser": false,
|
||||
"applicationUrl": "https://localhost:7088;http://localhost:5216",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
8
web/c64_inteface/appsettings.Development.json
Normal file
8
web/c64_inteface/appsettings.Development.json
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
}
|
||||
}
|
||||
9
web/c64_inteface/appsettings.json
Normal file
9
web/c64_inteface/appsettings.json
Normal file
@ -0,0 +1,9 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
},
|
||||
"AllowedHosts": "*"
|
||||
}
|
||||
20
web/c64_inteface/c64_inteface.csproj
Normal file
20
web/c64_inteface/c64_inteface.csproj
Normal file
@ -0,0 +1,20 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net9.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<PublishSingleFile>true</PublishSingleFile>
|
||||
<SelfContained>true</SelfContained>
|
||||
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
|
||||
<DebugType>none</DebugType>
|
||||
<DebugSymbols>false</DebugSymbols>
|
||||
<AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.9"/>
|
||||
<PackageReference Include="System.IO.Ports" Version="9.0.9" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
16
web/c64_inteface/c64_inteface.sln
Normal file
16
web/c64_inteface/c64_inteface.sln
Normal file
@ -0,0 +1,16 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "c64_inteface", "c64_inteface.csproj", "{53F85B44-8B21-41EE-88AE-A9BBDB3CED0A}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{53F85B44-8B21-41EE-88AE-A9BBDB3CED0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{53F85B44-8B21-41EE-88AE-A9BBDB3CED0A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{53F85B44-8B21-41EE-88AE-A9BBDB3CED0A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{53F85B44-8B21-41EE-88AE-A9BBDB3CED0A}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
Loading…
x
Reference in New Issue
Block a user