This commit is contained in:
Rens Pastoor
2025-05-27 22:58:08 +02:00
parent b2bd134307
commit d9244f1ae3
99 changed files with 0 additions and 1797 deletions

Binary file not shown.

View File

@@ -1,13 +0,0 @@
# Default ignored files
/shelf/
/workspace.xml
# Rider ignored files
/contentModel.xml
/projectSettingsUpdater.xml
/.idea.Starter_assignment.iml
/modules.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View File

@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" addBOMForNewFiles="with BOM under Windows, with no BOM otherwise" />
</project>

View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="UserContentModel">
<attachedFolders />
<explicitIncludes />
<explicitExcludes />
</component>
</project>

Binary file not shown.

View File

@@ -1,74 +0,0 @@
namespace Starter_assignment;
class Course {
private List<Student> students = new List<Student>();
private Dictionary<string, List<Student>> groups = new Dictionary<string, List<Student>>();
private int groupCounter = 1;
public void AddStudent(string name, int studentNumber) {
name = name.Trim();
foreach (Student student in students) {
if (student.GetStudentNumber() == studentNumber) {
Console.WriteLine("Student number must be unique.");
return;
}
}
string groupName = groups.Keys.LastOrDefault();
if (groupName == null || groups[groupName].Count >= 3) {
groupName = $"PG{groupCounter}";
groups[groupName] = new List<Student>();
groupCounter++;
}
Student newStudent = new Student(name, studentNumber, groupName);
students.Add(newStudent);
groups[groupName].Add(newStudent);
Console.WriteLine($"Student {name} added successfully to {groupName}.");
}
public void ViewAllStudents() {
foreach (Student student in students) {
Console.WriteLine(student.GetInfo());
}
}
public void ViewAllGroups() {
foreach (KeyValuePair<string, List<Student>> group in groups) {
Console.WriteLine(group.Key);
}
}
public void SearchByStudentNumber(int studentNumber) {
Student foundStudent = null;
foreach (Student student in students) {
int currentStudentNumber = student.GetStudentNumber();
if (currentStudentNumber == studentNumber) {
foundStudent = student;
break;
}
}
if (foundStudent != null) {
Console.WriteLine(foundStudent.GetInfo());
} else {
Console.WriteLine("No student found.");
}
}
public void SearchByGroup(string groupName) {
if (groups.ContainsKey(groupName)) {
foreach (Student student in groups[groupName]) {
Console.WriteLine(student.GetInfo());
}
} else {
Console.WriteLine("Group not found.");
}
}
public void ShowStatistics() {
Console.WriteLine($"Total students: {students.Count}");
Console.WriteLine($"Total groups: {groups.Count}");
}
}

View File

@@ -1,62 +0,0 @@
namespace Starter_assignment;
class Program {
static void Main() {
Course course = new Course();
bool running = true;
while (running) {
Console.WriteLine("\n1. Add Student" +
"\n2. View All Students" +
"\n3. View All Groups" +
"\n4. Search Student by Number" +
"\n5. Show Students in a Group" +
"\n6. Show Statistics" +
"\n7. Exit" +
"\nChoose an option: ");
string choice = Console.ReadLine();
switch (choice)
{
case "1":
Console.Write("Enter student name: ");
string name = Console.ReadLine();
Console.Write("Enter student number: ");
if (int.TryParse(Console.ReadLine(), out int studentNumber)) {
course.AddStudent(name, studentNumber);
} else {
Console.WriteLine("Invalid student number.");
}
break;
case "2":
course.ViewAllStudents();
break;
case "3":
course.ViewAllGroups();
break;
case "4":
Console.Write("Enter student number: ");
if (int.TryParse(Console.ReadLine(), out int searchNumber)) {
course.SearchByStudentNumber(searchNumber);
}
break;
case "5":
Console.Write("Enter group name: ");
string groupName = Console.ReadLine();
course.SearchByGroup(groupName);
break;
case "6":
course.ShowStatistics();
break;
case "7":
running = false;
break;
default:
Console.WriteLine("Invalid option, try again.");
break;
}
}
}
}

View File

@@ -1,10 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@@ -1,16 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 12.00
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Starter_assignment", "Starter_assignment\Starter_assignment.csproj", "{C78EC255-456E-4C45-912E-49607AD28EDC}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{C78EC255-456E-4C45-912E-49607AD28EDC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C78EC255-456E-4C45-912E-49607AD28EDC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C78EC255-456E-4C45-912E-49607AD28EDC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C78EC255-456E-4C45-912E-49607AD28EDC}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal

View File

@@ -1,4 +0,0 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AConsole_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F2ccd2056ec55b7b67558d52e32a887ed5ac7e346fc429b218c188d0a99cb5be_003FConsole_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ATextReader_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F5b34e2245c26def5c9df2f8c13df6c04246252f96a7cebf7db554fed90435_003FTextReader_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/PencilsConfiguration/ActualSeverity/@EntryValue">ERROR</s:String></wpf:ResourceDictionary>

View File

@@ -1,73 +0,0 @@
namespace Starter_assignment;
class Course {
private List<Student> students = new List<Student>();
private Dictionary<string, List<Student>> groups = new Dictionary<string, List<Student>>();
private int groupCounter = 1;
public void AddStudent(string name, int studentNumber) {
name = name.Trim();
foreach (Student student in students) {
if (student.GetStudentNumber() == studentNumber) {
Console.WriteLine("Student number must be unique.");
return;
}
}
string groupName = groups.Keys.LastOrDefault();
if (groupName == null || groups[groupName].Count >= 3) {
groupName = $"PG{groupCounter}";
groups[groupName] = new List<Student>();
groupCounter++;
}
Student newStudent = new Student(name, studentNumber, groupName);
students.Add(newStudent);
groups[groupName].Add(newStudent);
Console.WriteLine($"Student {name} added successfully to {groupName}.");
}
public void ViewAllStudents() {
foreach (Student student in students) {
Console.WriteLine(student.GetInfo());
}
}
public void ViewAllGroups() {
foreach (KeyValuePair<string, List<Student>> group in groups) {
Console.WriteLine(group.Key);
}
}
public void SearchByStudentNumber(int studentNumber) {
Student foundStudent = null;
foreach (Student student in students) {
int currentStudentNumber = student.GetStudentNumber();
if (currentStudentNumber == studentNumber) {
foundStudent = student;
break;
}
}
if (foundStudent != null) {
Console.WriteLine(foundStudent.GetInfo());
} else {
Console.WriteLine("No student found.");
}
}
public void SearchByGroup(string groupName) {
if (groups.ContainsKey(groupName)) {
foreach (Student student in groups[groupName]) {
Console.WriteLine(student.GetInfo());
}
} else {
Console.WriteLine("Group not found.");
}
}
public void ShowStatistics() {
Console.WriteLine($"Total students: {students.Count}");
Console.WriteLine($"Total groups: {groups.Count}");
}
}

View File

@@ -1,62 +0,0 @@
namespace Starter_assignment;
class Program {
static void Main() {
Course course = new Course();
bool running = true;
while (running) {
Console.WriteLine("\n1. Add Student" +
"\n2. View All Students" +
"\n3. View All Groups" +
"\n4. Search Student by Number" +
"\n5. Show Students in a Group" +
"\n6. Show Statistics" +
"\n7. Exit" +
"\nChoose an option: ");
string choice = Console.ReadLine();
switch (choice)
{
case "1":
Console.Write("Enter student name: ");
string name = Console.ReadLine();
Console.Write("Enter student number: ");
if (int.TryParse(Console.ReadLine(), out int studentNumber)) {
course.AddStudent(name, studentNumber);
} else {
Console.WriteLine("Invalid student number.");
}
break;
case "2":
course.ViewAllStudents();
break;
case "3":
course.ViewAllGroups();
break;
case "4":
Console.Write("Enter student number: ");
if (int.TryParse(Console.ReadLine(), out int searchNumber)) {
course.SearchByStudentNumber(searchNumber);
}
break;
case "5":
Console.Write("Enter group name: ");
string groupName = Console.ReadLine();
course.SearchByGroup(groupName);
break;
case "6":
course.ShowStatistics();
break;
case "7":
running = false;
break;
default:
Console.WriteLine("Invalid option, try again.");
break;
}
}
}
}

View File

@@ -1,10 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@@ -1,27 +0,0 @@
namespace Starter_assignment;
class Student {
private string Name { get; }
private int StudentNumber { get; }
private string GroupName { get; }
public Student(string name, int studentNumber, string groupName) {
if (string.IsNullOrWhiteSpace(name)) {
throw new ArgumentException("Name cannot be empty.");
}
if (studentNumber < 10000 && studentNumber != -1) {
throw new ArgumentException("Student number must be >= 10000 or -1.");
}
Name = name;
StudentNumber = studentNumber;
GroupName = groupName;
}
public int GetStudentNumber() {
return StudentNumber;
}
public string GetInfo() {
return $"{Name} ({StudentNumber}) - {GroupName}";
}
}

View File

@@ -1,23 +0,0 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v8.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v8.0": {
"Starter_assignment/1.0.0": {
"runtime": {
"Starter_assignment.dll": {}
}
}
}
},
"libraries": {
"Starter_assignment/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
}
}
}

View File

@@ -1,12 +0,0 @@
{
"runtimeOptions": {
"tfm": "net8.0",
"framework": {
"name": "Microsoft.NETCore.App",
"version": "8.0.0"
},
"configProperties": {
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
}
}
}

View File

@@ -1,4 +0,0 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]

View File

@@ -1,22 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("Starter_assignment")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyProductAttribute("Starter_assignment")]
[assembly: System.Reflection.AssemblyTitleAttribute("Starter_assignment")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Generated by the MSBuild WriteCodeFragment class.

View File

@@ -1 +0,0 @@
77da79aa1d8b67801697281643b61dd3f4e48c0c7f245ecd395dee391118be92

View File

@@ -1,13 +0,0 @@
is_global = true
build_property.TargetFramework = net8.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = Starter_assignment
build_property.ProjectDir = /home/rens/T2/CS/Starter_assignment/Starter_assignment/
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =

View File

@@ -1,8 +0,0 @@
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;

View File

@@ -1 +0,0 @@
63f646a6f5c36f8a67f54301cd756f80709a6758f27e90e85bd3caa85964b27d

View File

@@ -1,10 +0,0 @@
/home/rens/files/T2/CS/Starter_assignment/Starter_assignment/bin/Debug/net8.0/Starter_assignment
/home/rens/files/T2/CS/Starter_assignment/Starter_assignment/bin/Debug/net8.0/Starter_assignment.dll
/home/rens/files/T2/CS/Starter_assignment/Starter_assignment/bin/Debug/net8.0/Starter_assignment.pdb
/home/rens/files/T2/CS/Starter_assignment/Starter_assignment/obj/Debug/net8.0/Starter_assignment.GeneratedMSBuildEditorConfig.editorconfig
/home/rens/files/T2/CS/Starter_assignment/Starter_assignment/obj/Debug/net8.0/Starter_assignment.AssemblyInfoInputs.cache
/home/rens/files/T2/CS/Starter_assignment/Starter_assignment/obj/Debug/net8.0/Starter_assignment.AssemblyInfo.cs
/home/rens/files/T2/CS/Starter_assignment/Starter_assignment/obj/Debug/net8.0/Starter_assignment.csproj.CoreCompileInputs.cache
/home/rens/files/T2/CS/Starter_assignment/Starter_assignment/obj/Debug/net8.0/Starter_assignment.dll
/home/rens/files/T2/CS/Starter_assignment/Starter_assignment/obj/Debug/net8.0/refint/Starter_assignment.dll
/home/rens/files/T2/CS/Starter_assignment/Starter_assignment/obj/Debug/net8.0/Starter_assignment.pdb

View File

@@ -1 +0,0 @@
4028af397b722be4e5490a9f64106d4a5c363b00c8703dae917b145b5632baa4

View File

@@ -1,66 +0,0 @@
{
"format": 1,
"restore": {
"/home/rens/files/T2/CS/Starter_assignment/Starter_assignment/Starter_assignment.csproj": {}
},
"projects": {
"/home/rens/files/T2/CS/Starter_assignment/Starter_assignment/Starter_assignment.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "/home/rens/files/T2/CS/Starter_assignment/Starter_assignment/Starter_assignment.csproj",
"projectName": "Starter_assignment",
"projectPath": "/home/rens/files/T2/CS/Starter_assignment/Starter_assignment/Starter_assignment.csproj",
"packagesPath": "/home/rens/.nuget/packages/",
"outputPath": "/home/rens/files/T2/CS/Starter_assignment/Starter_assignment/obj/",
"projectStyle": "PackageReference",
"configFilePaths": [
"/home/rens/.nuget/NuGet/NuGet.Config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "/home/rens/.dotnet/sdk/8.0.404/PortableRuntimeIdentifierGraph.json"
}
}
}
}
}

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">/home/rens/.nuget/packages/</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">/home/rens/.nuget/packages/</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.12.2</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="/home/rens/.nuget/packages/" />
</ItemGroup>
</Project>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />

View File

@@ -1,71 +0,0 @@
{
"version": 3,
"targets": {
"net8.0": {}
},
"libraries": {},
"projectFileDependencyGroups": {
"net8.0": []
},
"packageFolders": {
"/home/rens/.nuget/packages/": {}
},
"project": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "/home/rens/files/T2/CS/Starter_assignment/Starter_assignment/Starter_assignment.csproj",
"projectName": "Starter_assignment",
"projectPath": "/home/rens/files/T2/CS/Starter_assignment/Starter_assignment/Starter_assignment.csproj",
"packagesPath": "/home/rens/.nuget/packages/",
"outputPath": "/home/rens/files/T2/CS/Starter_assignment/Starter_assignment/obj/",
"projectStyle": "PackageReference",
"configFilePaths": [
"/home/rens/.nuget/NuGet/NuGet.Config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "/home/rens/.dotnet/sdk/8.0.404/PortableRuntimeIdentifierGraph.json"
}
}
}
}

View File

@@ -1,8 +0,0 @@
{
"version": 2,
"dgSpecHash": "0d5jt8ngUw0=",
"success": true,
"projectFilePath": "/home/rens/T2/CS/Starter_assignment/Starter_assignment/Starter_assignment.csproj",
"expectedPackageFiles": [],
"logs": []
}

View File

@@ -1 +0,0 @@
"restore":{"projectUniqueName":"/home/rens/files/T2/CS/Starter_assignment/Starter_assignment/Starter_assignment.csproj","projectName":"Starter_assignment","projectPath":"/home/rens/files/T2/CS/Starter_assignment/Starter_assignment/Starter_assignment.csproj","outputPath":"/home/rens/files/T2/CS/Starter_assignment/Starter_assignment/obj/","projectStyle":"PackageReference","originalTargetFrameworks":["net8.0"],"sources":{"https://api.nuget.org/v3/index.json":{}},"frameworks":{"net8.0":{"targetAlias":"net8.0","projectReferences":{}}},"warningProperties":{"warnAsError":["NU1605"]},"restoreAuditProperties":{"enableAudit":"true","auditLevel":"low","auditMode":"direct"}}"frameworks":{"net8.0":{"targetAlias":"net8.0","imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"frameworkReferences":{"Microsoft.NETCore.App":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"/home/rens/.dotnet/sdk/8.0.404/PortableRuntimeIdentifierGraph.json"}}

View File

@@ -1 +0,0 @@
17406469005085962

View File

@@ -1,27 +0,0 @@
namespace Starter_assignment;
class Student {
private string Name { get; }
private int StudentNumber { get; }
private string GroupName { get; }
public Student(string name, int studentNumber, string groupName) {
if (string.IsNullOrWhiteSpace(name)) {
throw new ArgumentException("Name cannot be empty.");
}
if (studentNumber < 10000 && studentNumber != -1) {
throw new ArgumentException("Student number must be >= 10000 or -1.");
}
Name = name;
StudentNumber = studentNumber;
GroupName = groupName;
}
public int GetStudentNumber() {
return StudentNumber;
}
public string GetInfo() {
return $"{Name} ({StudentNumber}) - {GroupName}";
}
}

View File

@@ -1,5 +0,0 @@
.pio
.vscode/.browse.c_cpp.db*
.vscode/c_cpp_properties.json
.vscode/launch.json
.vscode/ipch

View File

@@ -1,10 +0,0 @@
{
// See http://go.microsoft.com/fwlink/?LinkId=827846
// for the documentation about the extensions.json format
"recommendations": [
"platformio.platformio-ide"
],
"unwantedRecommendations": [
"ms-vscode.cpptools-extension-pack"
]
}

View File

@@ -1,39 +0,0 @@
#include <Arduino.h>
#ifndef SERIALPROCESS_H
#define SERIALPROCESS_H
class SerialProcess {
private:
uint8_t ndx; // Current index for the buffer
const char beginMarker = '#'; // Marker to indicate the start of a message
const char endMarker = ';'; // Marker to indicate the end of a message
char rc; // Character read from Serial
int address; // Device address
bool newData; // Flag for new data availability
static const uint8_t numChars = 255; // Maximum size of the buffer
char receivedChars[numChars]; // Buffer for incoming data
bool rcCheck;
public:
// Constructor
explicit SerialProcess(int addr);
// Store Serial Input (if available)
void SerialInput();
// Check if new data is available
bool isNewDataAvailable();
// Get the received data
char* getReceivedData();
// Process the received message
void getPayload(char* payload);
// Send message in the correct format
void sendMessage(int receiver, const char* payload);
void changeAddress(int addr);
};
#endif // SERIALPROCESS_H

View File

@@ -1,46 +0,0 @@
This directory is intended for project specific (private) libraries.
PlatformIO will compile them to static libraries and link into the executable file.
The source code of each library should be placed in a separate directory
("lib/your_library_name/[Code]").
For example, see the structure of the following example libraries `Foo` and `Bar`:
|--lib
| |
| |--Bar
| | |--docs
| | |--examples
| | |--src
| | |- Bar.c
| | |- Bar.h
| | |- library.json (optional. for custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html
| |
| |--Foo
| | |- Foo.c
| | |- Foo.h
| |
| |- README --> THIS FILE
|
|- platformio.ini
|--src
|- main.c
Example contents of `src/main.c` using Foo and Bar:
```
#include <Foo.h>
#include <Bar.h>
int main (void)
{
...
}
```
The PlatformIO Library Dependency Finder will find automatically dependent
libraries by scanning project source files.
More information about PlatformIO Library Dependency Finder
- https://docs.platformio.org/page/librarymanager/ldf.html

View File

@@ -1,16 +0,0 @@
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
lib_deps = plerup/EspSoftwareSerial@^8.2.0

View File

@@ -1,74 +0,0 @@
#include "SerialProcess.h"
#include <Arduino.h>
// Constructor
SerialProcess::SerialProcess(int addr)
: address(addr), ndx(0), rc(0), newData(false), rcCheck(false) {
Serial.begin(115200);
}
// Processes Serial Input
void SerialProcess::SerialInput() {
while (Serial.available() > 0) {
rc = static_cast<char>(Serial.read());
if (rc == beginMarker) {
rcCheck = true; // Start reading after the begin marker
ndx = 0; // Reset index for new message
}
if (rcCheck) {
// Store the character if within bounds
if (ndx < numChars - 1) {
receivedChars[ndx++] = rc;
}
// Check for end marker
if (rc == endMarker) {
receivedChars[ndx] = '\0'; // Null-terminate the string
newData = true; // Mark new data as available
rcCheck = false; // Stop reading until the next begin marker
}
}
}
}
// Check if new data is available
bool SerialProcess::isNewDataAvailable() {
return newData;
}
// Get the received data
char* SerialProcess::getReceivedData() {
if (newData) {
newData = false; // Reset the flag after accessing the data
return receivedChars;
}
return nullptr; // No new data
}
// Process the received message
void SerialProcess::getPayload(char *payload) {
if (newData) {
uint8_t source;
uint8_t destination;
char data[255]; // Allocate a buffer for the data
int parsed = sscanf(receivedChars, "#%hhu:%hhu:%63s;", &source, &destination, data);
if (parsed == 3 && destination == address) { // Ensure all fields are parsed correctly
strcpy(payload, data); // Copy data to the provided buffer
newData = false; // Mark the data as processed
} else if (address != source) {
Serial.print(receivedChars); // Forward the message
}
}
}
// Send a message in the correct format
void SerialProcess::sendMessage(int receiver, const char* payload) {
Serial.printf("#%u:%u:%s;", address, receiver, payload);
}
void SerialProcess::changeAddress(int addr) {
address = addr; // Update the device address
}

View File

@@ -1,238 +0,0 @@
#include <Arduino.h>
#include "SerialProcess.h"
#define LEDRED 14
#define LEDORANGE 13
#define LEDGREEN 12
unsigned long previousMillis = 0;
const unsigned long greenDuration = 5000;
const unsigned long yellowDuration = 2000;
const unsigned long redDuration = 5000;
const unsigned long transitionDuration = 2000;
const unsigned long heartbeatInterval = 1000;
const unsigned long heartbeatTimeout = 3000;
const unsigned long blinkInterval = 500;
unsigned long lastHeartbeatMillis = 0;
unsigned long lastBlinkMillis = 0;
bool blinkState = false;
enum State { GREEN, YELLOW, RED, TRANSITION, ERROR };
State currentState = GREEN;
const char *slavecheck = "#slvchck;";
const char *slaveack = "#slvack;";
const char *masterack = "#mstack;";
const char *turnRed = "tr";
const char *turnOrange = "to";
const char *turnGreen = "tg";
const char *heartbeat = "hb";
int node; // other bord addres number
int address = 0; // Device address
void setRed(){
digitalWrite(LEDRED, HIGH);
digitalWrite(LEDORANGE, LOW);
digitalWrite(LEDGREEN, LOW);
}
void setOrange(){
digitalWrite(LEDRED, LOW);
digitalWrite(LEDORANGE, HIGH);
digitalWrite(LEDGREEN, LOW);
}
void setGreen(){
digitalWrite(LEDRED, LOW);
digitalWrite(LEDORANGE, LOW);
digitalWrite(LEDGREEN, HIGH);
}
SerialProcess serialcom(0);
bool MasterCheck() {
SerialProcess serialcomchecker(1000);
const unsigned long timeout = 2000;
unsigned long startTime = millis();
bool isMaster = true;
bool checkSent = false;
bool gotResponse = false;
delay(random(100, 600)); // Randomize startup slightly
Serial.print(slavecheck); // Send check to see if someone replies
checkSent = true;
while (millis() - startTime < timeout) {
if (Serial.available()) {
serialcomchecker.SerialInput();
char* payload = serialcomchecker.getReceivedData();
if (strcmp(payload, slavecheck) == 0) {
// Got a check while we also sent a check — respond and become SLAVE
Serial.print(slaveack);
isMaster = false;
break;
} else if (strcmp(payload, slaveack) == 0) {
// Got an ACK from the other side — we are master
Serial.print(masterack);
isMaster = true;
break;
} else if (strcmp(payload, masterack) == 0) {
// Got master ack — we must be slave
isMaster = false;
break;
}
}
}
// Failsafe: no response at all
if (!Serial.available() && !gotResponse) {
// Assume we are master
isMaster = true;
Serial.print(masterack);
}
return isMaster;
}
void updateLights() {
switch (currentState) {
case GREEN:
setGreen();
serialcom.sendMessage(node, turnGreen);
break;
case YELLOW:
setOrange();
serialcom.sendMessage(node, turnOrange);
break;
case RED:
setGreen();
serialcom.sendMessage(node, turnRed);
break;
case TRANSITION:
serialcom.sendMessage(node, turnOrange);
break;
case ERROR:
if (millis() - lastBlinkMillis >= blinkInterval) {
blinkState = !blinkState;
digitalWrite(LEDORANGE, blinkState ? HIGH : LOW);
lastBlinkMillis = millis();
}
break;
}
}
void sendHeartbeat() {
serialcom.sendMessage(node,heartbeat);
Serial.println("Sent: Heartbeat");
}
void master(){
bool running = true;
while (running){
unsigned long currentMillis = millis();
if (currentMillis - lastHeartbeatMillis >= heartbeatInterval) {
sendHeartbeat();
lastHeartbeatMillis = currentMillis;
}
if (currentMillis - lastHeartbeatMillis > heartbeatTimeout) {
currentState = ERROR;
updateLights();
return;
}
switch (currentState) {
case GREEN:
if (currentMillis - previousMillis >= greenDuration) {
currentState = YELLOW;
previousMillis = currentMillis;
updateLights();
}
break;
case YELLOW:
if (currentMillis - previousMillis >= yellowDuration) {
currentState = RED;
previousMillis = currentMillis;
updateLights();
}
break;
case RED:
if (currentMillis - previousMillis >= redDuration) {
currentState = TRANSITION;
previousMillis = currentMillis;
updateLights();
}
break;
case TRANSITION:
if (currentMillis - previousMillis >= transitionDuration) {
currentState = GREEN;
previousMillis = millis();
updateLights();
}
break;
case ERROR:
updateLights();
break;
}
}
}
void setup() {
Serial.begin(115200);
pinMode(LEDGREEN, OUTPUT);
pinMode(LEDORANGE, OUTPUT);
pinMode(LEDRED, OUTPUT);
bool MorS = MasterCheck(); // Check if master or slave
//set address for master or slave
if (MorS == false){
address = 2; // Set address for this slave
node = 1; // Set address for master
} else {
address = 1; // Set address for this master
node = 2; // Set address for slave
}
previousMillis = millis();
lastHeartbeatMillis = millis();
updateLights();
setRed();
serialcom.changeAddress(address); // Set address for serial communication
}
void slave(){
bool running = true;
char *command;
while (running && Serial.available() > 0){
serialcom.SerialInput();
serialcom.getPayload(command);
if (strcmp(command, turnRed)) setRed();
else if (strcmp(command, turnOrange)) setOrange();
else if (strcmp(command, turnGreen)) setGreen();
else if (strcmp(command, heartbeat)) {
lastHeartbeatMillis = millis();
digitalWrite(LEDRED, LOW); // Reset the orange blink pattern
digitalWrite(LEDORANGE, LOW);
}
else {
Serial.print("slave: unknown command");
}
}
if (millis() - lastHeartbeatMillis > heartbeatTimeout) {
// Blink the red and yellow LEDs to indicate an error (orange light)
if (millis() - lastBlinkMillis >= blinkInterval) {
blinkState = !blinkState;
digitalWrite(LEDORANGE, blinkState ? HIGH : LOW);
lastBlinkMillis = millis();
}
}
}
void loop(){
serialcom.changeAddress(2);
if (address == 1) slave(); //master
else if (address == 2) slave(); //slave
else Serial.print("master slave issue");
}

View File

@@ -1,11 +0,0 @@
This directory is intended for PlatformIO Test Runner and project tests.
Unit Testing is a software testing method by which individual units of
source code, sets of one or more MCU program modules together with associated
control data, usage procedures, and operating procedures, are tested to
determine whether they are fit for use. Unit testing finds problems early
in the development cycle.
More information about PlatformIO Unit Testing:
- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html

View File

@@ -1,5 +0,0 @@
.pio
.vscode/.browse.c_cpp.db*
.vscode/c_cpp_properties.json
.vscode/launch.json
.vscode/ipch

View File

@@ -1,10 +0,0 @@
{
// See http://go.microsoft.com/fwlink/?LinkId=827846
// for the documentation about the extensions.json format
"recommendations": [
"platformio.platformio-ide"
],
"unwantedRecommendations": [
"ms-vscode.cpptools-extension-pack"
]
}

View File

@@ -1,37 +0,0 @@
This directory is intended for project header files.
A header file is a file containing C declarations and macro definitions
to be shared between several project source files. You request the use of a
header file in your project source file (C, C++, etc) located in `src` folder
by including it, with the C preprocessing directive `#include'.
```src/main.c
#include "header.h"
int main (void)
{
...
}
```
Including a header file produces the same results as copying the header file
into each source file that needs it. Such copying would be time-consuming
and error-prone. With a header file, the related declarations appear
in only one place. If they need to be changed, they can be changed in one
place, and programs that include the header file will automatically use the
new version when next recompiled. The header file eliminates the labor of
finding and changing all the copies as well as the risk that a failure to
find one copy will result in inconsistencies within a program.
In C, the convention is to give header files names that end with `.h'.
Read more about using header files in official GCC documentation:
* Include Syntax
* Include Operation
* Once-Only Headers
* Computed Includes
https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html

View File

@@ -1,46 +0,0 @@
This directory is intended for project specific (private) libraries.
PlatformIO will compile them to static libraries and link into the executable file.
The source code of each library should be placed in a separate directory
("lib/your_library_name/[Code]").
For example, see the structure of the following example libraries `Foo` and `Bar`:
|--lib
| |
| |--Bar
| | |--docs
| | |--examples
| | |--src
| | |- Bar.c
| | |- Bar.h
| | |- library.json (optional. for custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html
| |
| |--Foo
| | |- Foo.c
| | |- Foo.h
| |
| |- README --> THIS FILE
|
|- platformio.ini
|--src
|- main.c
Example contents of `src/main.c` using Foo and Bar:
```
#include <Foo.h>
#include <Bar.h>
int main (void)
{
...
}
```
The PlatformIO Library Dependency Finder will find automatically dependent
libraries by scanning project source files.
More information about PlatformIO Library Dependency Finder
- https://docs.platformio.org/page/librarymanager/ldf.html

View File

@@ -1,14 +0,0 @@
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[env:uno]
platform = atmelavr
board = uno
framework = arduino

View File

@@ -1,14 +0,0 @@
#include <Arduino.h>
int analogValue;
int readPin = 23;
void setup() {
Serial.begin(115200);
pinMode(readPin,INPUT);
}
void loop() {
analogValue = analogRead(readPin);
Serial.print(analogValue);
}

View File

@@ -1,11 +0,0 @@
This directory is intended for PlatformIO Test Runner and project tests.
Unit Testing is a software testing method by which individual units of
source code, sets of one or more MCU program modules together with associated
control data, usage procedures, and operating procedures, are tested to
determine whether they are fit for use. Unit testing finds problems early
in the development cycle.
More information about PlatformIO Unit Testing:
- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html

View File

@@ -1,5 +0,0 @@
.pio
.vscode/.browse.c_cpp.db*
.vscode/c_cpp_properties.json
.vscode/launch.json
.vscode/ipch

View File

@@ -1,10 +0,0 @@
{
// See http://go.microsoft.com/fwlink/?LinkId=827846
// for the documentation about the extensions.json format
"recommendations": [
"platformio.platformio-ide"
],
"unwantedRecommendations": [
"ms-vscode.cpptools-extension-pack"
]
}

View File

@@ -1,37 +0,0 @@
This directory is intended for project header files.
A header file is a file containing C declarations and macro definitions
to be shared between several project source files. You request the use of a
header file in your project source file (C, C++, etc) located in `src` folder
by including it, with the C preprocessing directive `#include'.
```src/main.c
#include "header.h"
int main (void)
{
...
}
```
Including a header file produces the same results as copying the header file
into each source file that needs it. Such copying would be time-consuming
and error-prone. With a header file, the related declarations appear
in only one place. If they need to be changed, they can be changed in one
place, and programs that include the header file will automatically use the
new version when next recompiled. The header file eliminates the labor of
finding and changing all the copies as well as the risk that a failure to
find one copy will result in inconsistencies within a program.
In C, the convention is to give header files names that end with `.h'.
Read more about using header files in official GCC documentation:
* Include Syntax
* Include Operation
* Once-Only Headers
* Computed Includes
https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html

View File

@@ -1,46 +0,0 @@
This directory is intended for project specific (private) libraries.
PlatformIO will compile them to static libraries and link into the executable file.
The source code of each library should be placed in a separate directory
("lib/your_library_name/[Code]").
For example, see the structure of the following example libraries `Foo` and `Bar`:
|--lib
| |
| |--Bar
| | |--docs
| | |--examples
| | |--src
| | |- Bar.c
| | |- Bar.h
| | |- library.json (optional. for custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html
| |
| |--Foo
| | |- Foo.c
| | |- Foo.h
| |
| |- README --> THIS FILE
|
|- platformio.ini
|--src
|- main.c
Example contents of `src/main.c` using Foo and Bar:
```
#include <Foo.h>
#include <Bar.h>
int main (void)
{
...
}
```
The PlatformIO Library Dependency Finder will find automatically dependent
libraries by scanning project source files.
More information about PlatformIO Library Dependency Finder
- https://docs.platformio.org/page/librarymanager/ldf.html

View File

@@ -1,15 +0,0 @@
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200

View File

@@ -1,15 +0,0 @@
#include <Arduino.h>
int analogValue;
int readPin = 32;
void setup() {
Serial.begin(115200);
analogReadResolution(10);
pinMode(readPin,INPUT);
}
void loop() {
analogValue = analogRead(readPin);
Serial.println(840);
}

View File

@@ -1,11 +0,0 @@
This directory is intended for PlatformIO Test Runner and project tests.
Unit Testing is a software testing method by which individual units of
source code, sets of one or more MCU program modules together with associated
control data, usage procedures, and operating procedures, are tested to
determine whether they are fit for use. Unit testing finds problems early
in the development cycle.
More information about PlatformIO Unit Testing:
- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html