chore: initial commit of code. version 1.0.1

This commit is contained in:
Chris Watts 2025-01-08 09:39:14 +00:00
parent 81c892a30d
commit a6c6d16217
347 changed files with 134764 additions and 0 deletions

25
.dockerignore Normal file
View File

@ -0,0 +1,25 @@
**/.classpath
**/.dockerignore
**/.env
**/.git
**/.gitignore
**/.project
**/.settings
**/.toolstarget
**/.vs
**/.vscode
**/*.*proj.user
**/*.dbmdl
**/*.jfm
**/azds.yaml
**/bin
**/charts
**/docker-compose*
**/Dockerfile*
**/node_modules
**/npm-debug.log
**/obj
**/secrets.dev.yaml
**/values.dev.yaml
LICENSE
README.md

15
.gitignore vendored Normal file
View File

@ -0,0 +1,15 @@
/_ReSharper.Caches/**/*
/.vs/**/*
/ScoreboardApi/bin/**/*
/ScoreboardApi/obj/**/*
/displaytest/output/**/*
/ScoreboardNumbers/output/**/*
/WifiTest/output/**/*
/scoreboardoutput/sketch/output/**/*
/scoreboardoutput/core/**/*
/scoreboardoutput/build_opt.h
/scoreboardoutput/build.options.json
/scoreboardoutput/compile_commands.json
/scoreboardoutput/file_opts
/scoreboardoutput/includes.cache
/scoreboardoutput/libraries.cache

View File

@ -0,0 +1,299 @@
* {
box-sizing: border-box;
}
/* Set a background color */
body {
background-color: #b8b8ba;
font-family: Helvetica, sans-serif;
}
.btn {
width: -webkit-fill-available;
}
.col {
width: 100%;
} .scoreboard {
display: flex;
flex-direction: column;
align-items: center;
width: 800px;
margin: 0 auto;
background-color: #e0e0e0;
color: #333;
padding: 10px;
border: 4px solid #800080;
border-radius: 20px;
}
.timer-container {
display: flex;
flex-direction: column;
align-items: center;
position: relative;
width: 120px;
height: 120px;
background-color: #fff;
border: 4px solid #800080;
border-radius: 50%;
margin: 10px;
}
.timer {
font-size: 38px;
color: #333;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.half-indicator {
font-size: 18px;
font-weight: bold;
color: #800080;
position: absolute;
bottom: 10px;
}
.kickoff-indicator {
font-size: 25px;
font-weight: bold;
color: #800080;
margin-top:auto;
margin-bottom:auto;
}
.finalscore-indicator {
font-size: 25px;
font-weight: bold;
color: #800080;
margin-top:auto;
margin-bottom:auto;
}
.border {
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
}
.team-details {
font-size: 48px;
color: white;
background-color: #000;
padding: 0px;
text-align: center;
max-height: 100px;
border-radius: 0px 0px 30px 30px;
}
.team {
flex: 1;
text-align: center;
display: flex;
flex-direction: column;
border-radius: 10px 10px 10px 10px;
background-color: dimgrey;
}
.team-info {
display: flex;
align-items: center;
flex-direction: column;
}
.team-logo {
margin: 10px;
}
.team-logo svg {
max-width: 60px;
max-height: 60px;
background-color: #800080;
padding: 5px;
margin-right:auto;
margin-left:auto;
}
.team-name {
font-weight: bold;
font-size: 20px;
color: white;
margin-bottom: 5px;
display: flex;
align-items: center;
}
.team-score {
font-size: 48px;
color: white;
background-color: #000;
padding: 10px;
text-align: center;
max-height: 100px;
border-radius: 0 0 10px 10px;
}
.score-history {
font-size: 14px;
width: 100%;
text-align: center;
padding: 10px;
}
/* Uckfield RFC's background color */
#home-team {
background-color: #ff0000;
}
/* Away Team's background color */
#away-team {
background-color: #0000ff;
}
/*
eventList
*/
.timeline {
position: relative;
padding: 20px;
width: 50%;
margin-top: 10px;
margin-right: auto;
margin-left: auto;
}
.timeline-item {
display: flex;
align-items: flex-start;
margin-bottom: 40px;
position: relative;
}
.timeline-content {
background-color: #f9f9f9;
padding: 20px;
position: relative;
border-radius: 8px;
border: 1px solid black;
}
.timeline-content-match {
background-color: rgb(69, 69, 69);
color: white;
min-width: 100px;
padding-top: 5px;
padding-bottom: 5px;
padding-left: 30px;
padding-right: 30px;
position: relative;
margin-left: auto;
margin-right: auto;
border-radius: 8px;
border: 1px solid purple;
text-align: center;
}
.match:first-child {
margin-top: -20px;
}
.match:last-child {
margin-bottom: -20px;
}
.score-panel {
font-size: 20px;
color: white;
background-color: gray;
padding: 5px 10px 5px 10px;
position: absolute;
left: 50.1%;
border-radius: 8px;
top: 50%;
transform: translate(-50%, -50%);
z-index: 1;
}
.delete-btn {
position: absolute;
float: right;
top: 10px;
right: 10px;
background-color: #f00;
/* background-color: #ff6347; */
color: white;
border: none;
padding: 5px 10px;
border-radius: 5px;
cursor: pointer;
}
.icon {
position: absolute;
left: 50.1%;
top: 50%;
transform: translate(-50%, -50%);
color: black;
/* Set the color of the icon */
z-index: 1;
/* Ensure the icon appears above the panel */
}
.yc {
color: yellow;
text-shadow: 0 0 5px #000;
}
.rc {
color: red;
text-shadow: 0 0 5px #000;
}
.away {
margin-left: auto;
}
.timeline:before {
content: '';
position: absolute;
top: 0;
bottom: 0;
left: 50%;
border-left: 2px solid black;
}
@media screen and (min-width: 1500px) {
.timeline-item {
flex-direction: row;
justify-content: space-between;
}
.timeline-content {
width: 40%;
}
}
@media screen and (max-width: 1499px) {
.timeline {
width: 80%;
}
.timeline-item {
flex-direction: row;
justify-content: space-between;
}
.timeline-content {
width: 40%;
}
}
.noMatch {
text-align: center;
}
.summary-team-label {
margin-top: 15px;
margin-bottom: 15px;
font-size: 25px;
}

View File

@ -0,0 +1,241 @@
<!DOCTYPE html>
<head>
<link href="controller.css" rel="stylesheet" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css"
integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css"
integrity="5e2ESR8Ycmos6g3gAKr1Jvwye8sW4U1u/cAKulfVJnkakCcMqhOudbtPnvJ+nbv7" crossorigin="anonymous">
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.5.1/knockout-latest.js"
integrity="sha512-2AL/VEauKkZqQU9BHgnv48OhXcJPx9vdzxN1JrKDVc4FPU/MEE/BZ6d9l0mP7VmvLsjtYwqiYQpDskK9dG8KBA=="
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"
integrity="sha512-v2CJ7UaYy4JwqLDIrZUI/4hqeoQieOmAZNXBeQyjo21dadnwR+8ZaIJVT8EE2iyI61OV8e6M8PP2/4hpQINQ/g=="
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.min.js"
integrity="sha384-BBtl+eGJRgqQAUMxJ7pMwbEyER4l1g+O15P+16Ep7Q9Q+zqX6gSbd85u4mG4QzX+"
crossorigin="anonymous"></script>
</head>
<body>
<div class="alert alert-danger" role="alert" data-bind="text: disconnectedMessage(), hidden: isConnected"></div>
<div class="container text-center">
<div class="card">
<div class="card-header">
Match
</div>
<div class="card-body">
<div class="row gx-2">
<!-- Make these conditionally visible
WaitingForStart = 1,
FirstHalf = 2,
HalfTime = 3,
SecondHalf = 3,
Finished = 4,
TimeOff = 5
<div class="col">
<button type="button" class="btn btn-secondary btn-lg p-3">Start Match</button>
</div>
-->
<!-- ko if: gameState() === "WaitingForStart" || gameState() === "" -->
<div class="col">
<div class="card">
<div class="card-body" data-bind="text: getMatchPendingMessage()">
</div>
</div>
</div>
<!-- /ko -->
<!-- ko if: gameState() === "FirstHalf" || gameState() === 'SecondHalf' -->
<div class="col">
<button type="button" class="btn btn-secondary btn-lg p-3">Time Off</button>
</div>
<!-- /ko -->
<!-- ko if: gameState() === "TimeOff"-->
<div class="col">
<button type="button" class="btn btn-secondary btn-lg p-3">Time On</button>
</div>
<!-- /ko -->
<!-- ko if: gameState() === "FirstHalf"-->
<div class="col">
<button type="button" class="btn btn-secondary btn-lg p-3">Half Time</button>
</div>
<!-- /ko -->
<!-- ko if: gameState() === "HalfTime"-->
<div class="col">
<button type="button" class="btn btn-secondary btn-lg p-3">Start Second Half</button>
</div>
<!-- /ko -->
<!-- ko if: gameState() === "SecondHalf"-->
<div class="col">
<button type="button" class="btn btn-secondary btn-lg p-3">Finish Match</button>
</div>
<!-- /ko -->
<!-- ko if: gameState() === 'Finished' -->
<div>Match has finished, no actions to perform.</div>
<!-- /ko -->
</div>
</div>
</div>
<!-- ko if: gameState() !== 'WaitingForStart' && gameState() !== 'Finished' -->
<div class="row gx-7 mt-5">
<div class="col">
<div class="card">
<div class="card-header" data-bind="text: homeTeamName">
Home
</div>
<div class="card-body">
<div class="row gx-2">
<div class="col">
<button type="button" class="btn btn-secondary btn-lg p-3"
data-bind="click: addTeamEvent.bind(this,'Home','Try'), enable: isConnected">Try</button>
</div>
<div class="col">
<button type="button" class="btn btn-secondary btn-lg p-3"
data-bind="click: addTeamEvent.bind(this,'Home','Conversion'), enable: isConnected">Conversion</button>
</div>
<div class="col">
<button type="button" class="btn btn-secondary btn-lg p-3"
data-bind="click: addTeamEvent.bind(this,'Home','Penalty'), enable: isConnected">Penalty</button>
</div>
<div class="col">
<button type="button" class="btn btn-secondary btn-lg p-3"
data-bind="click: addTeamEvent.bind(this,'Home','DropGoal'), enable: isConnected">Drop
Goal</button>
</div>
</div>
<div class="row justify-content-center mt-4 gx-4">
<div class="col-2">
<button type="button" class="btn btn-warning btn-lg p-4 mr-4"
data-bind="click: addTeamEvent.bind(this,'Home','YellowCard'), enable: isConnected"></button>
</div>
<div class="col-2">
<button type="button" class=" btn btn-danger btn-lg p-4 ml-4"
data-bind="click: addTeamEvent.bind(this,'Home','RedCard'), enable: isConnected"></button>
</div>
</div>
</div>
</div>
</div>
<div class="col">
<div class="card">
<div class="card-header" data-bind="text: awayTeamName">
Away
</div>
<div class="card-body">
<div class="row gx-2">
<div class="col">
<button type="button" class="btn btn-secondary btn-lg p-3"
data-bind="click: addTeamEvent.bind(this,'Away','Try'), enable: isConnected">Try</button>
</div>
<div class="col">
<button type="button" class="btn btn-secondary btn-lg p-3"
data-bind="click: addTeamEvent.bind(this,'Away','Conversion'), enable: isConnected">Conversion</button>
</div>
<div class="col">
<button type="button" class="btn btn-secondary btn-lg p-3"
data-bind="click: addTeamEvent.bind(this,'Away','Penalty'), enable: isConnected">Penalty</button>
</div>
<div class="col">
<button type="button" class="btn btn-secondary btn-lg p-3"
data-bind="click: addTeamEvent.bind(this,'Away','DropGoal'), enable: isConnected">Drop
Goal</button>
</div>
</div>
<div class="row justify-content-center mt-4 gx-4">
<div class="col-2">
<button type="button" class="btn btn-warning btn-lg p-4 mr-4"
data-bind="click: addTeamEvent.bind(this,'Away','YellowCard'), enable: isConnected"></button>
</div>
<div class="col-2">
<button type="button" class=" btn btn-danger btn-lg p-4 ml-4"
data-bind="click: addTeamEvent.bind(this,'Away','RedCard'), enable: isConnected"></button>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- /ko -->
<div data-bind="if: gameOn" class="mt-5">
<div class="scoreboard">
<div class="border">
<div class="team" data-bind="style:{'background-color': homeTeamColor}">
<div class="team-info">
<div class="team-name summary-team-label" data-bind="text: homeTeamName">Home</div>
</div>
<div class="team-details">
<div class="team-score" data-bind="text: homeTeamPoints">0</div>
</div>
</div>
<div class="timer-container">
<!-- ko if: gameState() !== 'WaitingForStart' && gameState() !== 'Finished' && gameState() !== 'HalfTime'-->
<div class="timer" id="match-timer" data-bind="text: calculateRemainingTime"></div>
<div class="half-indicator" data-bind="text: halfIndicator"></div>
<!-- /ko -->
<!-- ko if: gameState() === 'WaitingForStart' -->
<div class="kickoff-indicator" data-bind="text: halfIndicator"></div>
<!-- /ko -->
<!-- ko if: gameState() === 'Finished' -->
<div class="finalscore-indicator">Full Time</div>
<!-- /ko -->
<!-- ko if: gameState() === 'HalfTime' -->
<div class="kickoff-indicator">Half Time</div>
<!-- /ko -->
</div>
<div class="team" data-bind="style:{'background-color': awayTeamColor}">
<div class="team-info">
<div class="team-name summary-team-label" data-bind="text: awayTeamName">Away</div>
</div>
<div class="team-details">
<div class="team-score" data-bind="text: awayTeamPoints">0</div>
</div>
</div>
</div>
</div>
</div>
<!-- ko if: eventList().length === 0 && gameState() !== 'WaitingForStart' -->
<div class="noMatch">No events available yet.</div>
<!-- /ko-->
<!-- ko if: eventList().length > 0 -->
<div class="timeline" data-bind="foreach: eventList">
<!-- ko if: category === 'Match' -->
<div class="timeline-item match">
<div class="timeline-content-match">
<p data-bind="text: $parent.getEventMessage($data)"></p>
</div>
</div>
<!-- /ko -->
<!-- ko ifnot: category === 'Match' -->
<div class="timeline-item">
<div class="timeline-content"
data-bind="css: { away: category ==='Away' }, style: { 'border-color': category === 'Home' ? $parent.homeTeamColor() : $parent.awayTeamColor() }">
<button class="delete-btn" data-bind="click: () => $parent.deleteEvent(id)">
<i class="fa fa-trash"></i>
</button>
<p data-bind="text: $parent.getEventMessage($data)"></p>
</div>
<!-- ko if: eventType !== 'YellowCard' && eventType !== 'RedCard' -->
<span class="score-panel" data-bind="text: $parent.getScoreAtEvent($data.id)"></span>
<!-- /ko -->
<!-- ko if: eventType === 'YellowCard' || eventType === 'RedCard' -->
<i class="fa fa-circle icon"
data-bind="css:{ yc: eventType ==='YellowCard', rc: eventType ==='RedCard' }"></i>
<!-- /ko -->
</div>
<!-- /ko-->
</div>
<!-- /ko -->
</div>
<script src="controller.js" type="text/javascript"></script>
</body>

View File

@ -0,0 +1,291 @@
function Controller(apikey, url) {
const apiKey = apikey; // Replace with your actual API key
const apiUrl = url ?? 'https://localhost:7005/api/Score'; // Replace with your API endpoint URL
console.log(apiKey);
var self = this;
//API poll variables
var INTERVAL = 5000;
var timeout = null;
var currentReq = null;
this.isConnected = ko.observable(false);
//knockout variables
this.gameState = ko.observable("");
this.half = ko.observable("Pre");
this.kickOffTime = ko.observable(new Date());
this.gameOn = ko.observable(false);
this.eventList = ko.observableArray([]);
this.homeTeamName = ko.observable("Uckfield RFC");
this.homeTeamColor = ko.observable("#ff0000");
this.homeTeamPoints = ko.observable(0);
this.homeTeamLogo = ko.observable("");
this.awayTeamName = ko.observable("Away team");
this.awayTeamColor = ko.observable("#0000ff");
this.awayTeamPoints = ko.observable(0);
this.awayTeamLogo = ko.observable("");
self.calculateRemainingTime = ko.computed(function () {
if (self.half() === 'Pre') { return "---"; }
if (self.gameState() === 'HalfTime') { return '40:00'; }
if (self.gameState() === 'Finished') { return '80:00'; }
return calc();
});
var isSecondHalfEvent = function (matchEvts) {
return !!matchEvts.find(e => e.eventType === 'SecondHalfStart');
};
var calc = function (eventId = 0, minsOnly = false) {
var matchEvts = self.eventList().filter(x => (x.category === 'Match' && x.id <= eventId) || x.id === eventId);
var initialTime = self.kickOffTime(); //IF FIRST HALF, WORK OUT FOR IF SECOND HALF
var halfStart = self.kickOffTime();
var offsetMins = 0;
if ((eventId != 0 && isSecondHalfEvent(matchEvts))
|| (eventId == 0 && self.half() === 'Second')) {
var secondHalfEvent = self.eventList().find(x => x.eventType === 'SecondHalfStart');
if (!secondHalfEvent) {
throw 'Invalid System Event State, Second Half without Second Half Event';
}
halfStart = new Date(secondHalfEvent.timeStamp);
initialTime = new Date(secondHalfEvent.timeStamp);
offsetMins = 40;
matchEvts = self.eventList().filter(x => x.id >= secondHalfEvent.id && (x.category === 'Match' || x.id === eventId))
}
if (!matchEvts || matchEvts.length <= 1) {
const diff = calcDiff(initialTime, new Date());
return `${String(diff.mins + offsetMins).padStart(2, "0")}:${String(diff.secs).padStart(2, "0")}`
}
var totalMins = offsetMins;
var totalSecs = 0;
matchEvts.forEach((evt, idx, src) => {
if (eventId === 0 || evt.id <= eventId) {
if (evt.eventType === 'TimeOff') {
var t = calcDiff(initialTime, new Date(evt.timeStamp));
totalMins += t.mins;
totalSecs += t.secs;
}
if (evt.eventType === 'TimeOn') {
initialTime = new Date(evt.timeStamp);
if (idx === (src.length - 1)) {
var t = calcDiff(new Date(evt.timeStamp), new Date());
totalMins += t.mins;
totalSecs += t.secs;
}
}
if (eventId != 0 && eventId === evt.id) {
var t = calcDiff(initialTime, new Date(evt.timeStamp));
totalMins += t.mins;
totalSecs += t.secs;
}
}
});
if (totalSecs >= 60) {
totalMins += 1;
totalSecs = totalSecs % 60;
}
if (minsOnly) {
return `${String(totalMins).padStart(2, "0")}`;
}
return `${String(totalMins).padStart(2, "0")}:${String(totalSecs).padStart(2, "0")}`;
}
self.halfIndicator = ko.computed(function () {
const gameState = self.gameState();
if (gameState === "WaitingForStart") {
var dt = self.kickOffTime();
return `${String(dt.getHours()).padStart(2, "0")}:${String(dt.getMinutes()).padStart(2, "0")} KO`;
}
if (gameState === "FirstHalf") {
return "1st Half";
}
if (gameState === "SecondHalf") {
return "2nd Half";
}
if (gameState === "TimeOff") {
return "Time Off";
}
});
var fetchNewData = function () {
currentReq = fetch(apiUrl, {
method: 'GET',
headers: {
'x-api-key': apiKey
},
});
currentReq
.then(processResponse)
.then(processJson)
.catch((error) => {
self.isConnected(false);
console.log(`Error Occurred retrieving data ${error}`);
})
.then(scheduleNewDataFetch);
};
var processResponse = function (response) {
if (!response.ok) {
self.isConnected(false);
throw new Error('Network response was not ok');
}
self.isConnected(true);
if (response.status === 204) {
self.gameOn(false);
INTERVAL = 60000;
return Promise.reject('no game');
}
INTERVAL = 5000;
return response.json();
};
var processJson = function (data) {
self.eventList(data.eventHistory);
self.gameOn(true);
self.gameState(data.state);
self.half(data.half);
self.kickOffTime(new Date(data.startedAt));
self.homeTeamName(data.home.name);
self.awayTeamName(data.away.name);
self.homeTeamPoints(data.home.points);
self.awayTeamPoints(data.away.points);
};
self.deleteEvent = function (id) {
console.log(`Call to delete event ${id}`);
fetch(`${apiUrl}/event/${id}`, {
method: 'DELETE',
headers: {
'x-api-key': apiKey
}
})
.then(fetchNewData);
};
var scheduleNewDataFetch = function () {
if (timeout) {
clearTimeout(timeout);
}
timeout = setTimeout(fetchNewData, INTERVAL);
};
self.getMatchPendingMessage = function () {
if (self.gameState() === "") {
return "No Match has been configured at this time.";
}
return `The match has not started yet.. Kick off is scheduled for ${self.kickOffTime()}.`;
};
self.addTeamEvent = function (team, evtType) {
const eventData = {
eventType: evtType,
category: team,
timeStamp: new Date().toISOString()
};
fetch(`${apiUrl}/${selectedTeam}`, {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
'x-api-key': apiKey,
},
body: JSON.stringify(eventData),
})
.then(response => response.json())
.then(data => {
console.log('Event data sent successfully:', data);
})
.catch(error => {
console.error('Error sending event data:', error);
});
};
self.getEventMessage = function (evt) {
var eventMins = self.getEventTime(evt);
var eventMsg = parseEventType(evt.eventType);
if (evt.category !== "Match") {
if (evt.eventType === "YellowCard" || evt.eventType === "RedCard") {
return `${eventMins} mins: ${eventMsg}`;
}
return `${eventMins} mins: ${eventMsg} Scored`;
}
return `${eventMsg}`;
}
self.getScoreAtEvent = function (evtId) {
var evts = self.eventList();
var homeScore = 0;
var awayScore = 0;
evts.forEach(evt => {
if (evt.id <= evtId) {
if (evt.category === 'Home') {
homeScore += evt.points;
} else {
awayScore += evt.points;
}
}
});
return `${homeScore} - ${awayScore}`;
}
self.getEventTime = function (evt) {
if (evt.category === 'Match') { return; }
let t = calc(evt.id, true);
return t;
}
var parseEventType = function (evtType) {
switch (evtType) {
case 'DropGoal':
return 'Drop Goal';
case 'HalfTime':
return 'Half Time';
case 'MatchStart':
return 'Match Start';
case 'SecondHalfStart':
return 'Second Half Start';
case 'TimeOff':
return 'Time Off';
case 'TimeOn':
return 'Time On';
case 'YellowCard':
return 'Yellow Card';
case 'RedCard':
return 'Red Card';
case 'MatchEnd':
return 'Full Time';
default:
return evtType;
}
}
var calcDiff = function (startTimeStamp, endTimeStamp) {
var diff = endTimeStamp - startTimeStamp;
const minutes = Math.floor(diff / 60000);
const seconds = Math.floor((diff % 60000) / 1000);
return { mins: minutes, secs: seconds }
}
self.disconnectedMessage = function() {
return `Unable to connect to server: ${apiUrl}`;
};
fetchNewData(); // Starts the update loop
}
var paramsString = window.location.search.split("?")[1];
var paramValues = paramsString.split("&");
var params = {};
paramValues.forEach((param) => {
var paramValue = param.split("=");
params[paramValue[0]] = paramValue[1];
});
ko.applyBindings(new Controller(params.apiKey, params.url));

View File

@ -0,0 +1,283 @@
.scoreboard {
display: flex;
flex-direction: column;
align-items: center;
width: 800px;
margin: 0 auto;
background-color: #e0e0e0;
color: #333;
padding: 10px;
border: 4px solid #800080;
border-radius: 20px;
}
.timer-container {
display: flex;
flex-direction: column;
align-items: center;
position: relative;
width: 120px;
height: 120px;
background-color: #fff;
border: 4px solid #800080;
border-radius: 50%;
margin: 10px;
}
.timer {
font-size: 38px;
color: #333;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.half-indicator {
font-size: 18px;
font-weight: bold;
color: #800080;
position: absolute;
bottom: 10px;
}
.kickoff-indicator {
font-size: 25px;
font-weight: bold;
color: #800080;
margin-top:auto;
margin-bottom:auto;
}
.finalscore-indicator {
font-size: 25px;
font-weight: bold;
color: #800080;
margin-top:auto;
margin-bottom:auto;
}
.border {
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
}
.team-details {
font-size: 48px;
color: white;
background-color: #000;
padding: 0px;
text-align: center;
max-height: 100px;
border-radius: 0px 0px 30px 30px;
}
.team {
flex: 1;
text-align: center;
display: flex;
flex-direction: column;
border-radius: 10px 10px 10px 10px;
background-color: dimgrey;
}
.team-info {
display: flex;
align-items: center;
flex-direction: column;
}
.team-logo {
margin: 10px;
}
.team-logo svg {
max-width: 60px;
max-height: 60px;
background-color: #800080;
padding: 5px;
margin-right:auto;
margin-left:auto;
}
.team-name {
font-weight: bold;
font-size: 20px;
color: white;
margin-bottom: 5px;
display: flex;
align-items: center;
}
.team-score {
font-size: 48px;
color: white;
background-color: #000;
padding: 10px;
text-align: center;
max-height: 100px;
border-radius: 0 0 10px 10px;
}
.score-history {
font-size: 14px;
width: 100%;
text-align: center;
padding: 10px;
}
/* Uckfield RFC's background color */
#home-team {
background-color: #ff0000;
}
/* Away Team's background color */
#away-team {
background-color: #0000ff;
}
/*
eventList
*/
.timeline {
position: relative;
padding: 20px;
width: 50%;
margin-top: 10px;
margin-right: auto;
margin-left: auto;
}
.timeline-item {
display: flex;
align-items: flex-start;
margin-bottom: 40px;
position: relative;
}
.timeline-content {
background-color: #f9f9f9;
padding: 20px;
position: relative;
border-radius: 8px;
border: 1px solid black;
}
.timeline-content-match {
background-color: rgb(69, 69, 69);
color: white;
min-width: 100px;
padding-top: 5px;
padding-bottom: 5px;
padding-left: 30px;
padding-right: 30px;
position: relative;
margin-left: auto;
margin-right: auto;
border-radius: 8px;
border: 1px solid purple;
text-align: center;
}
.match:first-child {
margin-top: -20px;
}
.match:last-child {
margin-bottom: -20px;
}
.score-panel {
font-size: 20px;
color: white;
background-color: gray;
padding: 5px 10px 5px 10px;
position: absolute;
left: 50.1%;
border-radius: 8px;
top: 50%;
transform: translate(-50%, -50%);
z-index: 1;
}
.delete-btn {
position: absolute;
top: 10px;
right: 10px;
background-color: #f00;
/* background-color: #ff6347; */
color: white;
border: none;
padding: 5px 10px;
border-radius: 5px;
cursor: pointer;
}
.icon {
position: absolute;
left: 50.1%;
top: 50%;
transform: translate(-50%, -50%);
color: black;
/* Set the color of the icon */
z-index: 1;
/* Ensure the icon appears above the panel */
}
.yc {
color: yellow;
text-shadow: 0 0 5px #000;
}
.rc {
color: red;
text-shadow: 0 0 5px #000;
}
.away {
margin-left: auto;
}
.timeline:before {
content: '';
position: absolute;
top: 0;
bottom: 0;
left: 50%;
border-left: 2px solid black;
}
@media screen and (min-width: 1500px) {
.timeline-item {
flex-direction: row;
justify-content: space-between;
}
.timeline-content {
width: 40%;
}
}
@media screen and (max-width: 1499px) {
.timeline {
width: 80%;
}
.timeline-item {
flex-direction: row;
justify-content: space-between;
}
.timeline-content {
width: 40%;
}
}
.noMatch {
text-align: center;
}
.summary-team-label {
margin-top: 15px;
margin-bottom: 15px;
font-size: 25px;
}

View File

@ -0,0 +1,76 @@
<!DOCTYPE html>
<head>
<link rel="stylesheet" href="scoreboard.css">
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.5.1/knockout-latest.js"></script>
</head>
<body>
<!-- <div class="scoreboard" data-bind="if: gameOn">
<div class="border">
<div class="team" data-bind="style:{'background-color': homeTeamColor}">
<div class="team-info">
<div class="team-logo">
<img data-bind="attr:{src: homeTeamLogo}" src="https://png.pngtree.com/png-clipart/20210129/ourmid/pngtree-blue-square-button-png-image_2844356.jpg" alt="Home Team Logo">
</div>
<div class="team-name" data-bind="text: homeTeamName">Home</div>
</div>
<div class="team-details">
<div class="team-score" data-bind="text: homeTeamPoints">0</div>
</div>
</div>
<div class="timer-container">
<div class="timer" id="match-timer" data-bind="text: timerValue"></div>
<div class="half-indicator" data-bind="text: halfIndicator"></div>
</div>
<div class="team" data-bind="style:{'background-color': awayTeamColor}">
<div class="team-info">
<div class="team-logo">
<img data-bind="attr:{src: homeTeamLogo}" src="https://png.pngtree.com/png-clipart/20210129/ourmid/pngtree-blue-square-button-png-image_2844356.jpg" alt="AWAY TEAM">
<div class="team-name" data-bind="text: awayTeamName">Away</div>
</div>
</div>
<div class="team-details">
<div class="team-score" data-bind="text: awayTeamPoints">0</div>
</div>
</div>
</div>
</div> -->
<div data-bind="if: gameOn">
<div class="scoreboard">
<div class="border">
<div class="team" data-bind="style:{'background-color': homeTeamColor}">
<div class="team-info">
<div class="team-name summary-team-label" data-bind="text: homeTeamName">Home</div>
</div>
<div class="team-details">
<div class="team-score" data-bind="text: homeTeamPoints">0</div>
</div>
</div>
<div class="timer-container">
<!-- ko if: gameState() !== 'WaitingForStart' && gameState() !== 'Finished' && gameState() !== 'HalfTime'-->
<div class="timer" id="match-timer" data-bind="text: calculateRemainingTime"></div>
<div class="half-indicator" data-bind="text: halfIndicator"></div>
<!-- /ko -->
<!-- ko if: gameState() === 'WaitingForStart' -->
<div class="kickoff-indicator" data-bind="text: halfIndicator"></div>
<!-- /ko -->
<!-- ko if: gameState() === 'Finished' -->
<div class="finalscore-indicator">Full Time</div>
<!-- /ko -->
<!-- ko if: gameState() === 'HalfTime' -->
<div class="kickoff-indicator">Half Time</div>
<!-- /ko -->
</div>
<div class="team" data-bind="style:{'background-color': awayTeamColor}">
<div class="team-info">
<div class="team-name summary-team-label" data-bind="text: awayTeamName">Away</div>
</div>
<div class="team-details">
<div class="team-score" data-bind="text: awayTeamPoints">0</div>
</div>
</div>
</div>
</div>
<script src="scoreboardViewModel.js" type="text/javascript"></script>
</body>

View File

@ -0,0 +1,179 @@
function MatchEvent(event){
var self = this;
self.id = ko.observable(event.id);
self.eventType = ko.observable(event.EventType);
self.eventTimeStamp = ko.observable(event.TimeStamp);
self.eventPoint = ko.observable(event.Points);
}
function Team (team){
var self = this;
self.name = ko.observable(team.name);
self.points = ko.observable(team.points);
self.eventHistory = ko.observableArray(team.EventHistory.map((evt) => new MatchEvent(evt)));
}
function ScoreboardViewModel() {
const apiKey = '396A62D6-0192-4738-8F45-8AAF7BCFA3EC'; // Replace with your actual API key
const apiUrl = 'https://localhost:7005/api/Score'; // Replace with your API endpoint URL
var self = this;
//API poll variables
var INTERVAL = 5000;
var timeout = null;
var currentReq = null;
//knockout variables
this.gameState = ko.observable("");
this.half = ko.observable("Pre");
this.kickOffTime = ko.observable(new Date());
this.gameOn = ko.observable(false);
this.eventList = ko.observableArray([]);
this.homeTeamName = ko.observable("Uckfield RFC");
this.homeTeamColor = ko.observable("#ff0000");
this.homeTeamPoints = ko.observable(0);
this.homeTeamLogo = ko.observable("");
this.awayTeamName = ko.observable("Away team");
this.awayTeamColor = ko.observable("#0000ff");
this.awayTeamPoints = ko.observable(0);
this.awayTeamLogo = ko.observable("");
self.calculateRemainingTime = ko.computed(function () {
if (self.half() === 'Pre') { return "---"; }
if (self.gameState() === 'HalfTime') { return '40:00'; }
if (self.gameState() === 'Finished') { return '80:00'; }
return calc();
});
var isSecondHalfEvent=function(matchEvts){
return !!matchEvts.find(e=>e.eventType === 'SecondHalfStart');
};
var calc = function (eventId = 0, minsOnly=false) {
var matchEvts = self.eventList().filter(x => (x.category === 'Match' && x.id <= eventId) || x.id === eventId);
var initialTime = self.kickOffTime(); //IF FIRST HALF, WORK OUT FOR IF SECOND HALF
var halfStart = self.kickOffTime();
var offsetMins = 0;
if ((eventId != 0 &&isSecondHalfEvent(matchEvts))
|| (eventId == 0 && self.half() === 'Second')) {
var secondHalfEvent = self.eventList().find(x => x.eventType === 'SecondHalfStart');
if (!secondHalfEvent) {
throw 'Invalid System Event State, Second Half without Second Half Event';
}
halfStart = new Date(secondHalfEvent.timeStamp);
initialTime = new Date(secondHalfEvent.timeStamp);
offsetMins = 40;
matchEvts = self.eventList().filter(x=>x.id >= secondHalfEvent.id && (x.category === 'Match' || x.id === eventId))
}
if (!matchEvts || matchEvts.length <= 1) {
const diff = calcDiff(initialTime, new Date());
return `${String(diff.mins + offsetMins).padStart(2, "0")}:${String(diff.secs).padStart(2, "0")}`
}
var totalMins = offsetMins;
var totalSecs = 0;
matchEvts.forEach((evt, idx, src) => {
if (eventId === 0 || evt.id <= eventId) {
if (evt.eventType === 'TimeOff') {
var t = calcDiff(initialTime, new Date(evt.timeStamp));
totalMins += t.mins;
totalSecs += t.secs;
}
if (evt.eventType === 'TimeOn') {
initialTime = new Date(evt.timeStamp);
if(idx === (src.length-1)){
var t = calcDiff(new Date(evt.timeStamp), new Date());
totalMins += t.mins;
totalSecs += t.secs;
}
}
if (eventId != 0 && eventId === evt.id) {
var t = calcDiff(initialTime, new Date(evt.timeStamp));
totalMins += t.mins;
totalSecs += t.secs;
}
}
});
if (totalSecs >= 60) {
totalMins += 1;
totalSecs = totalSecs % 60;
}
if(minsOnly){
return `${String(totalMins).padStart(2, "0")}`;
}
return `${String(totalMins).padStart(2, "0")}:${String(totalSecs).padStart(2, "0")}`;
}
self.halfIndicator = ko.computed(function () {
const gameState = self.gameState();
if (gameState === "WaitingForStart") {
var dt = self.kickOffTime();
return `${String(dt.getHours()).padStart(2, "0")}:${String(dt.getMinutes()).padStart(2, "0")} KO`;
}
if (gameState === "FirstHalf") {
return "1st Half";
}
if (gameState === "SecondHalf") {
return "2nd Half";
}
if (gameState === "TimeOff") {
return "Time Off";
}
});
var fetchNewData = function() {
currentReq = fetch(apiUrl, {
method: 'GET',
headers: {
'x-api-key': apiKey
},
});
currentReq
.then(processResponse)
.then(processJson)
.catch((error)=>console.log(`Error Occurred retrieving data ${error}`))
.then(scheduleNewDataFetch);
};
var processResponse = function(response) {
if (!response.ok) {
throw new Error('Network response was not ok');
}
if(response.status === 204){
self.gameOn(false);
INTERVAL = 60000;
return Promise.reject('no game');
}
INTERVAL = 5000;
return response.json();
};
var processJson = function(data) {
self.eventList(data.eventHistory);
self.gameOn(true);
self.gameState(data.state);
self.half(data.half);
self.kickOffTime(new Date(data.startedAt));
self.homeTeamName(data.home.name);
self.awayTeamName(data.away.name);
self.homeTeamPoints(data.home.points);
self.awayTeamPoints(data.away.points);
};
var scheduleNewDataFetch = function() {
if (timeout) {
clearTimeout(timeout);
}
timeout = setTimeout(fetchNewData, INTERVAL);
};
fetchNewData(); // Starts the update loop
}
ko.applyBindings(new ScoreboardViewModel());

View File

@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.6.33723.286
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScoreboardApi", "ScoreboardApi\ScoreboardApi.csproj", "{9F80E54A-D08F-4FC5-A56D-ADE8EA381CAF}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{9F80E54A-D08F-4FC5-A56D-ADE8EA381CAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9F80E54A-D08F-4FC5-A56D-ADE8EA381CAF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9F80E54A-D08F-4FC5-A56D-ADE8EA381CAF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9F80E54A-D08F-4FC5-A56D-ADE8EA381CAF}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {DE24DFDF-6F5A-4851-A186-66A1D1C52A87}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,5 @@
<SolutionConfiguration>
<Settings>
<CurrentEngineMode>Run all tests automatically [Global]</CurrentEngineMode>
</Settings>
</SolutionConfiguration>

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path fill="#000000" d="M247 18v135.193c5.95-3.097 11.95-6.065 18-8.89V18h-18zm192 0v247.6l-174-.688v-60.457c-6.182 5.902-12.18 11.908-18 18V311h18v-28.088l174 .688V311h18V18h-18zm-80.1 71.914c-7.024-.18-15.588 2.472-20.54 6.463-7.925 6.386-14.468 22.533-9.155 29.127 5.313 6.594 22.48 3.634 30.406-2.752 7.926-6.386 14.47-22.533 9.158-29.127-1.993-2.473-5.653-3.602-9.868-3.71zm-54.125 57.334C168.5 198.266 48.38 324.17 25.043 471.803l17.316 3.365c15.157-100.106 61.737-149.502 92.28-179.856C120.173 337.77 79.376 405.92 78.27 482.145l21.605 4.2c4.238-108.047 78.028-244.59 204.902-339.097zM241.068 329v158h30V329h-30zm191.618 0v158h30V329h-30z"/></svg>

After

Width:  |  Height:  |  Size: 864 B

123
HTML/Original/eventList.css Normal file
View File

@ -0,0 +1,123 @@
* {
box-sizing: border-box;
}
/* Set a background color */
body {
background-color: #b8b8ba;
font-family: Helvetica, sans-serif;
}
/* The actual timeline (the vertical ruler) */
.timeline {
position: relative;
padding: 20px;
}
.timeline-item {
display: flex;
align-items: flex-start;
margin-bottom: 40px;
position: relative;
}
.timeline-content {
background-color: #f9f9f9;
padding: 20px;
position: relative;
border-radius: 8px;
border: 1px solid black;
}
.timeline-content-match {
background-color: rgb(69, 69, 69);
color: white;
min-width: 100px;
padding-top: 5px;
padding-bottom: 5px;
padding-left: 30px;
padding-right: 30px;
position: relative;
margin-left: auto;
margin-right: auto;
border-radius: 8px;
border: 1px solid purple;
text-align:center;
}
.match:first-child {
margin-top: -20px;
}
.match:last-child {
margin-bottom: -20px;
}
.score-panel {
font-size: 20px;
color: white;
background-color: gray;
padding: 5px 10px 5px 10px;
position: absolute;
left: 50.1%;
border-radius: 8px;
top: 50%;
transform: translate(-50%, -50%);
z-index: 1;
}
.delete-btn {
position: absolute;
top: 10px;
right: 10px;
background-color: #f00;
/* background-color: #ff6347; */
color: white;
border: none;
padding: 5px 10px;
border-radius: 5px;
cursor: pointer;
}
.icon {
position: absolute;
left: 50.1%;
top: 50%;
transform: translate(-50%, -50%);
color: black;
/* Set the color of the icon */
z-index: 1;
/* Ensure the icon appears above the panel */
}
.yc {
color: yellow;
}
.rc {
color: red;
}
.away+.icon {
color: red;
}
.away {
margin-left: auto;
}
.timeline:before {
content: '';
position: absolute;
top: 0;
bottom: 0;
left: 50%;
border-left: 2px solid black;
}
@media screen and (min-width: 768px) {
.timeline-item {
flex-direction: row;
justify-content: space-between;
}
.timeline-content {
width: 45%;
}
}

View File

@ -0,0 +1,58 @@
<!DOCTYPE html>
<head>
<link href="eventList.css" rel="stylesheet" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css"
integrity="5e2ESR8Ycmos6g3gAKr1Jvwye8sW4U1u/cAKulfVJnkakCcMqhOudbtPnvJ+nbv7" crossorigin="anonymous">
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.5.1/knockout-latest.js"
integrity="sha512-2AL/VEauKkZqQU9BHgnv48OhXcJPx9vdzxN1JrKDVc4FPU/MEE/BZ6d9l0mP7VmvLsjtYwqiYQpDskK9dG8KBA=="
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"
integrity="sha512-v2CJ7UaYy4JwqLDIrZUI/4hqeoQieOmAZNXBeQyjo21dadnwR+8ZaIJVT8EE2iyI61OV8e6M8PP2/4hpQINQ/g=="
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
</head>
<body>
<!--
TODO:
Add kick off time when match not started
Add match event support (across line) in black and white.
-->
<!-- ko if: eventList().length === 0 -->
<div> no events yet </div>
<!-- /ko-->
<!-- ko if: eventList().length > 0 -->
<div class="timeline" data-bind="foreach: eventList">
<!-- ko if: category === 'Match' -->
<div class="timeline-item match">
<div class="timeline-content-match">
<p data-bind="text: $parent.getEventMessage($data)"></p>
</div>
</div>
<!-- /ko -->
<!-- ko ifnot: category === 'Match' -->
<div class="timeline-item">
<div class="timeline-content"
data-bind="css: { away: category ==='Away' }, style: { 'border-color': category === 'Home' ? $parent.homeTeamColor() : $parent.awayTeamColor() }">
<button class="delete-btn" data-bind="click: () => $parent.deleteEvent(id)">
<i class="fa fa-trash"></i>
</button>
<p data-bind="text: $parent.getEventMessage($data)"></p>
</div>
<!-- ko if: eventType !== 'YellowCard' && eventType !== 'RedCard' -->
<span class="score-panel" data-bind="text: $parent.getScoreAtEvent($data.id)"></span>
<!-- /ko -->
<!-- ko if: eventType === 'YellowCard' || eventType === 'RedCard' -->
<i class="fa fa-circle icon" data-bind="css:{ yc: eventType ==='YellowCard', rc: eventType==='RedCard' }"></i>
<!-- /ko -->
</div>
<!-- /ko-->
</div>
<!-- /ko -->
<script src="eventList.js" type="text/javascript"></script>
</body>

143
HTML/Original/eventList.js Normal file
View File

@ -0,0 +1,143 @@
class eventModel {
constructor(id, eventDate, points, type, team) {
this.id = id;
this.eventDate = eventDate;
this.points = points;
this.eventType = type;
this.team = team;
}
}
function viewModel() {
const apiKey = '396A62D6-0192-4738-8F45-8AAF7BCFA3EC'; // Replace with your actual API key
const apiUrl = 'https://localhost:7005/api/Score'; // Replace with your API endpoint URL
var self = this;
//API poll variables
var INTERVAL = 5000;
var timeout = null;
var currentReq = null;
//knockout variables
self.gameState = ko.observable("");
self.kickOffTime = ko.observable(new Date());
self.homeTeamName = ko.observable("Uckfield RFC");
self.homeTeamColor = ko.observable("#ff0000");
self.awayTeamName = ko.observable("Away team");
self.awayTeamColor = ko.observable("#0000ff");
self.eventsHome = ko.observableArray([]);
self.eventsAway = ko.observableArray([]);
self.convertToUiEvent = function (team, evt) {
return new eventModel(evt.id, evt.timeStamp, evt.points, evt.eventType, team);
};
this.homeTeamColor = ko.observable("#ff0000");
this.awayTeamColor = ko.observable("#0000ff");
self.eventList = ko.observableArray([]);
// ko.computed(function () {
// if (self.eventsHome().length === 0 && self.eventsAway().length === 0) {
// return [];
// }
// var mappedHomeEvents = self.eventsHome().map(function (e) {
// return self.convertToUiEvent("home", e);
// });
// var mappedAwayEvents = self.eventsAway().map(function (e) {
// return self.convertToUiEvent("away", e);
// });
// var combinedEvents = mappedHomeEvents.concat(mappedAwayEvents);
// var sortedEvents = combinedEvents.sort((evtA, evtB) => evtA.id - evtB.id);
// return sortedEvents;
// }, self);
self.deleteEvent = function (id) {
console.log(`Call to delete event ${id}`);
fetch(`${apiUrl}/event/${id}`, {
method: 'DELETE',
headers: {
'x-api-key': apiKey
}
})
.then(fetchNewData);
};
var fetchNewData = function () {
currentReq = fetch(apiUrl, {
method: 'GET',
headers: {
'x-api-key': apiKey
},
});
currentReq
.then(processResponse)
.then(processJson)
.catch((error) => {
return console.log(`Error Occurred retrieving data ${error}`);
})
.then(scheduleNewDataFetch);
};
var processResponse = function (response) {
if (!response.ok) {
INTERVAL = 60000;
throw new Error('Network response was not ok');
}
if (response.status === 204) {
INTERVAL = 60000;
return Promise.reject('No Game');
}
INTERVAL = 5000;
return response.json();
};
var processJson = function (data) {
self.gameState(data.state);
self.kickOffTime(new Date(data.startedAt));
self.homeTeamName(data.home.name);
self.awayTeamName(data.away.name);
self.homeTeamColor(data.home.color);
self.awayTeamColor(data.away.color);
self.eventList(data.eventHistory);
};
var scheduleNewDataFetch = function () {
if (timeout) {
clearTimeout(timeout);
}
timeout = setTimeout(fetchNewData, INTERVAL);
};
self.getEventMessage = function(evt) {
var eventDate = new Date(evt.eventDate);
var timeElapsed = eventDate - self.kickOffTime();
var diffMins = Math.round(((timeElapsed % 86400000) % 3600000) / 60000);
return `T${diffMins}: ${evt.eventType} Scored`
}
self.getScoreAtEvent = function(evtId){
var evts = self.eventList();
var homeScore = 0;
var awayScore = 0;
evts.forEach(evt => {
if(evt.id <= evtId){
if(evt.category ==='Home'){
homeScore += evt.points;
} else {
awayScore += evt.points;
}
}
});
return `${homeScore} - ${awayScore}`;
}
fetchNewData(); // Starts the update loop
};
ko.applyBindings(new viewModel());

View File

@ -0,0 +1,148 @@
<!DOCTYPE html>
<html>
<head>
<title>Team and Event Selector</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL" crossorigin="anonymous"></script>
</head>
<body>
<h1>Team Information</h1>
<form id="matchForm" class="container">
<div class="mb-3 row">
<label for="teamName" class="col-sm-2 col-form-label">Home Team Name:</label>
<div class="col-sm-10">
<input class="form-control" type="text" id="homeTeamName" name="homeTeamName" required>
</div>
</div>
</div>
<br>
<div class="mb-3 row">
<label for="homeTeamColor" class="col-sm-2 col-form-label">Home Team Colour:</label>
<div class="col-sm-10">
<input class="form-control form-control-color" type="color" id="homeTeamColor" name="homeTeamColor" required>
</div>
</div>
<br>
<div class="mb-3 row">
<label for="awayTeamName" class="col-sm-2 col-form-label">Away Team Name:</label>
<div class="col-sm-10">
<input class="form-control" type="text" id="awayTeamName" name="awayTeamName" required>
</div>
</div>
<br>
<div class="mb-3 row">
<label for="awayTeamColor" class="col-sm-2 col-form-label">Away Team Colour:</label>
<div class="col-sm-10">
<input class="form-control form-control-color" type="color" id="awayTeamColor" name="awayTeamColor" required>
</div>
</div>
<br>
<div class="mb-3 row">
<label for="kickOffTime" class="col-sm-2 col-form-label">Kick Off Time:</label>
<div class="col-sm-10">
<input class="form-control" type="datetime-local" id="kickOffTime" name="kickOffTime" required>
</div>
</div>
<br>
<div class="d-grid gap-2 d-md-flex justify-content-md-end">
<input type="submit" value="Create Match" class="btn btn-primary float-right">
</div>
</form>
<h1>Event Selector</h1>
<form id="eventForm">
<label for="eventType">Event Type:</label>
<select id="eventType" name="eventType" required>
<option value="" disabled selected>Select an Event</option>
<option value="Try">Try</option>
<option value="Penalty">Penalty</option>
<option value="Conversion">Conversion</option>
<option value="DropGoal">Drop Goal</option>
<option value="SecondHalfStart">Second Half Start</option>
</select>
<br>
<label for="team">Team:</label>
<select id="team" name="team">
<option value="">Select a Team (optional)</option>
<option value="Home">Uckfield</option>
<option value="Away">Away</option>
</select>
<br>
<input type="submit" value="Submit Event">
</form>
<script>
// Replace 'YOUR_API_URL' and 'YOUR_API_KEY' with your actual API URL and API key
const apiKey = '396A62D6-0192-4738-8F45-8AAF7BCFA3EC'; // Replace with your actual API key
document.getElementById("matchForm").addEventListener("submit", function (event) {
event.preventDefault();
const homeTeamName = document.getElementById("homeTeamName").value;
const homeTeamColor = document.getElementById("homeTeamColor").value;
const awayTeamName = document.getElementById("awayTeamName").value;
const awayTeamColor = document.getElementById("awayTeamColor").value;
const koTime = document.getElementById("kickOffTime").value;
const apiUrl = 'https://localhost:7005/api/Score'; // Replace with your API endpoint URL
const matchData = {
home: {
name: homeTeamName,
colour: homeTeamColor,
abbreviation: homeTeamName.slice(0,3)
},
away:{
name: awayTeamName,
colour: awayTeamColor,
abbreviation: awayTeamName.slice(0,3)
},
kickOffTime: koTime
};
fetch(apiUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-api-key': apiKey,
},
body: JSON.stringify(matchData),
})
.then(response => response.json())
.then(data => {
console.log('Match data sent successfully:', data);
})
.catch(error => {
console.error('Error sending team data:', error);
});
});
document.getElementById("eventForm").addEventListener("submit", function (event) {
event.preventDefault();
const apiUrl = 'https://localhost:7005/api/Score/event'; // Replace with your API endpoint URL
const eventType = document.getElementById("eventType").value;
const selectedTeam = document.getElementById("team").value;
const eventData = {
eventType: eventType,
timeStamp: new Date().toISOString()
};
fetch(`${apiUrl}/${selectedTeam}`, {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
'x-api-key': apiKey,
},
body: JSON.stringify(eventData),
})
.then(response => response.json())
.then(data => {
console.log('Event data sent successfully:', data);
})
.catch(error => {
console.error('Error sending event data:', error);
});
});
</script>
</body>
</html>

View File

@ -0,0 +1,120 @@
.scoreboard {
display: flex;
flex-direction: column;
align-items: center;
width: 800px;
margin: 0 auto;
background-color: #e0e0e0;
color: #333;
padding: 10px;
border: 4px solid #800080;
border-radius: 20px;
}
.timer-container {
display: flex;
flex-direction: column;
align-items: center;
position: relative;
width: 120px;
height: 120px;
background-color: #fff;
border: 4px solid #800080;
border-radius: 50%;
margin: 10px;
}
.timer {
font-size: 38px;
color: #333;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.half-indicator {
font-size: 18px;
font-weight: bold;
color: #800080;
position: absolute;
bottom: 10px;
}
.border {
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
}
.team-details {
font-size: 48px;
color: white;
background-color: #000;
padding: 0px;
text-align: center;
max-height: 100px;
border-radius: 0px 0px 30px 30px;
}
.team {
flex: 1;
text-align: center;
display: flex;
flex-direction: column;
border-radius: 10px 10px 10px 10px;
}
.team-info {
display: flex;
align-items: center;
flex-direction: column;
}
.team-logo img {
max-width: 50px;
max-height: 50px;
border-radius: 50%;
background-color: #800080;
padding: 5px;
margin-top: 5px;
}
.team-name {
font-weight: bold;
font-size: 20px;
color: white;
margin-bottom: 5px;
display: flex;
align-items: center;
}
.team-score {
font-size: 48px;
color: white;
background-color: #000;
padding: 10px;
text-align: center;
max-height: 100px;
border-radius: 0 0 10px 10px;
}
.score-history {
font-size: 14px;
width: 100%;
text-align: center;
padding: 10px;
}
/* Uckfield RFC's background color */
#home-team {
background-color: #ff0000;
}
/* Away Team's background color */
#away-team {
background-color: #0000ff;
}

View File

@ -0,0 +1,39 @@
<!DOCTYPE html>
<head>
<link rel="stylesheet" href="scoreboard.css">
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.5.1/knockout-latest.js"></script>
</head>
<body>
<div class="scoreboard" data-bind="if: gameOn">
<div class="border">
<div class="team" data-bind="style:{'background-color': homeTeamColor}">
<div class="team-info">
<div class="team-logo">
<img data-bind="attr:{src: homeTeamLogo}" src="https://png.pngtree.com/png-clipart/20210129/ourmid/pngtree-blue-square-button-png-image_2844356.jpg" alt="Home Team Logo">
</div>
<div class="team-name" data-bind="text: homeTeamName">Home</div>
</div>
<div class="team-details">
<div class="team-score" data-bind="text: homeTeamPoints">0</div>
</div>
</div>
<div class="timer-container">
<div class="timer" id="match-timer" data-bind="text: timerValue"></div>
<div class="half-indicator" data-bind="text: halfIndicator"></div>
</div>
<div class="team" data-bind="style:{'background-color': awayTeamColor}">
<div class="team-info">
<div class="team-logo">
<img data-bind="attr:{src: homeTeamLogo}" src="https://png.pngtree.com/png-clipart/20210129/ourmid/pngtree-blue-square-button-png-image_2844356.jpg" alt="AWAY TEAM">
<div class="team-name" data-bind="text: awayTeamName">Away</div>
</div>
</div>
<div class="team-details">
<div class="team-score" data-bind="text: awayTeamPoints">0</div>
</div>
</div>
</div>
</div>
<script src="scoreboardViewModel.js" type="text/javascript"></script>
</body>

View File

@ -0,0 +1,118 @@
function MatchEvent(event){
var self = this;
self.id = ko.observable(event.id);
self.eventType = ko.observable(event.EventType);
self.eventTimeStamp = ko.observable(event.TimeStamp);
self.eventPoint = ko.observable(event.Points);
}
function Team (team){
var self = this;
self.name = ko.observable(team.name);
self.points = ko.observable(team.points);
self.eventHistory = ko.observableArray(team.EventHistory.map((evt) => new MatchEvent(evt)));
}
function ScoreboardViewModel() {
const apiKey = '396A62D6-0192-4738-8F45-8AAF7BCFA3EC'; // Replace with your actual API key
const apiUrl = 'https://localhost:7005/api/Score'; // Replace with your API endpoint URL
const matchDuration = 80 * 60 * 1000;
var self = this;
//API poll variables
var INTERVAL = 5000;
var timeout = null;
var currentReq = null;
//knockout variables
this.gameState = ko.observable("");
this.kickOffTime = ko.observable(new Date());
this.gameOn = ko.observable(false);
this.homeTeamName = ko.observable("Uckfield RFC");
this.homeTeamColor = ko.observable("#ff0000");
this.homeTeamPoints = ko.observable(0);
this.homeTeamLogo = ko.observable("");
this.homeTeamEvents = ko.observable([]);
this.awayTeamName = ko.observable("Away team");
this.awayTeamColor = ko.observable("#0000ff");
this.awayTeamPoints = ko.observable(0);
this.awayTeamLogo = ko.observable("");
this.awayEvents = ko.observableArray([]);
self.timerValue = ko.computed( function() {
const currentTime = new Date();
const elapsedTime = currentTime - self.kickOffTime();
const remainingTime = Math.max(0, matchDuration - elapsedTime);
const minutes = Math.floor(remainingTime / 60000);
const seconds = Math.floor((remainingTime % 60000) / 1000);
return `${String(minutes).padStart(2, "0")}:${String(seconds).padStart(2, "0")}`;
});
self.halfIndicator = ko.computed(function(){
const gameState = self.gameState();
if(gameState ==="WaitingForStart"){
var dt = self.kickOffTime();
return `KO @${String(dt.getHours()).padStart(2,"0")}:${String(dt.getMinutes()).padStart(2,"0")}`;
}
if(gameState === "FirstHalf"){
return "1st Half";
}
if(gameState === "SecondHalf"){
return "2nd Half";
}
});
var fetchNewData = function() {
currentReq = fetch(apiUrl, {
method: 'GET',
headers: {
'x-api-key': apiKey
},
});
currentReq
.then(processResponse)
.then(processJson)
.catch((error)=>console.log(`Error Occurred retrieving data ${error}`))
.then(scheduleNewDataFetch);
};
var processResponse = function(response) {
if (!response.ok) {
throw new Error('Network response was not ok');
}
if(response.status === 204){
self.gameOn(false);
INTERVAL = 60000;
return Promise.reject('no game');
}
INTERVAL = 5000;
return response.json();
};
var processJson = function(data) {
self.gameOn(true);
self.gameState(data.state);
self.kickOffTime(new Date(data.startedAt));
self.homeTeamName(data.home.name);
self.awayTeamName(data.away.name);
self.homeTeamPoints(data.home.points);
self.awayTeamPoints(data.away.points);
};
var scheduleNewDataFetch = function() {
if (timeout) {
clearTimeout(timeout);
}
timeout = setTimeout(fetchNewData, INTERVAL);
};
fetchNewData(); // Starts the update loop
}
ko.applyBindings(new ScoreboardViewModel());

18
HTML/Original/try.svg Normal file
View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg fill="#000000" height="800px" width="800px" version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
viewBox="0 0 434.979 434.979" xml:space="preserve">
<path d="M406.43,28.55C387.752,9.872,360.395,0,327.317,0C258.74,0,174.729,41.409,108.069,108.068
C5.654,210.485-30.761,347.117,28.55,406.43c18.676,18.676,46.031,28.548,79.11,28.55c0.004,0,0.005,0,0.01,0
c68.57,0,152.578-41.41,219.238-108.07C429.325,224.493,465.741,87.861,406.43,28.55z M42.952,392.531
c-0.084-0.083-0.175-0.16-0.259-0.243c-0.015-0.015-0.028-0.031-0.043-0.046c-11.927-12.018-7.169-44.407,12.431-84.564
c22.416-45.925,60.796-97.253,108.07-144.526C250.426,75.875,332.301,36.124,371.44,36.124c9.469,0,16.479,2.208,20.839,6.56
c0.003,0.003,0.006,0.005,0.009,0.008c11.982,11.984,7.234,44.403-12.389,84.608c-22.416,45.926-60.797,97.253-108.071,144.527
c-87.279,87.28-169.153,127.029-208.288,127.026C54.244,398.853,47.325,396.722,42.952,392.531z M122.211,122.211
C185.258,59.165,263.85,20,327.317,20c4.708,0,9.252,0.246,13.647,0.696c-53.443,14.506-126.1,62.457-191.956,128.313
c-48.799,48.799-88.539,102.033-111.9,149.896c-7.542,15.452-13.045,29.755-16.511,42.717
C14.077,280.355,52.43,191.993,122.211,122.211z M312.766,312.767c-63.05,63.051-141.642,102.216-205.104,102.213
c-4.708,0-9.253-0.246-13.648-0.697c53.442-14.505,126.099-62.456,191.956-128.313c48.799-48.8,88.54-102.034,111.901-149.897
c7.543-15.453,13.046-29.758,16.512-42.72C420.904,154.619,382.55,242.983,312.766,312.767z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,123 @@
* {
box-sizing: border-box;
}
/* Set a background color */
body {
background-color: #b8b8ba;
font-family: Helvetica, sans-serif;
}
/* The actual timeline (the vertical ruler) */
.timeline {
position: relative;
padding: 20px;
}
.timeline-item {
display: flex;
align-items: flex-start;
margin-bottom: 40px;
position: relative;
}
.timeline-content {
background-color: #f9f9f9;
padding: 20px;
position: relative;
border-radius: 8px;
border: 1px solid black;
}
.timeline-content-match {
background-color: rgb(69, 69, 69);
color: white;
min-width: 100px;
padding-top: 5px;
padding-bottom: 5px;
padding-left: 30px;
padding-right: 30px;
position: relative;
margin-left: auto;
margin-right: auto;
border-radius: 8px;
border: 1px solid purple;
text-align:center;
}
.match:first-child {
margin-top: -20px;
}
.match:last-child {
margin-bottom: -20px;
}
.score-panel {
font-size: 20px;
color: white;
background-color: gray;
padding: 5px 10px 5px 10px;
position: absolute;
left: 50.1%;
border-radius: 8px;
top: 50%;
transform: translate(-50%, -50%);
z-index: 1;
}
.delete-btn {
position: absolute;
top: 10px;
right: 10px;
background-color: #f00;
/* background-color: #ff6347; */
color: white;
border: none;
padding: 5px 10px;
border-radius: 5px;
cursor: pointer;
}
.icon {
position: absolute;
left: 50.1%;
top: 50%;
transform: translate(-50%, -50%);
color: black;
/* Set the color of the icon */
z-index: 1;
/* Ensure the icon appears above the panel */
}
.yc {
color: yellow;
}
.rc {
color: red;
}
.away+.icon {
color: red;
}
.away {
margin-left: auto;
}
.timeline:before {
content: '';
position: absolute;
top: 0;
bottom: 0;
left: 50%;
border-left: 2px solid black;
}
@media screen and (min-width: 768px) {
.timeline-item {
flex-direction: row;
justify-content: space-between;
}
.timeline-content {
width: 45%;
}
}

View File

@ -0,0 +1,58 @@
<!DOCTYPE html>
<head>
<link href="eventList.css" rel="stylesheet" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css"
integrity="5e2ESR8Ycmos6g3gAKr1Jvwye8sW4U1u/cAKulfVJnkakCcMqhOudbtPnvJ+nbv7" crossorigin="anonymous">
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.5.1/knockout-latest.js"
integrity="sha512-2AL/VEauKkZqQU9BHgnv48OhXcJPx9vdzxN1JrKDVc4FPU/MEE/BZ6d9l0mP7VmvLsjtYwqiYQpDskK9dG8KBA=="
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"
integrity="sha512-v2CJ7UaYy4JwqLDIrZUI/4hqeoQieOmAZNXBeQyjo21dadnwR+8ZaIJVT8EE2iyI61OV8e6M8PP2/4hpQINQ/g=="
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
</head>
<body>
<!--
TODO:
Add kick off time when match not started
Add match event support (across line) in black and white.
-->
<!-- ko if: eventList().length === 0 -->
<div> no events yet </div>
<!-- /ko-->
<!-- ko if: eventList().length > 0 -->
<div class="timeline" data-bind="foreach: eventList">
<!-- ko if: category === 'Match' -->
<div class="timeline-item match">
<div class="timeline-content-match">
<p data-bind="text: $parent.getEventMessage($data)"></p>
</div>
</div>
<!-- /ko -->
<!-- ko ifnot: category === 'Match' -->
<div class="timeline-item">
<div class="timeline-content"
data-bind="css: { away: category ==='Away' }, style: { 'border-color': category === 'Home' ? $parent.homeTeamColor() : $parent.awayTeamColor() }">
<button class="delete-btn" data-bind="click: () => $parent.deleteEvent(id)">
<i class="fa fa-trash"></i>
</button>
<p data-bind="text: $parent.getEventMessage($data)"></p>
</div>
<!-- ko if: eventType !== 'YellowCard' && eventType !== 'RedCard' -->
<span class="score-panel" data-bind="text: $parent.getScoreAtEvent($data.id)"></span>
<!-- /ko -->
<!-- ko if: eventType === 'YellowCard' || eventType === 'RedCard' -->
<i class="fa fa-circle icon" data-bind="css:{ yc: eventType ==='YellowCard', rc: eventType==='RedCard' }"></i>
<!-- /ko -->
</div>
<!-- /ko-->
</div>
<!-- /ko -->
<script src="eventList.js" type="text/javascript"></script>
</body>

View File

@ -0,0 +1,105 @@
function viewModel() {
const apiKey = '396A62D6-0192-4738-8F45-8AAF7BCFA3EC'; // Replace with your actual API key
const apiUrl = 'https://localhost:7005/api/Score'; // Replace with your API endpoint URL
var self = this;
//API poll variables
var INTERVAL = 5000;
var timeout = null;
var currentReq = null;
//knockout variables
self.gameState = ko.observable("");
self.kickOffTime = ko.observable(new Date());
self.homeTeamName = ko.observable("Uckfield RFC");
self.homeTeamColor = ko.observable("#ff0000");
self.awayTeamName = ko.observable("Away team");
self.awayTeamColor = ko.observable("#0000ff");
self.eventsHome = ko.observableArray([]);
self.eventsAway = ko.observableArray([]);
this.homeTeamColor = ko.observable("#ff0000");
this.awayTeamColor = ko.observable("#0000ff");
self.eventList = ko.observableArray([]);
var fetchNewData = function () {
currentReq = fetch(apiUrl, {
method: 'GET',
headers: {
'x-api-key': apiKey
},
});
currentReq
.then(processResponse)
.then(processJson)
.catch((error) => {
return console.log(`Error Occurred retrieving data ${error}`);
})
.then(scheduleNewDataFetch);
};
var processResponse = function (response) {
if (!response.ok) {
INTERVAL = 60000;
throw new Error('Network response was not ok');
}
if (response.status === 204) {
INTERVAL = 60000;
return Promise.reject('No Game');
}
INTERVAL = 5000;
return response.json();
};
var processJson = function (data) {
self.gameState(data.state);
self.kickOffTime(new Date(data.startedAt));
self.homeTeamName(data.home.name);
self.awayTeamName(data.away.name);
self.homeTeamColor(data.home.color);
self.awayTeamColor(data.away.color);
self.eventList(data.eventHistory);
};
var scheduleNewDataFetch = function () {
if (timeout) {
clearTimeout(timeout);
}
timeout = setTimeout(fetchNewData, INTERVAL);
};
self.getEventMessage = function(evt) {
var eventDate = new Date(evt.eventDate);
var timeElapsed = eventDate - self.kickOffTime();
var diffMins = Math.round(((timeElapsed % 86400000) % 3600000) / 60000);
return `T${diffMins}: ${evt.eventType} Scored`
}
self.getScoreAtEvent = function(evtId){
var evts = self.eventList();
var homeScore = 0;
var awayScore = 0;
evts.forEach(evt => {
if(evt.id <= evtId){
if(evt.category ==='Home'){
homeScore += evt.points;
} else {
awayScore += evt.points;
}
}
});
return `${homeScore} - ${awayScore}`;
}
fetchNewData(); // Starts the update loop
};
ko.applyBindings(new viewModel());

View File

@ -0,0 +1,20 @@
<svg viewBox="0 0 35 40" version="1.1" width="32" length="auto">
<g id="shield" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<path
d="M24.9440298,0.636942674 C26.6113155,0.922262685 29.0926587,1.55920537 32.3880597,2.5477707 C34.1293532,7.30360933 35,12.6539278 35,18.5987261 C35,23.4394904 32.6492537,29.1719745 28.3395523,33.2484077 C25.6413422,35.8005735 22.0281581,38.0511042 17.5,40 C12.9718419,38.0511042 9.35865783,35.8005735 6.66044775,33.2484077 C2.35074626,29.1719745 0,23.4394904 0,18.5987261 C0,12.6539278 0.870646769,7.30360933 2.6119403,2.5477707 C5.90734124,1.55920537 8.38868452,0.922262685 10.0559702,0.636942674 C11.7232557,0.351622651 14.204599,0.139308434 17.5,0 C20.795401,0.139308434 23.2767442,0.351622651 24.9440298,0.636942674 Z"
id="Primary"
fill="#000000" />
<path
d="m 30.033126,6.9745223 c 1.293532,3.6857747 1.940298,7.8322717 1.940298,12.4394907 0,3.751592 -1.746269,8.194267 -4.947761,11.353503 C 25.021278,32.745444 22.337199,34.489606 18.973424,36 V 5 c 2.448012,0.107964 4.291296,0.2725076 5.529851,0.4936306 1.238555,0.221123 3.081838,0.7147536 5.529851,1.4808917 z"
id="Darkening"
fill="#000000"
opacity="0.24"
style="fill:#ffffff" />
<path
d="M 4.752799,6.9745223 C 3.459266,10.660297 2.8125,14.806794 2.8125,19.414013 c 0,3.751592 1.746269,8.194267 4.947761,11.353503 C 9.764646,32.745444 12.448725,34.489606 15.8125,36 V 5 C 13.364488,5.107964 11.521204,5.2725076 10.282649,5.4936306 9.044094,5.7147536 7.200811,6.2083842 4.752799,6.9745223 Z"
id="Darkening-3"
fill="#000000"
opacity="0.24"
style="fill:#ffffff" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,20 @@
<svg viewBox="0 0 35 40" version="1.1" width="32" length="auto">
<g id="shield" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<path
d="M24.9440298,0.636942674 C26.6113155,0.922262685 29.0926587,1.55920537 32.3880597,2.5477707 C34.1293532,7.30360933 35,12.6539278 35,18.5987261 C35,23.4394904 32.6492537,29.1719745 28.3395523,33.2484077 C25.6413422,35.8005735 22.0281581,38.0511042 17.5,40 C12.9718419,38.0511042 9.35865783,35.8005735 6.66044775,33.2484077 C2.35074626,29.1719745 0,23.4394904 0,18.5987261 C0,12.6539278 0.870646769,7.30360933 2.6119403,2.5477707 C5.90734124,1.55920537 8.38868452,0.922262685 10.0559702,0.636942674 C11.7232557,0.351622651 14.204599,0.139308434 17.5,0 C20.795401,0.139308434 23.2767442,0.351622651 24.9440298,0.636942674 Z"
id="Primary"
fill="#000000" />
<path
d="m 30.033126,6.9745223 c 1.293532,3.6857747 1.940298,7.8322717 1.940298,12.4394907 0,3.751592 -1.746269,8.194267 -4.947761,11.353503 C 25.021278,32.745444 22.337199,34.489606 18.973424,36 V 5 c 2.448012,0.107964 4.291296,0.2725076 5.529851,0.4936306 1.238555,0.221123 3.081838,0.7147536 5.529851,1.4808917 z"
id="Darkening"
fill="#000000"
opacity="0.24"
style="fill:#ffffff" />
<path
d="M 4.752799,6.9745223 C 3.459266,10.660297 2.8125,14.806794 2.8125,19.414013 c 0,3.751592 1.746269,8.194267 4.947761,11.353503 C 9.764646,32.745444 12.448725,34.489606 15.8125,36 V 5 C 13.364488,5.107964 11.521204,5.2725076 10.282649,5.4936306 9.044094,5.7147536 7.200811,6.2083842 4.752799,6.9745223 Z"
id="Darkening-3"
fill="#000000"
opacity="0.24"
style="fill:#ffffff" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,80 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
viewBox="0 0 35 40"
version="1.1"
width="32"
length="auto"
id="svg852"
sodipodi:docname="logo.svg"
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview854"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:snap-global="true"
inkscape:snap-bbox="true"
inkscape:snap-grids="false"
inkscape:zoom="10.1125"
inkscape:cx="3.8071693"
inkscape:cy="20.519159"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="0"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="shield" />
<defs
id="defs845">
<linearGradient
x1="14.901048"
y1="26.882449"
x2="37.416574"
y2="4.1454513"
id="linearGradient-1"
gradientTransform="matrix(0.93541435,0,0,1.069045,-11.951483,0.10815822)"
gradientUnits="userSpaceOnUse">
<stop
stop-color="#FFFFFF"
stop-opacity="0"
offset="0%"
id="stop840" />
<stop
stop-color="#FFFFFF"
stop-opacity="0.4"
offset="100%"
id="stop842" />
</linearGradient>
</defs>
<g
id="shield"
stroke="none"
stroke-width="1"
fill="none"
fill-rule="evenodd">
<path
d="M24.9440298,0.636942674 C26.6113155,0.922262685 29.0926587,1.55920537 32.3880597,2.5477707 C34.1293532,7.30360933 35,12.6539278 35,18.5987261 C35,23.4394904 32.6492537,29.1719745 28.3395523,33.2484077 C25.6413422,35.8005735 22.0281581,38.0511042 17.5,40 C12.9718419,38.0511042 9.35865783,35.8005735 6.66044775,33.2484077 C2.35074626,29.1719745 0,23.4394904 0,18.5987261 C0,12.6539278 0.870646769,7.30360933 2.6119403,2.5477707 C5.90734124,1.55920537 8.38868452,0.922262685 10.0559702,0.636942674 C11.7232557,0.351622651 14.204599,0.139308434 17.5,0 C20.795401,0.139308434 23.2767442,0.351622651 24.9440298,0.636942674 Z"
id="Primary"
fill="#000000" />
<path
d="m 30.033126,6.9745223 c 1.293532,3.6857747 1.940298,7.8322717 1.940298,12.4394907 0,3.751592 -1.746269,8.194267 -4.947761,11.353503 C 25.021278,32.745444 22.337199,34.489606 18.973424,36 V 5 c 2.448012,0.107964 4.291296,0.2725076 5.529851,0.4936306 1.238555,0.221123 3.081838,0.7147536 5.529851,1.4808917 z"
id="Darkening"
fill="#000000"
opacity="0.24"
style="fill:#ffffff" />
<path
d="M 4.752799,6.9745223 C 3.459266,10.660297 2.8125,14.806794 2.8125,19.414013 c 0,3.751592 1.746269,8.194267 4.947761,11.353503 C 9.764646,32.745444 12.448725,34.489606 15.8125,36 V 5 C 13.364488,5.107964 11.521204,5.2725076 10.282649,5.4936306 9.044094,5.7147536 7.200811,6.2083842 4.752799,6.9745223 Z"
id="Darkening-3"
fill="#000000"
opacity="0.24"
style="fill:#ffffff" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -0,0 +1,120 @@
.scoreboard {
display: flex;
flex-direction: column;
align-items: center;
width: 800px;
margin: 0 auto;
background-color: #e0e0e0;
color: #333;
padding: 10px;
border: 4px solid #800080;
border-radius: 20px;
}
.timer-container {
display: flex;
flex-direction: column;
align-items: center;
position: relative;
width: 120px;
height: 120px;
background-color: #fff;
border: 4px solid #800080;
border-radius: 50%;
margin: 10px;
}
.timer {
font-size: 38px;
color: #333;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.half-indicator {
font-size: 18px;
font-weight: bold;
color: #800080;
position: absolute;
bottom: 10px;
}
.border {
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
}
.team-details {
font-size: 48px;
color: white;
background-color: #000;
padding: 0px;
text-align: center;
max-height: 100px;
border-radius: 0px 0px 30px 30px;
}
.team {
flex: 1;
text-align: center;
display: flex;
flex-direction: column;
border-radius: 10px 10px 10px 10px;
}
.team-info {
display: flex;
align-items: center;
flex-direction: column;
}
.team-logo img {
max-width: 50px;
max-height: 50px;
border-radius: 50%;
background-color: #800080;
padding: 5px;
margin-top: 5px;
}
.team-name {
font-weight: bold;
font-size: 20px;
color: white;
margin-bottom: 5px;
display: flex;
align-items: center;
}
.team-score {
font-size: 48px;
color: white;
background-color: #000;
padding: 10px;
text-align: center;
max-height: 100px;
border-radius: 0 0 10px 10px;
}
.score-history {
font-size: 14px;
width: 100%;
text-align: center;
padding: 10px;
}
/* Uckfield RFC's background color */
#home-team {
background-color: #ff0000;
}
/* Away Team's background color */
#away-team {
background-color: #0000ff;
}

View File

@ -0,0 +1,39 @@
<!DOCTYPE html>
<head>
<link rel="stylesheet" href="scoreboard.css">
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.5.1/knockout-latest.js"></script>
</head>
<body>
<div class="scoreboard" data-bind="if: gameOn">
<div class="border">
<div class="team" data-bind="style:{'background-color': homeTeamColor}">
<div class="team-info">
<div class="team-logo">
<img data-bind="attr:{src: homeTeamLogo}" src="https://png.pngtree.com/png-clipart/20210129/ourmid/pngtree-blue-square-button-png-image_2844356.jpg" alt="Home Team Logo">
</div>
<div class="team-name" data-bind="text: homeTeamName">Home</div>
</div>
<div class="team-details">
<div class="team-score" data-bind="text: homeTeamPoints">0</div>
</div>
</div>
<div class="timer-container">
<div class="timer" id="match-timer" data-bind="text: timerValue"></div>
<div class="half-indicator" data-bind="text: halfIndicator"></div>
</div>
<div class="team" data-bind="style:{'background-color': awayTeamColor}">
<div class="team-info">
<div class="team-logo">
<img data-bind="attr:{src: homeTeamLogo}" src="https://png.pngtree.com/png-clipart/20210129/ourmid/pngtree-blue-square-button-png-image_2844356.jpg" alt="AWAY TEAM">
<div class="team-name" data-bind="text: awayTeamName">Away</div>
</div>
</div>
<div class="team-details">
<div class="team-score" data-bind="text: awayTeamPoints">0</div>
</div>
</div>
</div>
</div>
<script src="scoreboardViewModel.js" type="text/javascript"></script>
</body>

View File

@ -0,0 +1,283 @@
.scoreboard {
display: flex;
flex-direction: column;
align-items: center;
width: 800px;
margin: 0 auto;
background-color: #e0e0e0;
color: #333;
padding: 10px;
border: 4px solid #800080;
border-radius: 20px;
}
.timer-container {
display: flex;
flex-direction: column;
align-items: center;
position: relative;
width: 120px;
height: 120px;
background-color: #fff;
border: 4px solid #800080;
border-radius: 50%;
margin: 10px;
}
.timer {
font-size: 38px;
color: #333;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.half-indicator {
font-size: 18px;
font-weight: bold;
color: #800080;
position: absolute;
bottom: 10px;
}
.kickoff-indicator {
font-size: 25px;
font-weight: bold;
color: #800080;
margin-top:auto;
margin-bottom:auto;
}
.finalscore-indicator {
font-size: 25px;
font-weight: bold;
color: #800080;
margin-top:auto;
margin-bottom:auto;
}
.border {
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
}
.team-details {
font-size: 48px;
color: white;
background-color: #000;
padding: 0px;
text-align: center;
max-height: 100px;
border-radius: 0px 0px 30px 30px;
}
.team {
flex: 1;
text-align: center;
display: flex;
flex-direction: column;
border-radius: 10px 10px 10px 10px;
background-color: dimgrey;
}
.team-info {
display: flex;
align-items: center;
flex-direction: column;
}
.team-logo {
margin: 10px;
}
.team-logo svg {
max-width: 60px;
max-height: 60px;
background-color: #800080;
padding: 5px;
margin-right:auto;
margin-left:auto;
}
.team-name {
font-weight: bold;
font-size: 20px;
color: white;
margin-bottom: 5px;
display: flex;
align-items: center;
}
.team-score {
font-size: 48px;
color: white;
background-color: #000;
padding: 10px;
text-align: center;
max-height: 100px;
border-radius: 0 0 10px 10px;
}
.score-history {
font-size: 14px;
width: 100%;
text-align: center;
padding: 10px;
}
/* Uckfield RFC's background color */
#home-team {
background-color: #ff0000;
}
/* Away Team's background color */
#away-team {
background-color: #0000ff;
}
/*
eventList
*/
.timeline {
position: relative;
padding: 20px;
width: 50%;
margin-top: 10px;
margin-right: auto;
margin-left: auto;
}
.timeline-item {
display: flex;
align-items: flex-start;
margin-bottom: 40px;
position: relative;
}
.timeline-content {
background-color: #f9f9f9;
padding: 20px;
position: relative;
border-radius: 8px;
border: 1px solid black;
}
.timeline-content-match {
background-color: rgb(69, 69, 69);
color: white;
min-width: 100px;
padding-top: 5px;
padding-bottom: 5px;
padding-left: 30px;
padding-right: 30px;
position: relative;
margin-left: auto;
margin-right: auto;
border-radius: 8px;
border: 1px solid purple;
text-align: center;
}
.match:first-child {
margin-top: -20px;
}
.match:last-child {
margin-bottom: -20px;
}
.score-panel {
font-size: 20px;
color: white;
background-color: gray;
padding: 5px 10px 5px 10px;
position: absolute;
left: 50.1%;
border-radius: 8px;
top: 50%;
transform: translate(-50%, -50%);
z-index: 1;
}
.delete-btn {
position: absolute;
top: 10px;
right: 10px;
background-color: #f00;
/* background-color: #ff6347; */
color: white;
border: none;
padding: 5px 10px;
border-radius: 5px;
cursor: pointer;
}
.icon {
position: absolute;
left: 50.1%;
top: 50%;
transform: translate(-50%, -50%);
color: black;
/* Set the color of the icon */
z-index: 1;
/* Ensure the icon appears above the panel */
}
.yc {
color: yellow;
text-shadow: 0 0 5px #000;
}
.rc {
color: red;
text-shadow: 0 0 5px #000;
}
.away {
margin-left: auto;
}
.timeline:before {
content: '';
position: absolute;
top: 0;
bottom: 0;
left: 50%;
border-left: 2px solid black;
}
@media screen and (min-width: 1500px) {
.timeline-item {
flex-direction: row;
justify-content: space-between;
}
.timeline-content {
width: 40%;
}
}
@media screen and (max-width: 1499px) {
.timeline {
width: 80%;
}
.timeline-item {
flex-direction: row;
justify-content: space-between;
}
.timeline-content {
width: 40%;
}
}
.noMatch {
text-align: center;
}
.summary-team-label {
margin-top: 15px;
margin-bottom: 15px;
font-size: 25px;
}

View File

@ -0,0 +1,125 @@
<!DOCTYPE html>
<head>
<link rel="stylesheet" href="scoreboardDetails.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
integrity="sha512-DTOQO9RWCH3ppGqcWaEA1BIZOC6xxalwEsw9c2QQeAIftl+Vegovlnee1c9QX4TctnWMn13TZye+giMm8e2LwA=="
crossorigin="anonymous">
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.5.1/knockout-latest.min.js"
integrity="sha512-vs7+jbztHoMto5Yd/yinM4/y2DOkPLt0fATcN+j+G4ANY2z4faIzZIOMkpBmWdcxt+596FemCh9M18NUJTZwvw=="
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"
integrity="sha512-v2CJ7UaYy4JwqLDIrZUI/4hqeoQieOmAZNXBeQyjo21dadnwR+8ZaIJVT8EE2iyI61OV8e6M8PP2/4hpQINQ/g=="
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
</head>
<body>
<div class="noMatch" data-bind="ifnot: gameOn">
No matches are scheduled at the moment; please check back later!
</div>
<div data-bind="if: gameOn">
<div class="scoreboard">
<div class="border">
<div class="team">
<div class="team-info">
<div class="team-logo">
<svg viewBox="0 0 35 40" version="1.1" width="32" length="auto">
<g id="shield" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<path
d="M24.9440298,0.636942674 C26.6113155,0.922262685 29.0926587,1.55920537 32.3880597,2.5477707 C34.1293532,7.30360933 35,12.6539278 35,18.5987261 C35,23.4394904 32.6492537,29.1719745 28.3395523,33.2484077 C25.6413422,35.8005735 22.0281581,38.0511042 17.5,40 C12.9718419,38.0511042 9.35865783,35.8005735 6.66044775,33.2484077 C2.35074626,29.1719745 0,23.4394904 0,18.5987261 C0,12.6539278 0.870646769,7.30360933 2.6119403,2.5477707 C5.90734124,1.55920537 8.38868452,0.922262685 10.0559702,0.636942674 C11.7232557,0.351622651 14.204599,0.139308434 17.5,0 C20.795401,0.139308434 23.2767442,0.351622651 24.9440298,0.636942674 Z"
id="Background" fill="#000000" />
<path
d="m 30.033126,6.9745223 c 1.293532,3.6857747 1.940298,7.8322717 1.940298,12.4394907 0,3.751592 -1.746269,8.194267 -4.947761,11.353503 C 25.021278,32.745444 22.337199,34.489606 18.973424,36 V 5 c 2.448012,0.107964 4.291296,0.2725076 5.529851,0.4936306 1.238555,0.221123 3.081838,0.7147536 5.529851,1.4808917 z"
id="Darkening" fill="#000000" opacity="0.24" style="fill:#000000" />
<path
d="M 4.752799,6.9745223 C 3.459266,10.660297 2.8125,14.806794 2.8125,19.414013 c 0,3.751592 1.746269,8.194267 4.947761,11.353503 C 9.764646,32.745444 12.448725,34.489606 15.8125,36 V 5 C 13.364488,5.107964 11.521204,5.2725076 10.282649,5.4936306 9.044094,5.7147536 7.200811,6.2083842 4.752799,6.9745223 Z"
id="Darkening-3" fill="#000000" opacity="0.8"
data-bind="style: { fill: homeTeamColor}" />
</g>
</svg>
</div>
<div class="team-name" data-bind="text: homeTeamName">Home</div>
</div>
<div class="team-details">
<div class="team-score" data-bind="text: homeTeamPoints">0</div>
</div>
</div>
<div class="timer-container">
<!-- ko if: gameState() !== 'WaitingForStart' && gameState() !== 'Finished' && gameState() !== 'HalfTime'-->
<div class="timer" id="match-timer" data-bind="text: calculateRemainingTime"></div>
<div class="half-indicator" data-bind="text: halfIndicator"></div>
<!-- /ko -->
<!-- ko if: gameState() === 'WaitingForStart' -->
<div class="kickoff-indicator" data-bind="text: halfIndicator"></div>
<!-- /ko -->
<!-- ko if: gameState() === 'Finished' -->
<div class="finalscore-indicator">Full Time</div>
<!-- /ko -->
<!-- ko if: gameState() === 'HalfTime' -->
<div class="kickoff-indicator">Half Time</div>
<!-- /ko -->
</div>
<div class="team">
<div class="team-info">
<div class="team-logo">
<svg viewBox="0 0 35 40" version="1.1" width="32" length="auto">
<g id="shield" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<path
d="M24.9440298,0.636942674 C26.6113155,0.922262685 29.0926587,1.55920537 32.3880597,2.5477707 C34.1293532,7.30360933 35,12.6539278 35,18.5987261 C35,23.4394904 32.6492537,29.1719745 28.3395523,33.2484077 C25.6413422,35.8005735 22.0281581,38.0511042 17.5,40 C12.9718419,38.0511042 9.35865783,35.8005735 6.66044775,33.2484077 C2.35074626,29.1719745 0,23.4394904 0,18.5987261 C0,12.6539278 0.870646769,7.30360933 2.6119403,2.5477707 C5.90734124,1.55920537 8.38868452,0.922262685 10.0559702,0.636942674 C11.7232557,0.351622651 14.204599,0.139308434 17.5,0 C20.795401,0.139308434 23.2767442,0.351622651 24.9440298,0.636942674 Z"
id="Background" fill="#000000" />
<path
d="m 30.033126,6.9745223 c 1.293532,3.6857747 1.940298,7.8322717 1.940298,12.4394907 0,3.751592 -1.746269,8.194267 -4.947761,11.353503 C 25.021278,32.745444 22.337199,34.489606 18.973424,36 V 5 c 2.448012,0.107964 4.291296,0.2725076 5.529851,0.4936306 1.238555,0.221123 3.081838,0.7147536 5.529851,1.4808917 z"
id="Darkening" fill="#000000" opacity="0.24" style="fill:#000000" />
<path
d="M 4.752799,6.9745223 C 3.459266,10.660297 2.8125,14.806794 2.8125,19.414013 c 0,3.751592 1.746269,8.194267 4.947761,11.353503 C 9.764646,32.745444 12.448725,34.489606 15.8125,36 V 5 C 13.364488,5.107964 11.521204,5.2725076 10.282649,5.4936306 9.044094,5.7147536 7.200811,6.2083842 4.752799,6.9745223 Z"
id="Darkening-3" fill="#000000" opacity="0.8"
data-bind="style: { fill: awayTeamColor}" />
</g>
</svg>
<div class="team-name" data-bind="text: awayTeamName">Away</div>
</div>
</div>
<div class="team-details">
<div class="team-score" data-bind="text: awayTeamPoints">0</div>
</div>
</div>
</div>
</div>
<!-- ko if: eventList().length === 0 && gameState() !== 'WaitingForStart' -->
<div class="noMatch">No events available yet.</div>
<!-- /ko-->
<!-- ko if: eventList().length > 0 -->
<div class="timeline" data-bind="foreach: eventList">
<!-- ko if: category === 'Match' -->
<div class="timeline-item match">
<div class="timeline-content-match">
<p data-bind="text: $parent.getEventMessage($data)"></p>
</div>
</div>
<!-- /ko -->
<!-- ko ifnot: category === 'Match' -->
<div class="timeline-item">
<div class="timeline-content"
data-bind="css: { away: category ==='Away' }, style: { 'border-color': category === 'Home' ? $parent.homeTeamColor() : $parent.awayTeamColor() }">
<p data-bind="text: $parent.getEventMessage($data)"></p>
</div>
<!-- ko if: eventType !== 'YellowCard' && eventType !== 'RedCard' -->
<span class="score-panel" data-bind="text: $parent.getScoreAtEvent($data.id)"></span>
<!-- /ko -->
<!-- ko if: eventType === 'YellowCard' || eventType === 'RedCard' -->
<i class="fa fa-circle icon"
data-bind="css:{ yc: eventType ==='YellowCard', rc: eventType ==='RedCard' }"></i>
<!-- /ko -->
</div>
<!-- /ko-->
</div>
<!-- /ko -->
</div>
<script src="scoreboardDetails.js" type="text/javascript"></script>
</body>

View File

@ -0,0 +1,241 @@
function ScoreboardDetails() {
const apiKey = '396A62D6-0192-4738-8F45-8AAF7BCFA3EC'; // Replace with your actual API key
const apiUrl = 'https://localhost:7005/api/Score'; // Replace with your API endpoint URL
const matchDuration = 80 * 60 * 1000;
var self = this;
//API poll variables
var INTERVAL = 5000;
var timeout = null;
var currentReq = null;
//knockout variables
this.gameState = ko.observable("");
this.half = ko.observable("Pre");
this.kickOffTime = ko.observable(new Date());
this.gameOn = ko.observable(false);
this.eventList = ko.observableArray([]);
this.homeTeamName = ko.observable("Uckfield RFC");
this.homeTeamColor = ko.observable("#ff0000");
this.homeTeamPoints = ko.observable(0);
this.homeTeamLogo = ko.observable("");
this.awayTeamName = ko.observable("Away team");
this.awayTeamColor = ko.observable("#0000ff");
this.awayTeamPoints = ko.observable(0);
this.awayTeamLogo = ko.observable("");
self.calculateRemainingTime = ko.computed(function () {
if (self.half() === 'Pre') { return "---"; }
if (self.gameState() === 'HalfTime') { return '40:00'; }
if (self.gameState() === 'Finished') { return '80:00'; }
return calc();
});
var isSecondHalfEvent=function(matchEvts){
return !!matchEvts.find(e=>e.eventType === 'SecondHalfStart');
};
var calc = function (eventId = 0, minsOnly=false) {
var matchEvts = self.eventList().filter(x => (x.category === 'Match' && x.id <= eventId) || x.id === eventId);
var initialTime = self.kickOffTime(); //IF FIRST HALF, WORK OUT FOR IF SECOND HALF
var halfStart = self.kickOffTime();
var offsetMins = 0;
if ((eventId != 0 &&isSecondHalfEvent(matchEvts))
|| (eventId == 0 && self.half() === 'Second')) {
var secondHalfEvent = self.eventList().find(x => x.eventType === 'SecondHalfStart');
if (!secondHalfEvent) {
throw 'Invalid System Event State, Second Half without Second Half Event';
}
halfStart = new Date(secondHalfEvent.timeStamp);
initialTime = new Date(secondHalfEvent.timeStamp);
offsetMins = 40;
matchEvts = self.eventList().filter(x=>x.id >= secondHalfEvent.id && (x.category === 'Match' || x.id === eventId))
}
if (!matchEvts || matchEvts.length <= 1) {
const diff = calcDiff(initialTime, new Date());
return `${String(diff.mins + offsetMins).padStart(2, "0")}:${String(diff.secs).padStart(2, "0")}`
}
var totalMins = offsetMins;
var totalSecs = 0;
matchEvts.forEach((evt, idx, src) => {
if (eventId === 0 || evt.id <= eventId) {
if (evt.eventType === 'TimeOff') {
var t = calcDiff(initialTime, new Date(evt.timeStamp));
totalMins += t.mins;
totalSecs += t.secs;
}
if (evt.eventType === 'TimeOn') {
initialTime = new Date(evt.timeStamp);
if(idx === (src.length-1)){
var t = calcDiff(new Date(evt.timeStamp), new Date());
totalMins += t.mins;
totalSecs += t.secs;
}
}
if (eventId != 0 && eventId === evt.id) {
var t = calcDiff(initialTime, new Date(evt.timeStamp));
totalMins += t.mins;
totalSecs += t.secs;
}
}
});
if (totalSecs >= 60) {
totalMins += 1;
totalSecs = totalSecs % 60;
}
if(minsOnly){
return `${String(totalMins).padStart(2, "0")}`;
}
return `${String(totalMins).padStart(2, "0")}:${String(totalSecs).padStart(2, "0")}`;
}
self.halfIndicator = ko.computed(function () {
const gameState = self.gameState();
if (gameState === "WaitingForStart") {
var dt = self.kickOffTime();
return `${String(dt.getHours()).padStart(2, "0")}:${String(dt.getMinutes()).padStart(2, "0")} KO`;
}
if (gameState === "FirstHalf") {
return "1st Half";
}
if (gameState === "SecondHalf") {
return "2nd Half";
}
if (gameState === "TimeOff") {
return "Time Off";
}
});
var fetchNewData = function () {
currentReq = fetch(apiUrl, {
method: 'GET',
headers: {
'x-api-key': apiKey
},
});
currentReq
.then(processResponse)
.then(processJson)
.catch((error) => console.log(`Error Occurred retrieving data ${error}`))
.then(scheduleNewDataFetch);
};
var processResponse = function (response) {
if (!response.ok) {
throw new Error('Network response was not ok');
}
if (response.status === 204) {
self.gameOn(false);
INTERVAL = 60000;
return Promise.reject('no game');
}
INTERVAL = 5000;
return response.json();
};
var processJson = function (data) {
self.eventList(data.eventHistory);
self.gameOn(true);
self.gameState(data.state);
self.half(data.half);
self.kickOffTime(new Date(data.startedAt));
self.homeTeamName(data.home.name);
self.awayTeamName(data.away.name);
self.homeTeamPoints(data.home.points);
self.awayTeamPoints(data.away.points);
};
var scheduleNewDataFetch = function () {
if (timeout) {
clearTimeout(timeout);
}
timeout = setTimeout(fetchNewData, INTERVAL);
};
self.getEventMessage = function (evt) {
var eventMins = self.getEventTime(evt);
var eventMsg = parseEventType(evt.eventType);
if (evt.category !== "Match") {
if (evt.eventType === "YellowCard" || evt.eventType === "RedCard") {
return `${eventMins} mins: ${eventMsg}`;
}
return `${eventMins} mins: ${eventMsg} Scored`;
}
return `${eventMsg}`;
}
self.getScoreAtEvent = function (evtId) {
var evts = self.eventList();
var homeScore = 0;
var awayScore = 0;
evts.forEach(evt => {
if (evt.id <= evtId) {
if (evt.category === 'Home') {
homeScore += evt.points;
} else {
awayScore += evt.points;
}
}
});
return `${homeScore} - ${awayScore}`;
}
self.getEventTime = function (evt) {
if (evt.category === 'Match') { return; }
let t = calc(evt.id, true);
return t;
var eventDate = new Date(evt.timeStamp);
var diffMs = eventDate - self.kickOffTime();
var timeMins = Math.round(((diffMs % 86400000) % 3600000) / 60000);
return timeMins;
}
var parseEventType = function(evtType){
switch (evtType) {
case 'DropGoal':
return 'Drop Goal';
case 'HalfTime':
return 'Half Time';
case 'MatchStart':
return 'Match Start';
case 'SecondHalfStart':
return 'Second Half Start';
case 'TimeOff':
return 'Time Off';
case 'TimeOn':
return 'Time On';
case 'YellowCard':
return 'Yellow Card';
case 'RedCard':
return 'Red Card';
case 'MatchEnd':
return 'Full Time';
default:
return evtType;
}
}
var calcDiff = function (startTimeStamp, endTimeStamp) {
var diff = endTimeStamp - startTimeStamp;
const minutes = Math.floor(diff / 60000);
const seconds = Math.floor((diff % 60000) / 1000);
return { mins: minutes, secs: seconds }
}
fetchNewData(); // Starts the update loop
}
ko.applyBindings(new ScoreboardDetails());

View File

@ -0,0 +1,118 @@
function MatchEvent(event){
var self = this;
self.id = ko.observable(event.id);
self.eventType = ko.observable(event.EventType);
self.eventTimeStamp = ko.observable(event.TimeStamp);
self.eventPoint = ko.observable(event.Points);
}
function Team (team){
var self = this;
self.name = ko.observable(team.name);
self.points = ko.observable(team.points);
self.eventHistory = ko.observableArray(team.EventHistory.map((evt) => new MatchEvent(evt)));
}
function ScoreboardViewModel() {
const apiKey = '396A62D6-0192-4738-8F45-8AAF7BCFA3EC'; // Replace with your actual API key
const apiUrl = 'https://localhost:7005/api/Score'; // Replace with your API endpoint URL
const matchDuration = 80 * 60 * 1000;
var self = this;
//API poll variables
var INTERVAL = 5000;
var timeout = null;
var currentReq = null;
//knockout variables
this.gameState = ko.observable("");
this.kickOffTime = ko.observable(new Date());
this.gameOn = ko.observable(false);
this.homeTeamName = ko.observable("Uckfield RFC");
this.homeTeamColor = ko.observable("#ff0000");
this.homeTeamPoints = ko.observable(0);
this.homeTeamLogo = ko.observable("");
this.homeTeamEvents = ko.observable([]);
this.awayTeamName = ko.observable("Away team");
this.awayTeamColor = ko.observable("#0000ff");
this.awayTeamPoints = ko.observable(0);
this.awayTeamLogo = ko.observable("");
this.awayEvents = ko.observableArray([]);
self.timerValue = ko.computed( function() {
const currentTime = new Date();
const elapsedTime = currentTime - self.kickOffTime();
const remainingTime = Math.max(0, matchDuration - elapsedTime);
const minutes = Math.floor(remainingTime / 60000);
const seconds = Math.floor((remainingTime % 60000) / 1000);
return `${String(minutes).padStart(2, "0")}:${String(seconds).padStart(2, "0")}`;
});
self.halfIndicator = ko.computed(function(){
const gameState = self.gameState();
if(gameState ==="WaitingForStart"){
var dt = self.kickOffTime();
return `KO @${String(dt.getHours()).padStart(2,"0")}:${String(dt.getMinutes()).padStart(2,"0")}`;
}
if(gameState === "FirstHalf"){
return "1st Half";
}
if(gameState === "SecondHalf"){
return "2nd Half";
}
});
var fetchNewData = function() {
currentReq = fetch(apiUrl, {
method: 'GET',
headers: {
'x-api-key': apiKey
},
});
currentReq
.then(processResponse)
.then(processJson)
.catch((error)=>console.log(`Error Occurred retrieving data ${error}`))
.then(scheduleNewDataFetch);
};
var processResponse = function(response) {
if (!response.ok) {
throw new Error('Network response was not ok');
}
if(response.status === 204){
self.gameOn(false);
INTERVAL = 60000;
return Promise.reject('no game');
}
INTERVAL = 5000;
return response.json();
};
var processJson = function(data) {
self.gameOn(true);
self.gameState(data.state);
self.kickOffTime(new Date(data.startedAt));
self.homeTeamName(data.home.name);
self.awayTeamName(data.away.name);
self.homeTeamPoints(data.home.points);
self.awayTeamPoints(data.away.points);
};
var scheduleNewDataFetch = function() {
if (timeout) {
clearTimeout(timeout);
}
timeout = setTimeout(fetchNewData, INTERVAL);
};
fetchNewData(); // Starts the update loop
}
ko.applyBindings(new ScoreboardViewModel());

25
Scoreboard.sln Normal file
View File

@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.6.33723.286
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ScoreboardApi", "ScoreboardApi\ScoreboardApi.csproj", "{9F80E54A-D08F-4FC5-A56D-ADE8EA381CAF}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{9F80E54A-D08F-4FC5-A56D-ADE8EA381CAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9F80E54A-D08F-4FC5-A56D-ADE8EA381CAF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9F80E54A-D08F-4FC5-A56D-ADE8EA381CAF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9F80E54A-D08F-4FC5-A56D-ADE8EA381CAF}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {DE24DFDF-6F5A-4851-A186-66A1D1C52A87}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,12 @@
{
"version": 1,
"isRoot": true,
"tools": {
"dotnet-ef": {
"version": "7.0.11",
"commands": [
"dotnet-ef"
]
}
}
}

View File

@ -0,0 +1,84 @@
using System.Globalization;
namespace ScoreboardApi
{
using Microsoft.Extensions.Primitives;
using ScoreboardApi.Settings;
//extend to make API keys have "permissions" - readonly/readwrite
public class ApiKeyAuthMiddleware
{
private const string ApiKeyHeader = "x-api-key";
private readonly RequestDelegate _next;
private readonly ApplicationSettings settings;
public ApiKeyAuthMiddleware(RequestDelegate next, ApplicationSettings settings)
{
_next = next;
this.settings = settings;
}
public async Task InvokeAsync(HttpContext context)
{
//do auth
if (!IsAuthenticated(context))
{
context.Response.Clear();
context.Response.StatusCode = 401;
context.Response.ContentType = "text/plain";
await context.Response.WriteAsync("Unauthorized");
return;
}
// Call the next delegate/middleware in the pipeline.
await _next(context);
}
private bool IsAuthenticated(HttpContext context)
{
if (context.Request.Headers.TryGetValue(ApiKeyHeader, out StringValues values))
{
if (values.Count > 1)
{
return false;
}
string? apiKeyValue = values.First();
bool parseResult = Guid.TryParse(apiKeyValue, out Guid apiKey);
if(!parseResult)
{
return false;
}
var keyEntry = settings.AllowedApiKeys.FirstOrDefault(x => x.ApiKey == apiKey);
if(keyEntry == null
|| keyEntry.Permission == Permissions.Disallowed)
{
return false;
}
if (!RequestIsReading(context.Request)
&& keyEntry.Permission == Permissions.ReadOnly)
{
return false;
}
return true;
}
return false;
}
private bool RequestIsReading(HttpRequest request)
{
return request.Method == "GET";
}
}
public static class ApiKeyAuthMiddlewareExtensions
{
public static IApplicationBuilder UseApiKeyAuthentication(
this IApplicationBuilder builder) =>
builder.UseMiddleware<ApiKeyAuthMiddleware>();
}
}

View File

@ -0,0 +1,91 @@
using Microsoft.AspNetCore.Mvc;
using ScoreboardApi.Objects;
using System.Net;
namespace ScoreboardApi.Controllers
{
//[Route("competition")]
//[ApiController]
public class CompetitionController
{
[HttpPost]
public IActionResult Create(Competition comp, bool generateFixtures = true) =>
new StatusCodeResult((int)HttpStatusCode.NotImplemented);
}
public class Competition
{
public Format format { get; set; }
public List<Team> Teams { get; set; }
public List<Fixture> Fixtures { get; set; }
public int MatchDurationMinutes { get; set; }
}
public class Fixture
{
public Team Home { get; set; }
public Team Away { get; set; }
public int Round { get; set; }
public DateTimeOffset KickOffTime { get; set; }
}
public enum Format
{
RoundRobin = 1,
Elimination = 2
}
}
/*
/ko
/toff
/ton
/halftime
/secondhalf
/end
//get all match events from start point (second half/firsthalf)
//iterate
// if no event, use .now
// else calculate diff from initial to event time.
// iterate next
self.calculateRemainingTime = ko.computed(function(){
if(halftime){return '40:00';}
if(matchend){return '80:00';}
var matchEvts = eventList.Filter(x=>x.category === 'Match');
var initialTime = self.kickOffTime(); //IF FIRST HALF, WORK OUT FOR IF SECOND HALF
if(!matchEvts){
return calcDiff(initialTime, new Date());
}
var totalMins = 0;
var totalSecs = 0;
matchEvts.forEach((evt)=>{
if(evt.eventType === 'timeOff'){
var t = calcDiff(initialTime, timeoff.timestamp);
totalMins += t.minutes;
totalSecs += t.seconds;
}
if(evt.eventType === 'timeOn'){
initialTime = timeon.timestamp;
}
});
return `${String(totalMins).padStart(2, "0")}:${String(totalSecs).padStart(2, "0")}`;
});
var calcDiff = function (startTimeStamp, endTimeStamp){
var diff = endTimeStamp - startTimeStamp;
const minutes = Math.floor(remainingTime / 60000);
const seconds = Math.floor((remainingTime % 60000) / 1000);
return new {mins: minutes, secs:seconds}
}
*/

View File

@ -0,0 +1,134 @@
using Microsoft.AspNetCore.Mvc;
namespace ScoreboardApi.Controllers
{
using ScoreboardApi.Extensions;
using ScoreboardApi.Objects;
[Route("api/[controller]")]
[ApiController]
public class ScoreController : ControllerBase
{
private readonly IGameManager gameManager;
public ScoreController(IGameManager gameManager)
{
this.gameManager = gameManager;
}
/// <summary>
/// Get the current match score
/// </summary>
/// <returns></returns>
[HttpGet]
public ActionResult GetCurrentScore() =>
Ok(gameManager.GetScore());
/// <summary>
/// Abbreviated match summary for displays
/// </summary>
/// <returns>Simple Match summary indicating the match state, and the points for each team</returns>
[HttpGet]
[Route("summary")]
public ActionResult GetScoreSummary()
{
var game = gameManager.GetScore();
return Ok(
new
{
Home = game.Home.Points,
Away = game.Away.Points,
State = game.State
});
}
/// <summary>
/// Start a New Game
/// </summary>
/// <param name="request">
/// Details about the game to start
/// </param>
[HttpPost]
public ActionResult StartNewGame([FromBody] StartGameRequest request)
{
if (request.Home == null || request.Away == null)
{
return BadRequest();
}
if (request.KickOffTime == default)
{
request.KickOffTime = DateTimeOffset.Now;
}
gameManager.StartNew(request.Home, request.Away, request.KickOffTime);
return Ok();
}
/// <summary>
/// Add new event to the given team.
/// </summary>
/// <param name="newEvent">The new event to add. Event Category indicates who the event belongs to.</param>
[HttpPatch]
[Route("event")]
public ActionResult AddEvent([FromBody] Event newEvent)
{
if (!Enum.IsDefined(newEvent.EventType))
{
return BadRequest($"{nameof(EventType)} supplied is invalid.");
}
if(gameManager.GetScore().State == GameState.TimeOff && !newEvent.EventType.IsMatchEvent())
{
return BadRequest($"{newEvent.EventType} is not valid when Time is Off");
}
if (newEvent.EventType.IsMatchEvent())
{
newEvent.Category = EventCategory.Match;
}
else if (!Enum.IsDefined(newEvent.Category))
{
return BadRequest($"{nameof(EventCategory)} supplied is invalid.");
}
if (newEvent.TimeStamp == default)
{
newEvent.TimeStamp = DateTimeOffset.Now;
}
gameManager.AddEvent(newEvent);
return Ok();
}
/// <summary>
/// End the current game
/// </summary>
[HttpPatch]
[Route("endGame")]
public void EndGame()
{
gameManager.Finish();
}
/// <summary>
/// Reset the system, remove all current data.
/// </summary>
[HttpDelete]
public void ResetGame()
{
gameManager.ResetGame();
}
/// <summary>
/// Remove the given event from the collection
/// </summary>
/// <param name="eventId"></param>
[HttpDelete]
[Route("event/{eventId}")]
public void DeleteEvent(int eventId)
{
gameManager.DeleteEvent(eventId);
}
}
}

View File

@ -0,0 +1,12 @@
namespace ScoreboardApi.Controllers
{
using ScoreboardApi.Objects;
public class StartGameRequest
{
public Team Home { get; set; }
public Team Away { get; set; }
public DateTimeOffset KickOffTime { get; set; }
}
//Add Export.
}

22
ScoreboardApi/Dockerfile Normal file
View File

@ -0,0 +1,22 @@
#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["WebApplication1/WebApplication1.csproj", "WebApplication1/"]
RUN dotnet restore "WebApplication1/WebApplication1.csproj"
COPY . .
WORKDIR "/src/WebApplication1"
RUN dotnet build "WebApplication1.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "WebApplication1.csproj" -c Release -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApplication1.dll"]

View File

@ -0,0 +1,23 @@
namespace ScoreboardApi.Extensions
{
using System.Diagnostics.CodeAnalysis;
using Newtonsoft.Json;
using ScoreboardApi.Settings;
[ExcludeFromCodeCoverage]
public static class AppSettingsExtensions
{
public static void Verify<TApplicationSettings>(this ApplicationSettings appSettings)
where TApplicationSettings : ApplicationSettings
{
try
{
JsonConvert.DeserializeObject<TApplicationSettings>(JsonConvert.SerializeObject((object)appSettings));
}
catch (Exception ex)
{
throw new Exception(string.Format("There is a problem with the structure of the appsettings.json. Require sections or items may be missing or named incorrectly. Details: {0}", (object)ex.Message));
}
}
}
}

View File

@ -0,0 +1,18 @@
using ScoreboardApi.Objects;
namespace ScoreboardApi.Extensions
{
public static class EventTypeExtensions
{
public static bool IsMatchEvent(this EventType eventType)
{
return eventType is
EventType.MatchStart
or EventType.HalfTime
or EventType.SecondHalfStart
or EventType.TimeOff
or EventType.TimeOn
or EventType.MatchEnd;
}
}
}

View File

@ -0,0 +1,162 @@
namespace ScoreboardApi.Functions
{
using ScoreboardApi.Objects;
public class GameManager : IGameManager
{
private readonly IPointsCalculator pointsCalculator;
private Game? _game;
public GameManager(IPointsCalculator pointsCalculator)
{
this.pointsCalculator = pointsCalculator;
}
public void StartNew(Team home, Team away, DateTimeOffset kickOffTime)
{
if (_game != null)
{
throw new InvalidOperationException("Game is already configured");
}
_game = new Game
{
Half = HalfType.Pre,
Home = home,
Away = away,
StartedAt = kickOffTime,
State = GameState.WaitingForStart
};
}
public void Finish()
{
if (_game == null)
{
return;
}
_game.FinishedAt = DateTimeOffset.UtcNow;
_game.State = GameState.Finished;
_game.Half = HalfType.End;
var evt = new Event
{
Category = EventCategory.Match,
EventType = EventType.MatchEnd,
TimeStamp = DateTimeOffset.Now
};
AddEvent(evt);
}
public void AddEvent(Event newEvent)
{
if (_game == null)
{
return;
}
newEvent.Id = GetEventId();
newEvent.Points = pointsCalculator.GetEventScore(newEvent.EventType);
if (newEvent.Category == EventCategory.Match)
{
_game.MatchEvents.Add(newEvent);
}
else if (newEvent.Category == EventCategory.Home)
{
_game.Home.EventHistory.Add(newEvent);
}
else
{
_game.Away.EventHistory.Add(newEvent);
}
switch (newEvent.EventType)
{
case EventType.HalfTime:
_game.State = GameState.HalfTime;
_game.Half = HalfType.First;
return;
case EventType.SecondHalfStart:
_game.State = GameState.SecondHalf;
_game.Half = HalfType.Second;
return;
case EventType.TimeOff:
_game.State = GameState.TimeOff;
return;
case EventType.TimeOn:
if (_game.Half == HalfType.First)
{
_game.State = GameState.FirstHalf;
}
else if (_game.Half == HalfType.Second)
{
_game.State = GameState.SecondHalf;
}
break;
case EventType.MatchEnd:
_game.State = GameState.Finished;
_game.Half = HalfType.End;
break;
}
}
public void DeleteEvent(int eventId)
{
if (_game == null)
{
return;
}
_game.Teams.ForEach(
(t) =>
{
Event? eventToRemove = t.EventHistory.FirstOrDefault(x => x.Id == eventId);
if (eventToRemove != null)
{
t.EventHistory.Remove(eventToRemove);
}
});
}
public void ResetGame() => _game = null;
public Game GetScore()
{
if (_game == null)
{
return null;
}
if (_game.State == GameState.WaitingForStart
&& DateTimeOffset.UtcNow.UtcDateTime.CompareTo(_game.StartedAt.UtcDateTime) >= 0)
{
var evt = new Event
{
Category = EventCategory.Match,
EventType = EventType.MatchStart,
TimeStamp = DateTimeOffset.Now
};
AddEvent(evt);
_game.Half = HalfType.First;
_game.State = GameState.FirstHalf;
}
return _game;
}
private int GetEventId()
{
IEnumerable<Event> events = _game.EventHistory;
if (!events.Any())
{
return 1;
}
return events.Max(x => x.Id) + 1;
}
}
}

View File

@ -0,0 +1,19 @@
namespace ScoreboardApi
{
using ScoreboardApi.Objects;
public interface IGameManager
{
void StartNew(Team home, Team away, DateTimeOffset kickOffTime);
void Finish();
void AddEvent(Event newEvent);
void ResetGame();
void DeleteEvent(int eventId);
Game GetScore();
}
}

View File

@ -0,0 +1,11 @@
namespace ScoreboardApi
{
using ScoreboardApi.Objects;
public interface IPointsCalculator
{
int GetEventScore(EventType eventType);
int CalculateNewScore(EventType eventType, int currentScore);
}
}

View File

@ -0,0 +1,41 @@
namespace ScoreboardApi
{
using ScoreboardApi.Objects;
public class PointsCalculator : IPointsCalculator
{
public int GetEventScore(EventType eventType)
{
switch (eventType)
{
case EventType.Penalty:
return 3;
case EventType.Try:
return 5;
case EventType.Conversion:
return 2;
case EventType.DropGoal:
return 3;
default:
return 0;
}
}
public int CalculateNewScore(EventType eventType, int currentScore)
{
switch (eventType)
{
case EventType.Penalty:
return currentScore + GetEventScore(eventType);
case EventType.Try:
return currentScore + GetEventScore(eventType);
case EventType.Conversion:
return currentScore + GetEventScore(eventType);
case EventType.DropGoal:
return currentScore + GetEventScore(eventType);
default:
return currentScore;
}
}
}
}

View File

@ -0,0 +1,11 @@
namespace ScoreboardApi.Objects
{
public class Event
{
public int Id { get; set; }
public EventCategory Category { get; set; }
public EventType EventType { get; set; }
public DateTimeOffset TimeStamp { get; set; }
public int Points { get; set; }
}
}

View File

@ -0,0 +1,9 @@
namespace ScoreboardApi.Objects
{
public enum EventCategory
{
Match = 1,
Home = 2,
Away = 3
}
}

View File

@ -0,0 +1,18 @@
namespace ScoreboardApi.Objects
{
public enum EventType
{
Penalty = 1,
Try = 2,
Conversion = 3,
DropGoal = 4,
HalfTime = 5,
MatchStart = 6,
SecondHalfStart = 7,
TimeOff = 8,
TimeOn = 9,
YellowCard = 10,
RedCard = 11,
MatchEnd = 12
}
}

View File

@ -0,0 +1,32 @@
namespace ScoreboardApi.Objects
{
using System.Text.Json.Serialization;
public class Game
{
public GameState State { get; set; }
public DateTimeOffset StartedAt { get; set; }
public DateTimeOffset? FinishedAt { get; set; }
public Team Home { get; set; } = new Team();
public Team Away { get; set; } = new Team();
public HalfType Half { get; set; }
[JsonIgnore]
public List<Event> MatchEvents { get; set; } = new List<Event>();
public IEnumerable<Event> EventHistory
{
get
{
var events = Home.EventHistory
.Concat(Away.EventHistory)
.Concat(MatchEvents)
.OrderBy(x=>x.Id);
return events.ToList();
}
}
[JsonIgnore]
public List<Team> Teams => new() { Home, Away };
}
}

View File

@ -0,0 +1,20 @@
namespace ScoreboardApi.Objects
{
public enum GameState
{
WaitingForStart = 1,
FirstHalf = 2,
HalfTime = 3,
SecondHalf = 4,
Finished = 5,
TimeOff = 6
}
public enum HalfType
{
Pre = 1,
First = 2,
Second = 3,
End = 4
}
}

View File

@ -0,0 +1,15 @@
using System.Text.Json.Serialization;
namespace ScoreboardApi.Objects
{
public class Team
{
public string Abbreviation { get; set; }
public string Name { get; set; }
public int Points => EventHistory.Sum(x => x.Points);
public string Color { get; set; }
[JsonIgnore]
public List<Event> EventHistory { get; set; } = new();
}
}

View File

@ -0,0 +1,8 @@
namespace ScoreboardApi.Objects
{
public enum TeamType
{
Home = 1,
Away = 2
}
}

90
ScoreboardApi/Program.cs Normal file
View File

@ -0,0 +1,90 @@
namespace WebApplication1
{
using System.Net;
using ScoreboardApi;
using ScoreboardApi.Extensions;
using ScoreboardApi.Functions;
using ScoreboardApi.Settings;
using System.Reflection;
using System.Text.Json.Serialization;
using Microsoft.AspNetCore.HttpOverrides;
public class Program
{
public static void Main(string[] args)
{
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
builder.Services.Configure<ForwardedHeadersOptions>(options => { options.ForwardedHeaders = ForwardedHeaders.All; });
// Add services to the container.
ApplicationSettings appSettings = DeserializeApplicationSettings();
builder.Services.AddSingleton(appSettings);
builder.Services.AddControllers().AddJsonOptions(
x =>
{
var enumConverter = new JsonStringEnumConverter();
x.JsonSerializerOptions.Converters.Add(enumConverter);
});
builder.Services.AddCors(
options =>
{
options.AddPolicy(
name: "allowedOrigins",
policy =>
{
policy
.AllowAnyOrigin()
.WithHeaders("x-api-key")
.WithHeaders("content-type")
.AllowAnyMethod();
});
});
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
string xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
builder.Services.AddSwaggerGen(
x =>
x.IncludeXmlComments(xmlPath));
builder.Services.AddSingleton<IPointsCalculator, PointsCalculator>();
builder.Services.AddSingleton<IGameManager, GameManager>();
WebApplication app = builder.Build();
app.UseForwardedHeaders();
app.UseCors("allowedOrigins");
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
//app.UseHttpsRedirection();
app.UseApiKeyAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();
}
private static ApplicationSettings DeserializeApplicationSettings()
{
var applicationSettings = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build()
.Get<ApplicationSettings>();
applicationSettings.Verify<ApplicationSettings>();
return applicationSettings;
}
}
}

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project>
<PropertyGroup>
<DeleteExistingFiles>true</DeleteExistingFiles>
<ExcludeApp_Data>false</ExcludeApp_Data>
<LaunchSiteAfterPublish>true</LaunchSiteAfterPublish>
<LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
<LastUsedPlatform>Any CPU</LastUsedPlatform>
<PublishProvider>FileSystem</PublishProvider>
<PublishUrl>bin\Release\net6.0\publish\</PublishUrl>
<WebPublishMethod>FileSystem</WebPublishMethod>
<_TargetId>Folder</_TargetId>
<SiteUrlToLaunchAfterPublish />
<TargetFramework>net6.0</TargetFramework>
<RuntimeIdentifier>linux-x64</RuntimeIdentifier>
<ProjectGuid>9f80e54a-d08f-4fc5-a56d-ade8ea381caf</ProjectGuid>
<SelfContained>true</SelfContained>
<PublishSingleFile>true</PublishSingleFile>
<PublishTrimmed>true</PublishTrimmed>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project>
<PropertyGroup>
<_PublishTargetUrl>C:\Users\cwatts\Qsync\Projects\Scoreboard\ScoreboardApi\bin\Release\net6.0\publish\</_PublishTargetUrl>
<History>True|2024-09-17T14:54:42.8657277Z;True|2024-09-12T16:55:16.7207289+01:00;False|2024-09-12T16:52:17.9833448+01:00;False|2024-09-12T16:50:59.2175994+01:00;True|2024-09-12T16:21:24.2272226+01:00;True|2023-09-28T10:15:23.8289186+01:00;</History>
<LastFailureDetails />
</PropertyGroup>
</Project>

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project>
<PropertyGroup>
<DeleteExistingFiles>true</DeleteExistingFiles>
<ExcludeApp_Data>false</ExcludeApp_Data>
<LaunchSiteAfterPublish>true</LaunchSiteAfterPublish>
<LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
<LastUsedPlatform>Any CPU</LastUsedPlatform>
<PublishProvider>FileSystem</PublishProvider>
<PublishUrl>bin\Release\net6.0\publish\linux</PublishUrl>
<WebPublishMethod>FileSystem</WebPublishMethod>
<_TargetId>Folder</_TargetId>
<SiteUrlToLaunchAfterPublish />
<TargetFramework>net6.0</TargetFramework>
<RuntimeIdentifier>linux-x64</RuntimeIdentifier>
<PublishSingleFile>true</PublishSingleFile>
<PublishTrimmed>false</PublishTrimmed>
<ProjectGuid>9f80e54a-d08f-4fc5-a56d-ade8ea381caf</ProjectGuid>
<SelfContained>true</SelfContained>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project>
<PropertyGroup>
<History>True|2024-07-22T22:14:34.7802209Z;True|2024-07-22T23:13:33.3458942+01:00;True|2024-07-22T23:09:24.3505807+01:00;False|2024-07-22T23:08:42.5287252+01:00;True|2024-07-22T23:01:46.2622372+01:00;True|2024-07-22T22:48:27.0047495+01:00;True|2024-07-22T22:46:58.6464286+01:00;False|2024-07-22T22:23:07.5888542+01:00;</History>
<LastFailureDetails />
<_PublishTargetUrl>C:\Users\chris\Qsync\Projects\Scoreboard\ScoreboardApi\bin\Release\net6.0\publish\linux</_PublishTargetUrl>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project>
<PropertyGroup>
<DeleteExistingFiles>true</DeleteExistingFiles>
<ExcludeApp_Data>false</ExcludeApp_Data>
<LaunchSiteAfterPublish>true</LaunchSiteAfterPublish>
<LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
<LastUsedPlatform>Any CPU</LastUsedPlatform>
<PublishProvider>FileSystem</PublishProvider>
<PublishUrl>bin\Release\net6.0\publish\winx86</PublishUrl>
<WebPublishMethod>FileSystem</WebPublishMethod>
<_TargetId>Folder</_TargetId>
<SiteUrlToLaunchAfterPublish />
<TargetFramework>net6.0</TargetFramework>
<RuntimeIdentifier>win-x86</RuntimeIdentifier>
<ProjectGuid>9f80e54a-d08f-4fc5-a56d-ade8ea381caf</ProjectGuid>
<SelfContained>true</SelfContained>
<PublishSingleFile>true</PublishSingleFile>
<PublishTrimmed>true</PublishTrimmed>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project>
<PropertyGroup>
<_PublishTargetUrl>C:\Users\chris\Qsync\Projects\Scoreboard\ScoreboardApi\bin\Release\net6.0\publish\winx86</_PublishTargetUrl>
<History>True|2024-07-22T21:49:49.5152966Z;True|2024-07-22T22:46:24.3105978+01:00;False|2024-07-22T22:21:37.9039763+01:00;True|2023-09-28T10:15:23.8289186+01:00;</History>
<LastFailureDetails />
</PropertyGroup>
</Project>

View File

@ -0,0 +1,38 @@
{
"profiles": {
"WebApplication1": {
"commandName": "Project",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"dotnetRunMessages": true,
"applicationUrl": "https://*:7005;http://*:5023"
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Docker": {
"commandName": "Docker",
"launchBrowser": true,
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger",
"publishAllPorts": true,
"useSSL": true
}
},
"$schema": "https://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:36148",
"sslPort": 44345
}
}
}

View File

@ -0,0 +1,29 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<Version>1.0.0</Version>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<UserSecretsId>36416112-68b4-4d50-b910-285037f3f3ef</UserSecretsId>
<PublishSingleFile>true</PublishSingleFile>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<GenerateDocumentationFile>True</GenerateDocumentationFile>
<IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract>
<InvariantGlobalization>true</InvariantGlobalization>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.18.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
</ItemGroup>
<ItemGroup>
<Content Update="appsettings.json">
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
</Content>
</ItemGroup>
</Project>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ActiveDebugProfile>WebApplication1</ActiveDebugProfile>
<Controller_SelectedScaffolderID>MvcControllerEmptyScaffolder</Controller_SelectedScaffolderID>
<Controller_SelectedScaffolderCategoryPath>root/Common/MVC/Controller</Controller_SelectedScaffolderCategoryPath>
<NameOfLastUsedPublishProfile>C:\Users\cwatts\Qsync\Projects\Scoreboard\ScoreboardApi\Properties\PublishProfiles\Folder Publish.pubxml</NameOfLastUsedPublishProfile>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DebuggerFlavor>ProjectDebugger</DebuggerFlavor>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,10 @@
using Newtonsoft.Json;
namespace ScoreboardApi.Settings
{
public class ApplicationSettings
{
[JsonProperty(Required = Required.Always)]
public List<Key> AllowedApiKeys { get; set; } = new();
}
}

View File

@ -0,0 +1,13 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
namespace ScoreboardApi.Settings
{
public class Key
{
public Guid ApiKey { get; set; }
[JsonConverter(typeof(StringEnumConverter))]
public Permissions Permission { get; set; }
}
}

View File

@ -0,0 +1,9 @@
namespace ScoreboardApi.Settings
{
public enum Permissions
{
Disallowed,
ReadOnly,
ReadWrite
}
}

View File

@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View File

@ -0,0 +1,38 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"AllowedApiKeys": [
{
"Description": "TestKey",
"apiKey": "396A62D6-0192-4738-8F45-8AAF7BCFA3EC",
"permission": "ReadWrite"
},
{
"Description": "ControllerUI",
"apiKey": "22A94377-F90F-4361-8836-8FC8B604FE6C",
"permission": "ReadWrite"
},
{
"Description": "ColinBradley",
"apiKey": "DE57305F-B3D0-438E-A76D-ADF4DC6EAE02",
"permission": "ReadWrite"
},
{
"Description": "WebsitePublicUI",
"apiKey": "57BF5C10-6CD0-4E02-B7A5-93F1896CE0F8",
"permission": "ReadOnly"
}
],
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://*:5000"
}
}
}
}

View File

@ -0,0 +1,297 @@
#include <WiFi.h>
#include <ArduinoJson.h>
#include <Wire.h>
#include <U8g2lib.h>
#include <U8x8lib.h>
#include <HTTPClient.h>
#include "objects.h"
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); // High speed I2C
// Define pins for the 7-segment displays
const int digitPins[4] = {19, 18, 5, 4}; // Common anode pins
const int segmentPins[7] = {32, 33, 25, 26, 27, 14, 12}; // Segment pins (a, b, c, d, e, f, g)
// Define the 7-segment display patterns
const byte digitPatterns[10] = {
B11111100, // 0
B01100000, // 1
B11011010, // 2
B11110010, // 3
B01100110, // 4
B10110110, // 5
B10111110, // 6
B11100000, // 7
B11111110, // 8
B11110110 // 9
};
// Wi-Fi settings
const char* ssid = "study";
const char* password = "abcde54321";
const char* displayQueue = "dQ";
const char* jsonPoints = "points";
const int wifiLoopDelay = 5000 / portTICK_PERIOD_MS;
const int displayLoopDelay = 1000 / portTICK_PERIOD_MS;
const int httpPollDelay = 3000 / portTICK_PERIOD_MS;
//FreeRTOS Queue Handles
QueueHandle_t scoreQueue;
// FreeRTOS task handles
TaskHandle_t networkTaskHandle = NULL;
TaskHandle_t displayTaskHandle = NULL;
portMUX_TYPE critical = portMUX_INITIALIZER_UNLOCKED;
// FreeRTOS Event Handles
EventGroupHandle_t wifi_event_group;
const int CONNECTED_BIT = BIT0;
void networkTask(void * parameter);
void displayTask(void * parameter);
void setup() {
try {
// Initialize Serial port
Serial.begin(115200);
#ifdef DEBUG
Serial.println("Starting");
#endif
//start display driver
u8g2.begin();
u8g2.setFont(u8g2_font_ncenB08_tr); // choose a suitable font
#ifdef DEBUG
Serial.println("end dispInit");
#endif
// Initialize the pins
for (int i = 0; i < 4; i++) {
pinMode(digitPins[i], OUTPUT);
digitalWrite(digitPins[i], HIGH); // Turn off all displays initially
}
for (int i = 0; i < 7; i++) {
pinMode(segmentPins[i], OUTPUT);
digitalWrite(segmentPins[i], LOW); // Turn off all segments initially
}
WiFi.onEvent( WiFiEvent );
WiFi.mode(WIFI_STA);
WiFi.disconnect();
#ifdef DEBUG
Serial.println("end IO init");
#endif
scoreQueue = xQueueCreate(2, sizeof( Scores ) );
wifi_event_group = xEventGroupCreate();
// Start the network task
xTaskCreatePinnedToCore(networkTask, "Network Task", 20000, NULL, 3, &networkTaskHandle, 1);
// Start the display task
xTaskCreatePinnedToCore(displayTask, "Display Task", 20000, NULL, 4, &displayTaskHandle, 1 );
#ifdef DEBUG
Serial.println("ended init");
#endif
vTaskStartScheduler();
} catch(String err){
Serial.print("SetupError: ");
Serial.println(err);
}
}
void WiFiEvent(WiFiEvent_t event)
{
switch (event) {
case SYSTEM_EVENT_STA_CONNECTED:
Serial.println("Connected to access point");
break;
case SYSTEM_EVENT_STA_DISCONNECTED:
Serial.println("Disconnected from WiFi access point");
break;
case SYSTEM_EVENT_AP_STADISCONNECTED:
Serial.println("WiFi client disconnected");
break;
default: break;
}
}
void networkTask(void * parameter) {
try {
while(true){
while ( WiFi.status() != WL_CONNECTED )
{
#ifdef DEBUG
Serial.println("disconnected, connecting");
#endif
WiFi.disconnect();
WiFi.begin( ssid, password );
#ifdef DEBUG
Serial.println(" waiting on wifi connection" );
#endif
vTaskDelay( 4000 );
}
while (WiFi.status() != WL_CONNECTED) {
xEventGroupClearBits(wifi_event_group, CONNECTED_BIT);
#ifdef DEBUG
Serial.println("Connecting to WiFi...");
#endif
}
xEventGroupSetBits(wifi_event_group, CONNECTED_BIT);
#ifdef DEBUG
Serial.println("Connected to WiFi");
#endif
HTTPClient http;
const String url = "https://192.168.1.141:7005/api/score/summary";
for (;;) {
if(WiFi.status() != WL_CONNECTED){
continue;
}
#ifdef DEBUG
Serial.println(url);
#endif
http.useHTTP10(true);
http.begin(url.c_str());
http.addHeader("x-api-key", "396A62D6-0192-4738-8F45-8AAF7BCFA3EC");
int httpResponseCode = http.GET();
DynamicJsonDocument doc(2048);
if (httpResponseCode>0) { //if no game, what code?
#ifdef DEBUG
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
#endif
deserializeJson(doc, http.getStream());
} else {
Serial.print("HTTP Req Error code: ");
Serial.println(httpResponseCode);
vTaskDelay(httpPollDelay);
continue;
}
// Parse JSON
Scores pts;
pts.home = doc["home"].as<int>();
pts.away = doc["away"].as<int>();
pts.state = doc["state"].as<String>();
#ifdef DEBUG
Serial.print("Match State: ");
Serial.print(doc["state"].as<String>());
Serial.print("| Home: ");
Serial.print(doc["home"].as<int>());
Serial.print(" Away: ");
Serial.println(doc["away"].as<int>());
#endif
http.end();
// Send the number to the display task
xQueueSend(scoreQueue, &pts, portMAX_DELAY);
vTaskDelay(httpPollDelay); // Wait before fetching the next update
}
vTaskDelay(wifiLoopDelay);
}
}
catch (String err){
Serial.print("NetworkTaskError: ");
Serial.println(err);
}
}
void displayTask(void * parameter) {
try {
Scores matchScore;
int wifiStateY = 10;
int matchStateY = 35;
int scoreY = 74-u8g2.getMaxCharHeight();
while(true) {
u8g2.clearBuffer(); // clear the internal memory
int bits = (xEventGroupGetBits( wifi_event_group));
if (bits & CONNECTED_BIT) {
#ifdef DEBUG
Serial.println("Connected");
#endif
u8g2.drawStr(0,wifiStateY,"Connected! ;)"); // write something to the internal memory
} else {
#ifdef DEBUG
Serial.println("Disconnected");
#endif
u8g2.drawStr(0,wifiStateY,"Not Connected! :("); // write something to the internal memory
}
if (xQueueReceive(scoreQueue, &matchScore, portMAX_DELAY)) {
for (int i = 0; i < 4; i++) {
//pass the digit index (0/1 is home, 1/2 is away)
int pts = i>2?matchScore.away:matchScore.home;
if(i%2 == 0){
displayNumber(i, pts%10);
} else{
displayNumber(i, pts)
}
//displayNumber(i, );
//displayNumber(i, number / (int)pow(10, 3 - i) % 10); // Display the number
delay(5); // Delay to display the number
}
u8g2.drawStr(0, matchStateY, matchScore.state.c_str());
String scoreMsg = "Home " + String(matchScore.home) + " Away " + String(matchScore.away);
u8g2.drawStr(0,scoreY, scoreMsg.c_str());
}
u8g2.sendBuffer(); // transfer internal memory to the display
vTaskDelay(displayLoopDelay);
// if (xQueueReceive(scoreQueue, &number, portMAX_DELAY)) {
// for (int i = 0; i < 4; i++) {
// displayNumber(i, number / (int)pow(10, 3 - i) % 10); // Display the number
// delay(5); // Delay to display the number
// }
// }
}
} catch (String err){
Serial.print("DisplayLoopError: ");
Serial.println(err);
}
}
// Function to display a number on a specific 7-segment display
void displayNumber(int display, int digitValue) {
for (int i = 0; i < 7; i++) {
if (bitRead(digitPatterns[digitValue], i)) {
digitalWrite(segmentPins[i], HIGH); // Turn on the segment
} else {
digitalWrite(segmentPins[i], LOW); // Turn off the segment
}
}
digitalWrite(digitPins[display], LOW); // Turn on the display
}
// String getStateString(GameState state){
// switch(state){
// case GameState::WaitingForStart:
// return "Pending";
// case GameState::FirstHalf:
// return "First Half";
// case GameState::SecondHalf:
// return "Second Half";
// case GameState::HalfTime:
// return "Half Time";
// case GameState::Finished:
// return "Full Time";
// case GameState::None:
// return "Not Configured";
// default:
// "Other";
// }
// }
void loop() {
// Empty loop, tasks handle everything
}

View File

@ -0,0 +1,17 @@
// enum GameState
// {
// None = 0,
// WaitingForStart = 1,
// FirstHalf = 2,
// HalfTime = 3,
// SecondHalf = 4,
// Finished = 5,
// TimeOff = 6
// };
class Scores{
public:
int home;
int away;
String state;
};

86
WifiTest/WifiTest.ino Normal file
View File

@ -0,0 +1,86 @@
/*
* This sketch demonstrates how to scan WiFi networks.
* The API is based on the Arduino WiFi Shield library, but has significant changes as newer WiFi functions are supported.
* E.g. the return value of `encryptionType()` different because more modern encryption is supported.
*/
#include <WiFi.h>
void setup()
{
Serial.begin(115200);
Serial.println("Starting");
// Set WiFi to station mode and disconnect from an AP if it was previously connected.
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);
Serial.println("Setup done");
}
void loop()
{
Serial.println("Scan start");
// WiFi.scanNetworks will return the number of networks found.
int n = WiFi.scanNetworks();
Serial.println("Scan done");
if (n == 0) {
Serial.println("no networks found");
} else {
Serial.print(n);
Serial.println(" networks found");
Serial.println("Nr | SSID | RSSI | CH | Encryption");
for (int i = 0; i < n; ++i) {
// Print SSID and RSSI for each network found
Serial.printf("%2d",i + 1);
Serial.print(" | ");
Serial.printf("%-32.32s", WiFi.SSID(i).c_str());
Serial.print(" | ");
Serial.printf("%4d", WiFi.RSSI(i));
Serial.print(" | ");
Serial.printf("%2d", WiFi.channel(i));
Serial.print(" | ");
switch (WiFi.encryptionType(i))
{
case WIFI_AUTH_OPEN:
Serial.print("open");
break;
case WIFI_AUTH_WEP:
Serial.print("WEP");
break;
case WIFI_AUTH_WPA_PSK:
Serial.print("WPA");
break;
case WIFI_AUTH_WPA2_PSK:
Serial.print("WPA2");
break;
case WIFI_AUTH_WPA_WPA2_PSK:
Serial.print("WPA+WPA2");
break;
case WIFI_AUTH_WPA2_ENTERPRISE:
Serial.print("WPA2-EAP");
break;
case WIFI_AUTH_WPA3_PSK:
Serial.print("WPA3");
break;
case WIFI_AUTH_WPA2_WPA3_PSK:
Serial.print("WPA2+WPA3");
break;
case WIFI_AUTH_WAPI_PSK:
Serial.print("WAPI");
break;
default:
Serial.print("unknown");
}
Serial.println();
delay(10);
}
}
Serial.println("");
// Delete the scan result to free memory for code below.
WiFi.scanDelete();
// Wait a bit before scanning again.
delay(5000);
}

View File

@ -0,0 +1,29 @@
#include <U8g2lib.h>
#include <U8x8lib.h>
#define U8X8_HAVE_HW_I2C
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); // High speed I2C
// U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); //Low spped I2C
void setup(void) {
u8g2.begin();
}
void loop(void) {
u8g2.clearBuffer(); // clear the internal memory
u8g2.setFont(u8g2_font_ncenB08_tr); // choose a suitable font
u8g2.drawStr(0,10,"Hey Sexy! ;)"); // write something to the internal memory
u8g2.sendBuffer(); // transfer internal memory to the display
delay(1000);
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,241 @@
C:\Users\chris\Qsync\Projects\Scoreboard\scoreboardoutput\libraries\HTTPClient\HTTPClient.cpp.o: \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\libraries\HTTPClient\src\HTTPClient.cpp \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/HardwareSerial.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Stream.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Print.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/WString.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/pgmspace.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Printable.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_system/include/esp_system.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_err.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_compiler.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_attr.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_bit_defs.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_idf_version.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/esp_mac.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/esp_chip_info.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/esp_random.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/esp_sleep.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/include/hal/touch_sensor_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/esp32/include/soc/soc.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_assert.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/esp32/include/soc/soc_caps.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/include/hal/gpio_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/include/soc/gpio_periph.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/esp32/include/soc/io_mux_reg.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/esp32/include/soc/gpio_struct.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/esp32/include/soc/gpio_reg.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/esp32/include/soc/gpio_sig_map.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/FreeRTOS.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/esp_additions/freertos/FreeRTOSConfig.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_compiler.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/port/xtensa/include/freertos/FreeRTOSConfig_arch.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/port/xtensa/include/freertos/xtensa_config.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/hal.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/esp32/include/xtensa/config/core.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtensa-versions.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/esp32/include/xtensa/config/core-isa.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/esp32/include/xtensa/config/core-matmap.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/esp32/include/xtensa/config/tie.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/esp32/include/xtensa/config/system.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/port/xtensa/include/freertos/xtensa_context.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtensa_context.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/corebits.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtruntime-frames.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_rom/include/esp_rom_sys.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/esp32/include/soc/reset_reasons.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_rom/include/esp32/rom/ets_sys.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/projdefs.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/portable.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/deprecated_definitions.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/port/xtensa/include/freertos/portmacro.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtruntime.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/esp32/include/xtensa/config/specreg.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtruntime-core-state.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xt_instr_macros.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtruntime.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/soc/spinlock.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/soc/cpu.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/esp_cpu.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/include/hal/cpu_hal.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/include/hal/cpu_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/esp32/include/hal/cpu_ll.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/esp32/include/xtensa/config/extreg.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/soc/compare_set.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/include/soc/soc_memory_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_system/include/esp_private/crosscore_int.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_timer/include/esp_timer.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/newlib/platform_include/esp_newlib.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/heap/include/esp_heap_caps.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/heap/include/multi_heap.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/port/xtensa/include/freertos/portbenchmark.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtensa_api.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtensa_context.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/port/xtensa/include/freertos/portmacro_deprecated.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/mpu_wrappers.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/task.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/list.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/esp_additions/freertos/task_snapshot.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/queue.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/task.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/semphr.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/queue.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/event_groups.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/timers.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-log.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/log/include/esp_log.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/log/include/esp_log_internal.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-matrix.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-uart.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/include/hal/uart_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-gpio.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\variants\esp32da/pins_arduino.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-touch.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-dac.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/driver/include/driver/gpio.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/esp_intr_alloc.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_rom/include/esp32/rom/gpio.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-adc.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-spi.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-i2c.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-ledc.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-rmt.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-sigmadelta.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-timer.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-bt.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-psram.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-rgb-led.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-cpu.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/HWCDC.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/USBCDC.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Arduino.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp_arduino_version.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp8266-compat.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/stdlib_noniso.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/binary.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/WCharacter.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/IPAddress.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/WString.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Printable.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Client.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Server.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Udp.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Stream.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/IPAddress.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/HardwareSerial.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Esp.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/spi_flash/include/esp_partition.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/spi_flash/include/esp_flash.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/include/hal/spi_flash_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/include/hal/esp_flash_err.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/spi_flash/include/esp_spi_flash.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/spi_flash/include/esp_spi_flash_counters.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/soc/esp32/spiram.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/io_pin_remap.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Arduino.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-log.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/StreamString.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/base64.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\libraries\HTTPClient\src\HTTPClient.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\libraries\WiFi\src/WiFiClient.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Client.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\libraries\WiFiClientSecure\src/WiFiClientSecure.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\libraries\WiFi\src/WiFi.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Print.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/IPv6Address.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\libraries\WiFi\src/WiFiType.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_wifi/include/esp_wifi_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_wifi/include/esp_private/esp_wifi_types_private.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/esp_interface.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_event/include/esp_event_base.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\libraries\WiFi\src/WiFiSTA.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\libraries\WiFi\src/WiFiGeneric.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_event/include/esp_event.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_event/include/esp_event_base.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_event/include/esp_event_legacy.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_netif/include/esp_netif.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_netif/include/esp_netif_ip_addr.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_netif/include/esp_netif_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_netif/include/esp_netif_defaults.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_eth/include/esp_eth_netif_glue.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_eth/include/esp_eth.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_eth/include/esp_eth_com.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/include/hal/eth_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_eth/include/esp_eth_mac.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_eth/include/esp_eth_phy.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/tcpip_adapter/include/tcpip_adapter.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/tcpip_adapter/include/tcpip_adapter_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/lwip/lwip/src/include/lwip/ip_addr.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/lwip/lwip/src/include/lwip/opt.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/lwip/port/esp32/include/lwipopts.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/newlib/platform_include/sys/ioctl.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_system/include/esp_task.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/esp_additions/freertos/FreeRTOSConfig.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/lwip/port/esp32/include/netif/dhcp_state.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/lwip/port/esp32/include/sntp/sntp_get_set_time.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/lwip/lwip/src/include/lwip/debug.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/lwip/lwip/src/include/lwip/arch.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/lwip/port/esp32/include/arch/cc.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/lwip/port/esp32/include/arch/sys_arch.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/lwip/port/esp32/include/arch/vfs_lwip.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/lwip/lwip/src/include/lwip/def.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/lwip/lwip/src/include/lwip/ip4_addr.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/lwip/lwip/src/include/lwip/ip6_addr.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/lwip/lwip/src/include/lwip/def.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/lwip/lwip/src/include/lwip/ip6_zone.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/lwip/include/apps/dhcpserver/dhcpserver.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/lwip/lwip/src/include/lwip/err.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_netif/include/esp_netif_sta_list.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_wifi/include/esp_smartconfig.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/wifi_provisioning/include/wifi_provisioning/manager.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/protocomm/include/common/protocomm.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/protocomm/include/security/protocomm_security.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/wifi_provisioning/include/wifi_provisioning/wifi_config.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\libraries\WiFi\src/WiFiAP.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\libraries\WiFi\src/WiFiScan.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\libraries\WiFi\src/WiFiClient.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\libraries\WiFi\src/WiFiServer.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Server.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\libraries\WiFi\src/WiFiUdp.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Udp.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/cbuf.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\libraries\WiFiClientSecure\src/ssl_client.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/mbedtls/include/mbedtls/platform.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/port/include/mbedtls/esp_config.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/mbedtls/include/mbedtls/config.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/mbedtls/include/mbedtls/check_config.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/port/include/esp_mem.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/mbedtls/include/mbedtls/platform_time.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/mbedtls/include/mbedtls/net.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/mbedtls/include/mbedtls/net_sockets.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/mbedtls/include/mbedtls/ssl.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/port/include/mbedtls/bignum.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/mbedtls/include/mbedtls/bignum.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/mbedtls/include/mbedtls/ecp.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/mbedtls/include/mbedtls/ssl_ciphersuites.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/mbedtls/include/mbedtls/pk.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/mbedtls/include/mbedtls/md.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/mbedtls/include/mbedtls/platform_util.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/mbedtls/include/mbedtls/rsa.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/mbedtls/include/mbedtls/ecdsa.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/mbedtls/include/mbedtls/cipher.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/mbedtls/include/mbedtls/x509_crt.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/mbedtls/include/mbedtls/x509.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/mbedtls/include/mbedtls/asn1.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/mbedtls/include/mbedtls/x509_crl.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/mbedtls/include/mbedtls/dhm.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/mbedtls/include/mbedtls/ecdh.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/mbedtls/include/mbedtls/debug.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/mbedtls/include/mbedtls/entropy.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/mbedtls/include/mbedtls/sha512.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/port/include/sha512_alt.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/include/hal/sha_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_rom/include/esp32/rom/sha.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/mbedtls/include/mbedtls/ctr_drbg.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/mbedtls/include/mbedtls/aes.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/port/include/aes_alt.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/port/include/aes/esp_aes.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/include/hal/aes_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/mbedtls/mbedtls/include/mbedtls/error.h

Binary file not shown.

View File

@ -0,0 +1,140 @@
C:\Users\chris\Qsync\Projects\Scoreboard\scoreboardoutput\libraries\SPI\SPI.cpp.o: \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\libraries\SPI\src\SPI.cpp \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\libraries\SPI\src\SPI.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\variants\esp32da/pins_arduino.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-spi.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/FreeRTOS.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/esp_additions/freertos/FreeRTOSConfig.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_compiler.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/port/xtensa/include/freertos/FreeRTOSConfig_arch.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/port/xtensa/include/freertos/xtensa_config.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/hal.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/esp32/include/xtensa/config/core.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtensa-versions.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/esp32/include/xtensa/config/core-isa.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/esp32/include/xtensa/config/core-matmap.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/esp32/include/xtensa/config/tie.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/esp32/include/xtensa/config/system.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/port/xtensa/include/freertos/xtensa_context.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtensa_context.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/corebits.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtruntime-frames.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_rom/include/esp_rom_sys.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/esp32/include/soc/reset_reasons.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_rom/include/esp32/rom/ets_sys.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/projdefs.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/portable.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/deprecated_definitions.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/port/xtensa/include/freertos/portmacro.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtruntime.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/esp32/include/xtensa/config/specreg.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtruntime-core-state.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xt_instr_macros.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtruntime.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/soc/spinlock.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/soc/cpu.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/esp_cpu.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/include/hal/cpu_hal.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_err.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_compiler.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/esp32/include/soc/soc_caps.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/include/hal/cpu_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/esp32/include/hal/cpu_ll.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_attr.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/esp32/include/xtensa/config/extreg.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_bit_defs.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/soc/compare_set.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/include/soc/soc_memory_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/esp32/include/soc/soc.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_assert.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_system/include/esp_private/crosscore_int.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_timer/include/esp_timer.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/newlib/platform_include/esp_newlib.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/heap/include/esp_heap_caps.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/heap/include/multi_heap.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_system/include/esp_system.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_idf_version.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/esp_mac.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/esp_chip_info.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/esp_random.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/port/xtensa/include/freertos/portbenchmark.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtensa_api.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtensa_context.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/port/xtensa/include/freertos/portmacro_deprecated.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/mpu_wrappers.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/semphr.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/queue.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/task.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/list.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/esp_additions/freertos/task_snapshot.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/task.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/io_pin_remap.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Arduino.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp_arduino_version.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/esp_sleep.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/include/hal/touch_sensor_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/include/hal/gpio_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/include/soc/gpio_periph.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/esp32/include/soc/io_mux_reg.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/esp32/include/soc/gpio_struct.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/esp32/include/soc/gpio_reg.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/esp32/include/soc/gpio_sig_map.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/queue.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/event_groups.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/timers.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-log.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/log/include/esp_log.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/log/include/esp_log_internal.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-matrix.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-uart.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/include/hal/uart_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-gpio.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-touch.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-dac.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/driver/include/driver/gpio.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/esp_intr_alloc.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_rom/include/esp32/rom/gpio.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-adc.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-spi.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-i2c.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-ledc.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-rmt.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-sigmadelta.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-timer.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-bt.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-psram.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-rgb-led.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-cpu.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp8266-compat.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/stdlib_noniso.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/binary.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/WCharacter.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/WString.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/pgmspace.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Stream.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Print.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Printable.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/IPAddress.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/WString.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Printable.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Client.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Server.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Udp.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Stream.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/IPAddress.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/HardwareSerial.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/HWCDC.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/USBCDC.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Esp.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Arduino.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/spi_flash/include/esp_partition.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/spi_flash/include/esp_flash.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/include/hal/spi_flash_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/include/hal/esp_flash_err.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/spi_flash/include/esp_spi_flash.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/spi_flash/include/esp_spi_flash_counters.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/soc/esp32/spiram.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/io_pin_remap.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-log.h

Binary file not shown.

View File

@ -0,0 +1,142 @@
C:\Users\chris\Qsync\Projects\Scoreboard\scoreboardoutput\libraries\U8g2\U8g2lib.cpp.o: \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\U8g2lib.cpp \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\U8g2lib.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Arduino.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp_arduino_version.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/FreeRTOS.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/esp_additions/freertos/FreeRTOSConfig.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_compiler.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/port/xtensa/include/freertos/FreeRTOSConfig_arch.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/port/xtensa/include/freertos/xtensa_config.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/hal.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/esp32/include/xtensa/config/core.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtensa-versions.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/esp32/include/xtensa/config/core-isa.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/esp32/include/xtensa/config/core-matmap.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/esp32/include/xtensa/config/tie.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/esp32/include/xtensa/config/system.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/port/xtensa/include/freertos/xtensa_context.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtensa_context.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/corebits.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtruntime-frames.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_rom/include/esp_rom_sys.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/esp32/include/soc/reset_reasons.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_rom/include/esp32/rom/ets_sys.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/projdefs.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/portable.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/deprecated_definitions.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/port/xtensa/include/freertos/portmacro.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtruntime.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/esp32/include/xtensa/config/specreg.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtruntime-core-state.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xt_instr_macros.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtruntime.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/soc/spinlock.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/soc/cpu.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/esp_cpu.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/include/hal/cpu_hal.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_err.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_compiler.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/esp32/include/soc/soc_caps.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/include/hal/cpu_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/esp32/include/hal/cpu_ll.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_attr.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/esp32/include/xtensa/config/extreg.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_bit_defs.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/soc/compare_set.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/include/soc/soc_memory_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/esp32/include/soc/soc.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_assert.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_system/include/esp_private/crosscore_int.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_timer/include/esp_timer.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/newlib/platform_include/esp_newlib.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/heap/include/esp_heap_caps.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/heap/include/multi_heap.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_system/include/esp_system.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_idf_version.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/esp_mac.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/esp_chip_info.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/esp_random.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/port/xtensa/include/freertos/portbenchmark.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtensa_api.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtensa_context.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/port/xtensa/include/freertos/portmacro_deprecated.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/mpu_wrappers.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/task.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/list.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/esp_additions/freertos/task_snapshot.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/semphr.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/queue.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/task.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/esp_sleep.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/include/hal/touch_sensor_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/include/hal/gpio_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/include/soc/gpio_periph.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/esp32/include/soc/io_mux_reg.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/esp32/include/soc/gpio_struct.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/esp32/include/soc/gpio_reg.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/esp32/include/soc/gpio_sig_map.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/queue.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/event_groups.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/timers.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-log.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/log/include/esp_log.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/log/include/esp_log_internal.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-matrix.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-uart.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/include/hal/uart_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-gpio.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\variants\esp32da/pins_arduino.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-touch.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-dac.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/driver/include/driver/gpio.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/esp_intr_alloc.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_rom/include/esp32/rom/gpio.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-adc.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-spi.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-i2c.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-ledc.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-rmt.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-sigmadelta.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-timer.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-bt.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-psram.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-rgb-led.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-cpu.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp8266-compat.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/stdlib_noniso.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/binary.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/WCharacter.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/WString.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/pgmspace.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Stream.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Print.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Printable.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/IPAddress.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/WString.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Printable.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Client.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Server.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Udp.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Stream.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/IPAddress.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/HardwareSerial.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/HWCDC.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/USBCDC.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Esp.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/spi_flash/include/esp_partition.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/spi_flash/include/esp_flash.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/include/hal/spi_flash_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/include/hal/esp_flash_err.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/spi_flash/include/esp_spi_flash.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/spi_flash/include/esp_spi_flash_counters.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/soc/esp32/spiram.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/io_pin_remap.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Arduino.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Print.h \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\U8x8lib.h \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib/u8x8.h \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib/u8g2.h \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib/u8x8.h

Binary file not shown.

View File

@ -0,0 +1,143 @@
C:\Users\chris\Qsync\Projects\Scoreboard\scoreboardoutput\libraries\U8g2\U8x8lib.cpp.o: \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\U8x8lib.cpp \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\U8x8lib.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Arduino.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp_arduino_version.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/FreeRTOS.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/esp_additions/freertos/FreeRTOSConfig.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_compiler.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/port/xtensa/include/freertos/FreeRTOSConfig_arch.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/port/xtensa/include/freertos/xtensa_config.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/hal.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/esp32/include/xtensa/config/core.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtensa-versions.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/esp32/include/xtensa/config/core-isa.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/esp32/include/xtensa/config/core-matmap.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/esp32/include/xtensa/config/tie.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/esp32/include/xtensa/config/system.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/port/xtensa/include/freertos/xtensa_context.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtensa_context.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/corebits.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtruntime-frames.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_rom/include/esp_rom_sys.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/esp32/include/soc/reset_reasons.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_rom/include/esp32/rom/ets_sys.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/projdefs.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/portable.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/deprecated_definitions.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/port/xtensa/include/freertos/portmacro.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtruntime.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/esp32/include/xtensa/config/specreg.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtruntime-core-state.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xt_instr_macros.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtruntime.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/soc/spinlock.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/soc/cpu.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/esp_cpu.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/include/hal/cpu_hal.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_err.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_compiler.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/esp32/include/soc/soc_caps.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/include/hal/cpu_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/esp32/include/hal/cpu_ll.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_attr.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/esp32/include/xtensa/config/extreg.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_bit_defs.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/soc/compare_set.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/include/soc/soc_memory_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/esp32/include/soc/soc.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_assert.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_system/include/esp_private/crosscore_int.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_timer/include/esp_timer.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/newlib/platform_include/esp_newlib.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/heap/include/esp_heap_caps.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/heap/include/multi_heap.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_system/include/esp_system.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_idf_version.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/esp_mac.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/esp_chip_info.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/esp_random.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/port/xtensa/include/freertos/portbenchmark.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtensa_api.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/xtensa/include/xtensa/xtensa_context.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/port/xtensa/include/freertos/portmacro_deprecated.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/mpu_wrappers.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/task.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/list.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/esp_additions/freertos/task_snapshot.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/semphr.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/queue.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/task.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/esp_sleep.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/include/hal/touch_sensor_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/include/hal/gpio_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/include/soc/gpio_periph.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/esp32/include/soc/io_mux_reg.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/esp32/include/soc/gpio_struct.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/esp32/include/soc/gpio_reg.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/soc/esp32/include/soc/gpio_sig_map.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/queue.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/event_groups.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/freertos/include/freertos/timers.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-log.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/log/include/esp_log.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/log/include/esp_log_internal.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-matrix.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-uart.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/include/hal/uart_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-gpio.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\variants\esp32da/pins_arduino.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-touch.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-dac.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/driver/include/driver/gpio.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/esp_intr_alloc.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_common/include/esp_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_rom/include/esp32/rom/gpio.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-adc.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-spi.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-i2c.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-ledc.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-rmt.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-sigmadelta.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-timer.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-bt.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-psram.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-rgb-led.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-cpu.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp8266-compat.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/stdlib_noniso.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/binary.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/WCharacter.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/WString.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/pgmspace.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Stream.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Print.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Printable.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/IPAddress.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/WString.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Printable.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Client.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Server.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Udp.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Stream.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/IPAddress.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/HardwareSerial.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/HWCDC.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/USBCDC.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Esp.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/spi_flash/include/esp_partition.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/spi_flash/include/esp_flash.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/include/hal/spi_flash_types.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/hal/include/hal/esp_flash_err.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/spi_flash/include/esp_spi_flash.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/spi_flash/include/esp_spi_flash_counters.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16/tools/sdk/esp32/include/esp_hw_support/include/soc/esp32/spiram.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/io_pin_remap.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Arduino.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/Print.h \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib/u8x8.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\libraries\SPI\src/SPI.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal-spi.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\libraries\Wire\src/Wire.h \
C:\Users\chris\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.16\cores\esp32/esp32-hal.h

Binary file not shown.

View File

@ -0,0 +1,3 @@
C:\Users\chris\Qsync\Projects\Scoreboard\scoreboardoutput\libraries\U8g2\clib\mui.c.o: \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib\mui.c \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib\mui.h

Binary file not shown.

View File

@ -0,0 +1,6 @@
C:\Users\chris\Qsync\Projects\Scoreboard\scoreboardoutput\libraries\U8g2\clib\mui_u8g2.c.o: \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib\mui_u8g2.c \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib\mui.h \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib\u8g2.h \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib\u8x8.h \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib\mui_u8g2.h

Binary file not shown.

View File

@ -0,0 +1,4 @@
C:\Users\chris\Qsync\Projects\Scoreboard\scoreboardoutput\libraries\U8g2\clib\u8g2_bitmap.c.o: \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib\u8g2_bitmap.c \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib\u8g2.h \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib\u8x8.h

Binary file not shown.

View File

@ -0,0 +1,4 @@
C:\Users\chris\Qsync\Projects\Scoreboard\scoreboardoutput\libraries\U8g2\clib\u8g2_box.c.o: \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib\u8g2_box.c \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib\u8g2.h \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib\u8x8.h

Binary file not shown.

View File

@ -0,0 +1,4 @@
C:\Users\chris\Qsync\Projects\Scoreboard\scoreboardoutput\libraries\U8g2\clib\u8g2_buffer.c.o: \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib\u8g2_buffer.c \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib\u8g2.h \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib\u8x8.h

Binary file not shown.

View File

@ -0,0 +1,4 @@
C:\Users\chris\Qsync\Projects\Scoreboard\scoreboardoutput\libraries\U8g2\clib\u8g2_button.c.o: \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib\u8g2_button.c \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib\u8g2.h \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib\u8x8.h

Binary file not shown.

View File

@ -0,0 +1,4 @@
C:\Users\chris\Qsync\Projects\Scoreboard\scoreboardoutput\libraries\U8g2\clib\u8g2_circle.c.o: \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib\u8g2_circle.c \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib\u8g2.h \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib\u8x8.h

Binary file not shown.

View File

@ -0,0 +1,4 @@
C:\Users\chris\Qsync\Projects\Scoreboard\scoreboardoutput\libraries\U8g2\clib\u8g2_cleardisplay.c.o: \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib\u8g2_cleardisplay.c \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib\u8g2.h \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib\u8x8.h

View File

@ -0,0 +1,4 @@
C:\Users\chris\Qsync\Projects\Scoreboard\scoreboardoutput\libraries\U8g2\clib\u8g2_d_memory.c.o: \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib\u8g2_d_memory.c \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib\u8g2.h \
C:\Users\chris\Documents\Arduino\libraries\U8g2\src\clib\u8x8.h

Some files were not shown because too many files have changed in this diff Show More