mirror of
https://github.com/DCC-EX/CommandStation-EX.git
synced 2025-07-29 02:13:45 +02:00
Compare commits
43 Commits
v4.2.40-De
...
v4.2.45-De
Author | SHA1 | Date | |
---|---|---|---|
|
ff53b90034 | ||
|
1daa0a9ba9 | ||
|
294b9693c5 | ||
|
16e44eb11a | ||
|
4bad334875 | ||
|
32491854ff | ||
|
3e95372816 | ||
|
05b0fc3d2e | ||
|
bb7cdc5422 | ||
|
6199cecd42 | ||
|
1aae0aed0a | ||
|
1d29be9de6 | ||
|
bfa33a9df7 | ||
|
49c0a1a55a | ||
|
9b7d1ae858 | ||
|
c11d8f6359 | ||
|
3868bb19ac | ||
|
7589917638 | ||
|
e7d9626a72 | ||
|
fe035f4096 | ||
|
4d236446b0 | ||
|
a100d709ce | ||
|
0d82370380 | ||
|
ff6034dff2 | ||
|
5d0de6b807 | ||
|
2e518fcac2 | ||
|
be273454bc | ||
|
751b46b6bb | ||
|
91bc9df44e | ||
|
72ceb63913 | ||
|
d2c7e7fb8d | ||
|
61db37c7ea | ||
|
3a3071f35b | ||
|
ef3d36ae25 | ||
|
c3d2e5b222 | ||
|
9f212c27bf | ||
|
de06c0ae3e | ||
|
273f55b143 | ||
|
18a992bf08 | ||
|
de6e91a778 | ||
|
b18df1405c | ||
|
305e0902f4 | ||
|
95c1b1da31 |
@@ -75,6 +75,9 @@ void setup()
|
||||
|
||||
DIAG(F("License GPLv3 fsf.org (c) dcc-ex.com"));
|
||||
|
||||
// Initialise HAL layer before reading EEprom or setting up MotorDrivers
|
||||
IODevice::begin();
|
||||
|
||||
DISPLAY_START (
|
||||
// This block is still executed for DIAGS if display not in use
|
||||
LCD(0,F("DCC-EX v%S"),F(VERSION));
|
||||
@@ -96,10 +99,7 @@ void setup()
|
||||
#if ETHERNET_ON
|
||||
EthernetInterface::setup();
|
||||
#endif // ETHERNET_ON
|
||||
|
||||
// Initialise HAL layer before reading EEprom or setting up MotorDrivers
|
||||
IODevice::begin();
|
||||
|
||||
|
||||
// As the setup of a motor shield may require a read of the current sense input from the ADC,
|
||||
// let's make sure to initialise the ADCee class!
|
||||
ADCee::begin();
|
||||
|
@@ -162,7 +162,7 @@ uint16_t ADCee::usedpins = 0;
|
||||
int * ADCee::analogvals = NULL;
|
||||
|
||||
int ADCee::init(uint8_t pin) {
|
||||
uint id = pin - A0;
|
||||
uint8_t id = pin - A0;
|
||||
int value = 0;
|
||||
|
||||
if (id > NUM_ADC_INPUTS)
|
||||
@@ -210,7 +210,7 @@ int ADCee::read(uint8_t pin, bool fromISR) {
|
||||
#pragma GCC push_options
|
||||
#pragma GCC optimize ("-O3")
|
||||
void ADCee::scan() {
|
||||
static uint id = 0; // id and mask are the same thing but it is faster to
|
||||
static uint8_t id = 0; // id and mask are the same thing but it is faster to
|
||||
static uint16_t mask = 1; // increment and shift instead to calculate mask from id
|
||||
static bool waiting = false;
|
||||
|
||||
|
@@ -237,10 +237,13 @@ int16_t ADCee::ADCmax() {
|
||||
}
|
||||
|
||||
int ADCee::init(uint8_t pin) {
|
||||
uint id = pin - A0;
|
||||
|
||||
int value = 0;
|
||||
PinName stmpin = digitalPin[analogInputPin[id]];
|
||||
uint32_t stmgpio = stmpin / 16; // 16-bits per GPIO port group on STM32
|
||||
PinName stmpin = analogInputToPinName(pin);
|
||||
if (stmpin == NC) // do not continue if this is not an analog pin at all
|
||||
return -1024; // some silly value as error
|
||||
|
||||
uint32_t stmgpio = STM_PORT(stmpin); // converts to the GPIO port (16-bits per port group on STM32)
|
||||
uint32_t adcchan = STM_PIN_CHANNEL(pinmap_function(stmpin, PinMap_ADC)); // find ADC channel (only valid for ADC1!)
|
||||
GPIO_TypeDef * gpioBase;
|
||||
|
||||
@@ -258,12 +261,20 @@ int ADCee::init(uint8_t pin) {
|
||||
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN; //Power up PORTC
|
||||
gpioBase = GPIOC;
|
||||
break;
|
||||
default:
|
||||
return -1023; // some silly value as error
|
||||
}
|
||||
|
||||
// Set pin mux mode to analog input
|
||||
gpioBase->MODER |= (0b011 << (stmpin << 1)); // Set pin mux to analog mode
|
||||
// Set pin mux mode to analog input, the 32 bit port mode register has 2 bits per pin
|
||||
gpioBase->MODER |= (0b011 << (STM_PIN(stmpin) << 1)); // Set pin mux to analog mode (binary 11)
|
||||
|
||||
// Set the sampling rate for that analog input
|
||||
// This is F411x specific! Different on for example F334
|
||||
// STM32F11xC/E Reference manual
|
||||
// 11.12.4 ADC sample time register 1 (ADC_SMPR1) (channels 10 to 18)
|
||||
// 11.12.5 ADC sample time register 2 (ADC_SMPR2) (channels 0 to 9)
|
||||
if (adcchan > 18)
|
||||
return -1022; // silly value as error
|
||||
if (adcchan < 10)
|
||||
ADC1->SMPR2 |= (0b111 << (adcchan * 3)); // Channel sampling rate 480 cycles
|
||||
else
|
||||
@@ -275,8 +286,12 @@ int ADCee::init(uint8_t pin) {
|
||||
while(!(ADC1->SR & (1 << 1))); // Wait until conversion is complete
|
||||
value = ADC1->DR; // Read value from register
|
||||
|
||||
if (analogvals == NULL)
|
||||
{
|
||||
uint8_t id = pin - PNUM_ANALOG_BASE;
|
||||
if (id > 15) { // today we have not enough bits in the mask to support more
|
||||
return -1021;
|
||||
}
|
||||
|
||||
if (analogvals == NULL) { // allocate analogvals and analogchans if this is the first invocation of init.
|
||||
analogvals = (int *)calloc(NUM_ADC_INPUTS+1, sizeof(int));
|
||||
analogchans = (uint32_t *)calloc(NUM_ADC_INPUTS+1, sizeof(uint32_t));
|
||||
}
|
||||
@@ -291,7 +306,7 @@ int ADCee::init(uint8_t pin) {
|
||||
* Read function ADCee::read(pin) to get value instead of analogRead(pin)
|
||||
*/
|
||||
int ADCee::read(uint8_t pin, bool fromISR) {
|
||||
uint8_t id = pin - A0;
|
||||
uint8_t id = pin - PNUM_ANALOG_BASE;
|
||||
// Was this pin initialised yet?
|
||||
if ((usedpins & (1<<id) ) == 0)
|
||||
return -1023;
|
||||
@@ -306,7 +321,7 @@ int ADCee::read(uint8_t pin, bool fromISR) {
|
||||
#pragma GCC push_options
|
||||
#pragma GCC optimize ("-O3")
|
||||
void ADCee::scan() {
|
||||
static uint id = 0; // id and mask are the same thing but it is faster to
|
||||
static uint8_t id = 0; // id and mask are the same thing but it is faster to
|
||||
static uint16_t mask = 1; // increment and shift instead to calculate mask from id
|
||||
static bool waiting = false;
|
||||
|
||||
@@ -368,4 +383,4 @@ void ADCee::begin() {
|
||||
ADC1->CR2 |= (1 << 0); // Switch on ADC1
|
||||
interrupts();
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
BIN
EX-CommandStation-installer.exe
Normal file
BIN
EX-CommandStation-installer.exe
Normal file
Binary file not shown.
@@ -1129,7 +1129,10 @@ void RMFT2::clockEvent(int16_t clocktime, bool change) {
|
||||
// Hunt for an ONTIME for this time
|
||||
if (Diag::CMD)
|
||||
DIAG(F("Looking for clock event at : %d"), clocktime);
|
||||
if (change) handleEvent(F("CLOCK"),onClockLookup,clocktime);
|
||||
if (change) {
|
||||
handleEvent(F("CLOCK"),onClockLookup,clocktime);
|
||||
handleEvent(F("CLOCK"),onClockLookup,25*60+clocktime%60);
|
||||
}
|
||||
}
|
||||
|
||||
void RMFT2::handleEvent(const FSH* reason,LookList* handlers, int16_t id) {
|
||||
|
@@ -91,6 +91,7 @@
|
||||
#undef ONCLOSE
|
||||
#undef ONTIME
|
||||
#undef ONCLOCKTIME
|
||||
#undef ONCLOCKMINS
|
||||
#undef ONGREEN
|
||||
#undef ONRED
|
||||
#undef ONTHROW
|
||||
@@ -134,6 +135,7 @@
|
||||
#undef STOP
|
||||
#undef THROW
|
||||
#undef TURNOUT
|
||||
#undef TURNOUTL
|
||||
#undef UNJOIN
|
||||
#undef UNLATCH
|
||||
#undef VIRTUAL_SIGNAL
|
||||
@@ -208,6 +210,7 @@
|
||||
#define ONAMBER(signal_id)
|
||||
#define ONTIME(value)
|
||||
#define ONCLOCKTIME(hours,mins)
|
||||
#define ONCLOCKMINS(mins)
|
||||
#define ONDEACTIVATE(addr,subaddr)
|
||||
#define ONDEACTIVATEL(linear)
|
||||
#define ONCLOSE(turnout_id)
|
||||
@@ -254,6 +257,7 @@
|
||||
#define STOP
|
||||
#define THROW(id)
|
||||
#define TURNOUT(id,addr,subaddr,description...)
|
||||
#define TURNOUTL(id,addr,description...)
|
||||
#define UNJOIN
|
||||
#define UNLATCH(sensor_id)
|
||||
#define VIRTUAL_SIGNAL(id)
|
||||
|
@@ -316,6 +316,7 @@ const HIGHFLASH int16_t RMFT2::SignalDefinitions[] = {
|
||||
#define ONCLOSE(turnout_id) OPCODE_ONCLOSE,V(turnout_id),
|
||||
#define ONTIME(value) OPCODE_ONTIME,V(value),
|
||||
#define ONCLOCKTIME(hours,mins) OPCODE_ONTIME,V((STRIP_ZERO(hours)*60)+STRIP_ZERO(mins)),
|
||||
#define ONCLOCKMINS(mins) ONCLOCKTIME(25,mins)
|
||||
#define ONDEACTIVATE(addr,subaddr) OPCODE_ONDEACTIVATE,V(addr<<2|subaddr),
|
||||
#define ONDEACTIVATEL(linear) OPCODE_ONDEACTIVATE,V(linear+3),
|
||||
#define ONGREEN(signal_id) OPCODE_ONGREEN,V(signal_id),
|
||||
@@ -361,6 +362,7 @@ const HIGHFLASH int16_t RMFT2::SignalDefinitions[] = {
|
||||
#define STOP OPCODE_SPEED,V(0),
|
||||
#define THROW(id) OPCODE_THROW,V(id),
|
||||
#define TURNOUT(id,addr,subaddr,description...) OPCODE_TURNOUT,V(id),OPCODE_PAD,V(addr),OPCODE_PAD,V(subaddr),
|
||||
#define TURNOUTL(id,addr,description...) TURNOUT(id,(addr-1)/4+1,(addr-1)%4, description)
|
||||
#define UNJOIN OPCODE_UNJOIN,0,0,
|
||||
#define UNLATCH(sensor_id) OPCODE_UNLATCH,V(sensor_id),
|
||||
#define VIRTUAL_SIGNAL(id)
|
||||
|
@@ -1 +1 @@
|
||||
#define GITHUB_SHA "devel-202303252126Z"
|
||||
#define GITHUB_SHA "devel-202304111013Z"
|
||||
|
@@ -55,6 +55,7 @@ public:
|
||||
pinMode(_clockPin,OUTPUT);
|
||||
pinMode(_dataPin,_pinMap?INPUT_PULLUP:OUTPUT);
|
||||
_display();
|
||||
if (!_pinMap) _loopOutput();
|
||||
}
|
||||
|
||||
// loop called by HAL supervisor
|
||||
|
@@ -210,7 +210,10 @@ int MotorDriver::getCurrentRaw(bool fromISR) {
|
||||
(void)fromISR;
|
||||
if (currentPin==UNUSED_PIN) return 0;
|
||||
int current;
|
||||
current = ADCee::read(currentPin, fromISR)-senseOffset;
|
||||
current = ADCee::read(currentPin, fromISR);
|
||||
// here one can diag raw value
|
||||
// if (fromISR == false) DIAG(F("%c: %d"), trackLetter, current);
|
||||
current = current-senseOffset; // adjust with offset
|
||||
if (current<0) current=0-current;
|
||||
if ((faultPin != UNUSED_PIN) && isLOW(fastFaultPin) && powerMode==POWERMODE::ON)
|
||||
return (current == 0 ? -1 : -current);
|
||||
|
13
install_via_powershell.cmd
Normal file
13
install_via_powershell.cmd
Normal file
@@ -0,0 +1,13 @@
|
||||
@ECHO OFF
|
||||
|
||||
FOR /f "tokens=*" %%a IN ('powershell Get-ExecutionPolicy -Scope CurrentUser') DO SET PS_POLICY=%%a
|
||||
|
||||
IF NOT %PS_POLICY=="Bypass" (
|
||||
powershell Set-ExecutionPolicy -Scope CurrentUser Bypass
|
||||
)
|
||||
|
||||
powershell %~dp0%installer.ps1
|
||||
|
||||
IF NOT %PS_POLICY=="Bypass" (
|
||||
powershell Set-ExecutionPolicy -Scope CurrentUser %PS_POLICY%
|
||||
)
|
540
installer.ps1
Normal file
540
installer.ps1
Normal file
@@ -0,0 +1,540 @@
|
||||
<#
|
||||
# © 2023 Peter Cole
|
||||
#
|
||||
# This file is part of EX-CommandStation
|
||||
#
|
||||
# This is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# It is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with CommandStation. If not, see <https://www.gnu.org/licenses/>.
|
||||
#>
|
||||
|
||||
<############################################
|
||||
For script errors set ExecutionPolicy:
|
||||
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass
|
||||
############################################>
|
||||
|
||||
<############################################
|
||||
Optional command line parameters:
|
||||
$buildDirectory - specify an existing directory rather than generating a new unique one
|
||||
$configDirectory - specify a directory containing existing files as per $configFiles
|
||||
############################################>
|
||||
Param(
|
||||
[Parameter()]
|
||||
[String]$buildDirectory,
|
||||
[Parameter()]
|
||||
[String]$configDirectory
|
||||
)
|
||||
|
||||
<############################################
|
||||
Define global parameters here such as known URLs etc.
|
||||
############################################>
|
||||
$installerVersion = "v0.0.8"
|
||||
$configFiles = @("config.h", "myAutomation.h", "myHal.cpp", "mySetup.h")
|
||||
$wifiBoards = @("arduino:avr:mega", "esp32:esp32:esp32")
|
||||
$userDirectory = $env:USERPROFILE + "\"
|
||||
$gitHubAPITags = "https://api.github.com/repos/DCC-EX/CommandStation-EX/git/refs/tags"
|
||||
$gitHubURLPrefix = "https://github.com/DCC-EX/CommandStation-EX/archive/"
|
||||
if ((Get-WmiObject win32_operatingsystem | Select-Object osarchitecture).osarchitecture -eq "64-bit") {
|
||||
$arduinoCLIURL = "https://downloads.arduino.cc/arduino-cli/arduino-cli_latest_Windows_64bit.zip"
|
||||
$arduinoCLIZip = $userDirectory + "Downloads\" + "arduino-cli_latest_Windows_64bit.zip"
|
||||
} else {
|
||||
$arduinoCLIURL = "https://downloads.arduino.cc/arduino-cli/arduino-cli_latest_Windows_32bit.zip"
|
||||
$arduinoCLIZip = $userDirectory + "Downloads\" + "arduino-cli_latest_Windows_32bit.zip"
|
||||
}
|
||||
$arduinoCLIDirectory = $userDirectory + "arduino-cli"
|
||||
$arduinoCLI = $arduinoCLIDirectory + "\arduino-cli.exe"
|
||||
|
||||
<############################################
|
||||
List of supported devices with FQBN in case clones used that aren't detected
|
||||
############################################>
|
||||
$supportedDevices = @(
|
||||
@{
|
||||
name = "Arduino Mega or Mega 2560"
|
||||
fqbn = "arduino:avr:mega"
|
||||
},
|
||||
@{
|
||||
name = "Arduino Nano"
|
||||
fqbn = "arduino:avr:nano"
|
||||
},
|
||||
@{
|
||||
name = "Arduino Uno"
|
||||
fqbn = "arduino:avr:uno"
|
||||
},
|
||||
@{
|
||||
name = "ESP32 Dev Module"
|
||||
fqbn = "esp32:esp32:esp32"
|
||||
}
|
||||
)
|
||||
|
||||
<############################################
|
||||
List of supported displays
|
||||
############################################>
|
||||
$displayList = @(
|
||||
@{
|
||||
option = "LCD 16 columns x 2 rows"
|
||||
configLine = "#define LCD_DRIVER 0x27,16,2"
|
||||
},
|
||||
@{
|
||||
option = "LCD 16 columns x 4 rows"
|
||||
configLine = "#define LCD_DRIVER 0x27,16,4"
|
||||
},
|
||||
@{
|
||||
option = "OLED 128 x 32"
|
||||
configLine = "#define OLED_DRIVER 128,32"
|
||||
},
|
||||
@{
|
||||
option = "OLED 128 x 64"
|
||||
configLine = "#define OLED_DRIVER 128,64"
|
||||
}
|
||||
)
|
||||
|
||||
<############################################
|
||||
Basics of config.h
|
||||
############################################>
|
||||
$configLines = @(
|
||||
"/*",
|
||||
"This config.h file was generated by the DCC-EX PowerShell installer $installerVersion",
|
||||
"*/",
|
||||
"",
|
||||
"// Define standard motor shield",
|
||||
"#define MOTOR_SHIELD_TYPE STANDARD_MOTOR_SHIELD",
|
||||
""
|
||||
)
|
||||
|
||||
<############################################
|
||||
Set default action for progress indicators, warnings, and errors
|
||||
############################################>
|
||||
$global:ProgressPreference = "SilentlyContinue"
|
||||
$global:WarningPreference = "SilentlyContinue"
|
||||
$global:ErrorActionPreference = "SilentlyContinue"
|
||||
|
||||
<############################################
|
||||
If $buildDirectory not provided, generate a new time/date stamp based directory to use
|
||||
############################################>
|
||||
if (!$PSBoundParameters.ContainsKey('buildDirectory')) {
|
||||
$buildDate = Get-Date -Format 'yyyyMMdd-HHmmss'
|
||||
$buildDirectory = $userDirectory + "EX-CommandStation-Installer\" + $buildDate
|
||||
}
|
||||
$commandStationDirectory = $buildDirectory + "\CommandStation-EX"
|
||||
|
||||
<############################################
|
||||
Write out intro message and prompt to continue
|
||||
############################################>
|
||||
@"
|
||||
Welcome to the DCC-EX PowerShell installer for EX-CommandStation ($installerVersion)
|
||||
|
||||
Current installer options:
|
||||
|
||||
- EX-CommandStation will be built in $commandStationDirectory
|
||||
- Arduino CLI will downloaded and extracted to $arduinoCLIDirectory
|
||||
|
||||
Before continuing, please ensure:
|
||||
|
||||
- Your computer is connected to the internet
|
||||
- The device you wish to install EX-CommandStation on is connected to a USB port
|
||||
|
||||
This installer will obtain the Arduino CLI (if not already present), and then download and install your chosen version of EX-CommandStation
|
||||
|
||||
"@
|
||||
|
||||
<############################################
|
||||
Prompt user to confirm all is ready to proceed
|
||||
############################################>
|
||||
$confirmation = Read-Host "Enter 'Y' or 'y' then press <Enter> to confirm you are ready to proceed, any other key to exit"
|
||||
if ($confirmation -ne "Y" -and $confirmation -ne "y") {
|
||||
Exit
|
||||
}
|
||||
|
||||
<############################################
|
||||
See if we have the Arduino CLI already, otherwise download and extract it
|
||||
############################################>
|
||||
if (!(Test-Path -PathType Leaf -Path $arduinoCLI)) {
|
||||
if (!(Test-Path -PathType Container -Path $arduinoCLIDirectory)) {
|
||||
try {
|
||||
New-Item -ItemType Directory -Path $arduinoCLIDirectory | Out-Null
|
||||
}
|
||||
catch {
|
||||
Write-Output "Arduino CLI does not exist and cannot create directory $arduinoCLIDirectory"
|
||||
Exit
|
||||
}
|
||||
}
|
||||
Write-Output "`r`nDownloading and extracting Arduino CLI"
|
||||
try {
|
||||
Invoke-WebRequest -Uri $arduinoCLIURL -OutFile $arduinoCLIZip
|
||||
}
|
||||
catch {
|
||||
Write-Output "Failed to download Arduino CLI"
|
||||
Exit
|
||||
}
|
||||
try {
|
||||
Expand-Archive -Path $arduinoCLIZip -DestinationPath $arduinoCLIDirectory -Force
|
||||
}
|
||||
catch {
|
||||
Write-Output "Failed to extract Arduino CLI"
|
||||
}
|
||||
} else {
|
||||
Write-Output "`r`nArduino CLI already downloaded, ensuring it is up to date and you have a board connected"
|
||||
}
|
||||
|
||||
<############################################
|
||||
Make sure Arduino CLI core index updated and list of boards populated
|
||||
############################################>
|
||||
# Need to do an initial board list to download everything first
|
||||
try {
|
||||
& $arduinoCLI core update-index | Out-Null
|
||||
}
|
||||
catch {
|
||||
Write-Output "Failed to update Arduino CLI core index"
|
||||
Exit
|
||||
}
|
||||
# Need to do an initial board list to download everything first
|
||||
try {
|
||||
& $arduinoCLI board list | Out-Null
|
||||
}
|
||||
catch {
|
||||
Write-Output "Failed to update Arduino CLI board list"
|
||||
Exit
|
||||
}
|
||||
|
||||
<############################################
|
||||
Identify available board(s)
|
||||
############################################>
|
||||
try {
|
||||
$boardList = & $arduinoCLI board list --format jsonmini | ConvertFrom-Json
|
||||
}
|
||||
catch {
|
||||
Write-Output "Failed to obtain list of boards"
|
||||
Exit
|
||||
}
|
||||
|
||||
<############################################
|
||||
Get user to select board
|
||||
############################################>
|
||||
if ($boardList.count -eq 0) {
|
||||
Write-Output "Could not find any attached devices, please ensure your device is plugged in to a USB port and Windows recognises it"
|
||||
Exit
|
||||
} else {
|
||||
@"
|
||||
|
||||
Devices attached to COM ports:
|
||||
------------------------------
|
||||
"@
|
||||
|
||||
$boardSelect = 1
|
||||
foreach ($board in $boardList) {
|
||||
if ($board.matching_boards.name) {
|
||||
$boardName = $board.matching_boards.name
|
||||
} else {
|
||||
$boardName = "Unknown device"
|
||||
}
|
||||
$port = $board.port.address
|
||||
Write-Output "$boardSelect - $boardName on port $port"
|
||||
$boardSelect++
|
||||
}
|
||||
Write-Output "$boardSelect - Exit"
|
||||
$userSelection = 0
|
||||
do {
|
||||
[int]$userSelection = Read-Host "`r`nSelect the device to use from the list above"
|
||||
} until (
|
||||
(($userSelection -ge 1) -and ($userSelection -le ($boardList.count + 1)))
|
||||
)
|
||||
if ($userSelection -eq ($boardList.count + 1)) {
|
||||
Write-Output "Exiting installer"
|
||||
Exit
|
||||
} else {
|
||||
$selectedBoard = $userSelection - 1
|
||||
}
|
||||
}
|
||||
|
||||
<############################################
|
||||
If the board is unknown, need to choose which one
|
||||
############################################>
|
||||
if ($null -eq $boardList[$selectedBoard].matching_boards.name) {
|
||||
Write-Output "The device selected is unknown, these boards are supported:`r`n"
|
||||
$deviceSelect = 1
|
||||
foreach ($device in $supportedDevices) {
|
||||
Write-Output "$deviceSelect - $($supportedDevices[$deviceSelect - 1].name)"
|
||||
$deviceSelect++
|
||||
}
|
||||
Write-Output "$deviceSelect - Exit"
|
||||
$userSelection = 0
|
||||
do {
|
||||
[int]$userSelection = Read-Host "Select the board type from the list above"
|
||||
} until (
|
||||
(($userSelection -ge 1) -and ($userSelection -le ($supportedDevices.count + 1)))
|
||||
)
|
||||
if ($userSelection -eq ($supportedDevices.count + 1)) {
|
||||
Write-Output "Exiting installer"
|
||||
Exit
|
||||
} else {
|
||||
$deviceName = $supportedDevices[$userSelection - 1].name
|
||||
$deviceFQBN = $supportedDevices[$userSelection - 1].fqbn
|
||||
$devicePort = $boardList[$selectedBoard].port.address
|
||||
}
|
||||
} else {
|
||||
$deviceName = $boardList[$selectedBoard].matching_boards.name
|
||||
$deviceFQBN = $boardList[$selectedBoard].matching_boards.fqbn
|
||||
$devicePort = $boardList[$selectedBoard].port.address
|
||||
}
|
||||
|
||||
<############################################
|
||||
Get the list of tags
|
||||
############################################>
|
||||
try {
|
||||
$gitHubTags = Invoke-RestMethod -Uri $gitHubAPITags
|
||||
}
|
||||
catch {
|
||||
Write-Output "Failed to obtain list of available EX-CommandStation versions"
|
||||
Exit
|
||||
}
|
||||
|
||||
<############################################
|
||||
Get our GitHub tag list in a hash so we can sort by version numbers and extract just the ones we want
|
||||
############################################>
|
||||
$versionMatch = ".*?v(\d+)\.(\d+).(\d+)-(.*)"
|
||||
$tagList = @{}
|
||||
foreach ($tag in $gitHubTags) {
|
||||
$tagHash = @{}
|
||||
$tagHash["Ref"] = $tag.ref
|
||||
$version = $tag.ref.split("/")[2]
|
||||
$null = $version -match $versionMatch
|
||||
$tagHash["Major"] = [int]$Matches[1]
|
||||
$tagHash["Minor"] = [int]$Matches[2]
|
||||
$tagHash["Patch"] = [int]$Matches[3]
|
||||
$tagHash["Type"] = $Matches[4]
|
||||
$tagList.Add($version, $tagHash)
|
||||
}
|
||||
|
||||
<############################################
|
||||
Get latest two Prod and Devel for user to select
|
||||
############################################>
|
||||
$userList = @{}
|
||||
$prodCount = 1
|
||||
$devCount = 1
|
||||
$select = 1
|
||||
foreach ($tag in $tagList.Keys | Sort-Object {$tagList[$_]["Major"]},{$tagList[$_]["Minor"]},{$tagList[$_]["Patch"]} -Descending) {
|
||||
if (($tagList[$tag]["Type"] -eq "Prod") -and $prodCount -le 2) {
|
||||
$userList[$select] = $tag
|
||||
$select++
|
||||
$prodCount++
|
||||
} elseif (($tagList[$tag]["Type"] -eq "Devel") -and $devCount -le 2) {
|
||||
$userList[$select] = $tag
|
||||
$select++
|
||||
$devCount++
|
||||
}
|
||||
}
|
||||
|
||||
<############################################
|
||||
Display options for user to select and get the selection
|
||||
############################################>
|
||||
@"
|
||||
|
||||
Available EX-CommandStation versions:
|
||||
-------------------------------------
|
||||
"@
|
||||
foreach ($selection in $userList.Keys | Sort-Object $selection) {
|
||||
Write-Output "$selection - $($userList[$selection])"
|
||||
}
|
||||
Write-Output "5 - Exit"
|
||||
$userSelection = 0
|
||||
do {
|
||||
[int]$userSelection = Read-Host "`r`nSelect the version to install from the list above (1 - 5)"
|
||||
} until (
|
||||
(($userSelection -ge 1) -and ($userSelection -le 5))
|
||||
)
|
||||
if ($userSelection -eq 5) {
|
||||
Write-Output "Exiting installer"
|
||||
Exit
|
||||
} else {
|
||||
$downloadURL = $gitHubURLPrefix + $tagList[$userList[$userSelection]]["Ref"] + ".zip"
|
||||
}
|
||||
|
||||
<############################################
|
||||
Create build directory if it doesn't exist, or fail
|
||||
############################################>
|
||||
if (!(Test-Path -PathType Container -Path $buildDirectory)) {
|
||||
try {
|
||||
New-Item -ItemType Directory -Path $buildDirectory | Out-Null
|
||||
}
|
||||
catch {
|
||||
Write-Output "Could not create build directory $buildDirectory"
|
||||
Exit
|
||||
}
|
||||
}
|
||||
|
||||
<############################################
|
||||
Download the chosen version to the build directory
|
||||
############################################>
|
||||
$downladFile = $buildDirectory + "\CommandStation-EX.zip"
|
||||
Write-Output "Downloading and extracting $($userList[$userSelection])"
|
||||
try {
|
||||
Invoke-WebRequest -Uri $downloadURL -OutFile $downladFile
|
||||
}
|
||||
catch {
|
||||
Write-Output "Error downloading EX-CommandStation zip file"
|
||||
Exit
|
||||
}
|
||||
|
||||
<############################################
|
||||
If folder exists, bail out and tell user
|
||||
############################################>
|
||||
if (Test-Path -PathType Container -Path "$buildDirectory\CommandStation-EX") {
|
||||
Write-Output "EX-CommandStation directory already exists, please ensure you have copied any user files then delete manually: $buildDirectory\CommandStation-EX"
|
||||
Exit
|
||||
}
|
||||
|
||||
<############################################
|
||||
Extract and rename to CommandStation-EX to allow building
|
||||
############################################>
|
||||
try {
|
||||
Expand-Archive -Path $downladFile -DestinationPath $buildDirectory -Force
|
||||
}
|
||||
catch {
|
||||
Write-Output "Failed to extract EX-CommandStation zip file"
|
||||
Exit
|
||||
}
|
||||
|
||||
$folderName = $buildDirectory + "\CommandStation-EX-" + ($userList[$userSelection] -replace "^v", "")
|
||||
try {
|
||||
Rename-Item -Path $folderName -NewName $commandStationDirectory
|
||||
}
|
||||
catch {
|
||||
Write-Output "Could not rename folder"
|
||||
Exit
|
||||
}
|
||||
|
||||
<############################################
|
||||
If config directory provided, copy files here
|
||||
############################################>
|
||||
if ($PSBoundParameters.ContainsKey('configDirectory')) {
|
||||
if (Test-Path -PathType Container -Path $configDirectory) {
|
||||
foreach ($file in $configFiles) {
|
||||
if (Test-Path -PathType Leaf -Path "$configDirectory\$file") {
|
||||
Copy-Item -Path "$configDirectory\$file" -Destination "$commandStationDirectory\$file"
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Write-Output "User provided configuration directory $configDirectory does not exist, skipping"
|
||||
}
|
||||
} else {
|
||||
|
||||
<############################################
|
||||
If no config directory provided, prompt for display option
|
||||
############################################>
|
||||
Write-Output "`r`nIf you have an LCD or OLED display connected, you can configure it here`r`n"
|
||||
Write-Output "1 - I have no display, skip this step"
|
||||
$displaySelect = 2
|
||||
foreach ($display in $displayList) {
|
||||
Write-Output "$displaySelect - $($displayList[$displaySelect - 2].option)"
|
||||
$displaySelect++
|
||||
}
|
||||
Write-Output "$($displayList.Count + 2) - Exit"
|
||||
do {
|
||||
[int]$displayChoice = Read-Host "`r`nSelect a display option"
|
||||
} until (
|
||||
($displayChoice -ge 1 -and $displayChoice -le ($displayList.Count + 2))
|
||||
)
|
||||
if ($displayChoice -eq ($displayList.Count + 2)) {
|
||||
Exit
|
||||
} elseif ($displayChoice -ge 2) {
|
||||
$configLines+= "// Display configuration"
|
||||
$configLines+= "$($displayList[$displayChoice - 2].configLine)"
|
||||
$configLines+= "#define SCROLLMODE 1 // Alternate between pages"
|
||||
}
|
||||
<############################################
|
||||
If device supports WiFi, prompt to configure
|
||||
############################################>
|
||||
if ($wifiBoards.Contains($deviceFQBN)) {
|
||||
Write-Output "`r`nYour chosen board supports WiFi`r`n"
|
||||
Write-Output "1 - I don't want WiFi, skip this step
|
||||
2 - Configure my device as an access point I will connect to directly
|
||||
3 - Configure my device to connect to my home WiFi network
|
||||
4 - Exit"
|
||||
do {
|
||||
[int]$wifiChoice = Read-Host "`r`nSelect a WiFi option"
|
||||
} until (
|
||||
($wifiChoice -ge 1 -and $wifiChoice -le 4)
|
||||
)
|
||||
if ($wifiChoice -eq 4) {
|
||||
Exit
|
||||
} elseif ($wifiChoice -ne 1) {
|
||||
$configLines+= ""
|
||||
$configLines+= "// WiFi configuration"
|
||||
$configLines+= "#define ENABLE_WIFI true"
|
||||
$configLines+= "#define IP_PORT 2560"
|
||||
$configLines+= "#define WIFI_HOSTNAME ""dccex"""
|
||||
$configLines+= "#define WIFI_CHANNEL 1"
|
||||
if ($wifiChoice -eq 2) {
|
||||
$configLines+= "#define WIFI_SSID ""Your network name"""
|
||||
$configLines+= "#define WIFI_PASSWORD ""Your network passwd"""
|
||||
}
|
||||
if ($wifiChoice -eq 3) {
|
||||
$wifiSSID = Read-Host "Please enter the SSID of your home network here"
|
||||
$wifiPassword = Read-Host "Please enter your home network WiFi password here"
|
||||
$configLines+= "#define WIFI_SSID ""$($wifiSSID)"""
|
||||
$configLines+= "#define WIFI_PASSWORD ""$($wifiPassword)"""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
<############################################
|
||||
Write out config.h to a file here only if config directory not provided
|
||||
############################################>
|
||||
$configH = $commandStationDirectory + "\config.h"
|
||||
try {
|
||||
$configLines | Out-File -FilePath $configH -Encoding ascii
|
||||
}
|
||||
catch {
|
||||
Write-Output "Error writing config file to $configH"
|
||||
Exit
|
||||
}
|
||||
}
|
||||
|
||||
<############################################
|
||||
Install core libraries for the platform
|
||||
############################################>
|
||||
$platformArray = $deviceFQBN.split(":")
|
||||
$platform = $platformArray[0] + ":" + $platformArray[1]
|
||||
try {
|
||||
& $arduinoCLI core install $platform
|
||||
}
|
||||
catch {
|
||||
Write-Output "Error install core libraries"
|
||||
Exit
|
||||
}
|
||||
|
||||
<############################################
|
||||
Upload the sketch to the selected board
|
||||
############################################>
|
||||
#$arduinoCLI upload -b fqbn -p port $commandStationDirectory
|
||||
Write-Output "Compiling and uploading to $deviceName on $devicePort"
|
||||
try {
|
||||
$output = & $arduinoCLI compile -b $deviceFQBN -u -t -p $devicePort $commandStationDirectory --format jsonmini | ConvertFrom-Json
|
||||
}
|
||||
catch {
|
||||
Write-Output "Failed to compile"
|
||||
Exit
|
||||
}
|
||||
if ($output.success -eq "True") {
|
||||
Write-Output "`r`nCongratulations! DCC-EX EX-CommandStation $($userList[$userSelection]) has been installed on your $deviceName`r`n"
|
||||
} else {
|
||||
Write-Output "`r`nThere was an error installing $($userList[$userSelection]) on your $($deviceName), please take note of the errors provided:`r`n"
|
||||
if ($null -ne $output.compiler_err) {
|
||||
Write-Output "Compiler error: $($output.compiler_err)`r`n"
|
||||
}
|
||||
if ($null -ne $output.builder_result) {
|
||||
Write-Output "Builder result: $($output.builder_result)`r`n"
|
||||
}
|
||||
}
|
||||
|
||||
Write-Output "`r`nPress any key to exit the installer"
|
||||
[void][System.Console]::ReadKey($true)
|
@@ -69,10 +69,10 @@ else
|
||||
# need to do this config better
|
||||
cp -p config.example.h config.h
|
||||
fi
|
||||
need curl
|
||||
if test -x "$ACLI" ; then
|
||||
: all well
|
||||
else
|
||||
need curl
|
||||
curl "$ACLIINSTALL" > acliinstall.sh
|
||||
chmod +x acliinstall.sh
|
||||
./acliinstall.sh
|
||||
|
@@ -20,11 +20,11 @@ default_envs =
|
||||
ESP32
|
||||
Nucleo-F411RE
|
||||
Nucleo-F446RE
|
||||
Teensy3.2
|
||||
Teensy3.5
|
||||
Teensy3.6
|
||||
Teensy4.0
|
||||
Teensy4.1
|
||||
Teensy3_2
|
||||
Teensy3_5
|
||||
Teensy3_6
|
||||
Teensy4_0
|
||||
Teensy4_1
|
||||
src_dir = .
|
||||
include_dir = .
|
||||
|
||||
@@ -53,7 +53,7 @@ monitor_speed = 115200
|
||||
monitor_echo = yes
|
||||
build_flags = -std=c++17
|
||||
|
||||
[env:Arduino M0]
|
||||
[env:Arduino-M0]
|
||||
platform = atmelsam
|
||||
board = mzeroUSB
|
||||
framework = arduino
|
||||
@@ -192,7 +192,7 @@ build_flags = -std=c++17 -Os -g2 -Wunused-variable -DDIAG_LOOPTIMES ; -DDIAG_IO
|
||||
monitor_speed = 115200
|
||||
monitor_echo = yes
|
||||
|
||||
[env:Teensy3.2]
|
||||
[env:Teensy3_2]
|
||||
platform = teensy
|
||||
board = teensy31
|
||||
framework = arduino
|
||||
@@ -200,7 +200,7 @@ build_flags = -std=c++17 -Os -g2
|
||||
lib_deps = ${env.lib_deps}
|
||||
lib_ignore = NativeEthernet
|
||||
|
||||
[env:Teensy3.5]
|
||||
[env:Teensy3_5]
|
||||
platform = teensy
|
||||
board = teensy35
|
||||
framework = arduino
|
||||
@@ -208,7 +208,7 @@ build_flags = -std=c++17 -Os -g2
|
||||
lib_deps = ${env.lib_deps}
|
||||
lib_ignore = NativeEthernet
|
||||
|
||||
[env:Teensy3.6]
|
||||
[env:Teensy3_6]
|
||||
platform = teensy
|
||||
board = teensy36
|
||||
framework = arduino
|
||||
@@ -216,7 +216,7 @@ build_flags = -std=c++17 -Os -g2
|
||||
lib_deps = ${env.lib_deps}
|
||||
lib_ignore = NativeEthernet
|
||||
|
||||
[env:Teensy4.0]
|
||||
[env:Teensy4_0]
|
||||
platform = teensy
|
||||
board = teensy40
|
||||
framework = arduino
|
||||
@@ -224,7 +224,7 @@ build_flags = -std=c++17 -Os -g2
|
||||
lib_deps = ${env.lib_deps}
|
||||
lib_ignore = NativeEthernet
|
||||
|
||||
[env:Teensy4.1]
|
||||
[env:Teensy4_1]
|
||||
platform = teensy
|
||||
board = teensy41
|
||||
framework = arduino
|
||||
|
12
version.h
12
version.h
@@ -4,7 +4,13 @@
|
||||
#include "StringFormatter.h"
|
||||
|
||||
|
||||
#define VERSION "4.2.40"
|
||||
#define VERSION "4.2.45"
|
||||
// 4.2.45 - Add ONCLOCKMINS to FastClock to allow hourly repeat events
|
||||
// 4.2.44 - Add PowerShell installer EX-CommandStation-installer.exe
|
||||
// 4.2.43 - Fix STM32 set right port mode bits for analog
|
||||
// 4.2.42 - Added EXRAIL TURNOUTL Macro definition
|
||||
// 4.2.41 - Move HAl startup to ASAP in setup()
|
||||
// - Fix DNOU8 output pin setup to all LOW
|
||||
// 4.2.40 - Automatically detect conflicting default I2C devices and disable
|
||||
// 4.2.39 - DFplayer driver now polls device to detect failures and errors.
|
||||
// 4.2.38 - Clean up compiler warning when IO_RotaryEncoder.h included
|
||||
@@ -70,6 +76,10 @@
|
||||
// 4.2.11 Exrail IFLOCO feature added
|
||||
// 4.2.10 SIGNAL/SIGNALH bug fix as they were inverted
|
||||
// IO_EXIOExpander.h input speed optimisation
|
||||
// ONCLOCK and ONCLOCKTIME command added to EXRAIL for EX-FastCLock
|
||||
// <JC> Serial command added for EX-FastClock
|
||||
// <jC> Broadcast added for EX-FastClock
|
||||
// IO_EXFastClock.h added for I2C FastClock connection
|
||||
// 4.2.9 duinoNodes support
|
||||
// 4.2.8 HIGHMEM (EXRAIL support beyond 64kb)
|
||||
// Withrottle connect/disconnect improvements
|
||||
|
Reference in New Issue
Block a user