Saturday, 26 January 2019

Scripts with PSoC Creator (Powershell)

Summary
In a previous post, command line scripting was used to increment the build number for a PSoC Creator Project. The option to use command line 'cscript.exe' remains supported in Windows 10 although other scripting systems have made significant ingress into the corners of build scripts. This blog illustrates a quick alternative by using trusty PowerShell.

Why PowerShell
In companies where software deployment on desktop machines is not micromanaged, PowerShell can be a useful tools for scripting. Certainly Perl, Ruby, JavaScript or similar languages should not be excluded by IT support or software developers. PowerShell is offered for scripting with PSoC Creator as it is been available from Microsoft since 2006 and therefore available on the Windows operating system.

This blog will look only at Windows machines with PSoC Creator and not attempt to review the impact of scripts with virtual machines.

Example Scripts
The two scripts detailed in the sections below perform the action of copying a 'hex' file to a release directory in a parent folder. For the purposes of illustration the HelloWorld_Blinky program was used from the PSoC Creator examples.


PSoC Creator Hello World Blinky Example
PSoC Creator Hello World Blinky Example

Cscript

The example script below uses the File System Object with a few methods to copy the output file to another folder. If the release folder does not exist then it is first created. 

REM Release Directory Example for PSoC Creator

REM Setup file system access
Set fso = CreateObject("Scripting.FileSystemObject")

REM Setup operating parameters
ProjectMainFolder=fso.GetAbsolutePathName(".")
ReleaseMainFolder=fso.GetParentFolderName(ProjectMainFolder)
ReleasePath = ReleaseMainFolder & "\Release\"
SourceFile = ProjectMainFolder & "\DP8051_Keil_951\Release\*.hex"

Sub Create_Folder(intReleasePath)
 If fso.FolderExists(ReleasePath) Then
  WScript.Echo ("Folder exists...skipping")
 Else
  fso.CreateFolder(ReleasePath) 
  WScript.Echo ("Folder created")
 End If
End Sub

Sub Copy_File(intReleasePath)
 fso.CopyFile SourceFile,intReleasePath
End Sub

REM Duplicating required files
WScript.Echo ("Duplicating files at:" & ReleasePath &vbCrLf)
Create_Folder(ReleasePath)
Copy_File(ReleasePath)
WScript.Echo ("Completed")


The script ReleaseDirectory.vbs is copied to the PSoC projects directory HelloWorld_Blinky.cydsn. A modification is made in the PSoC Creator project to the Build Settings under the Project menu. For this example the call, cscript ReleaseDirectory.vbs is placed in the post build section.


PSoC Creator Post Build Cscript
PSoC Creator Post Build Cscript
After the change above to the build settings the Hello World project is built resulting in the output below.


PSoC Creator Post Build Cscript in Output Window
PSoC Creator Post Build Cscript in Output Window

The Output window shown above details the creation of the folder and completion of the file copy.

PowerShell
The example script below uses PowerShell commands to achieve the same functionality as the above Cscript. As this is for illustrative purposes only the operation of the two scripts may not be exact.

' Release Directory Example for PSoC Creator '

' Setup operating parameters '
$ProjectMainFolder=(Get-Item -Path ".\").FullName
$ReleaseMainFolder=(Get-Item -Path ".\").parent.FullName
$ReleasePath=$ReleaseMainFolder+’\Release\’
$SourceFile = $ProjectMainFolder+'\DP8051_Keil_951\Release\*.hex'

function Create_Folder($intReleasePath)
{
    if((Test-Path -Path $intReleasePath )){
        Write-Output "Folder exists...skipping";
    }

    if(!(Test-Path -Path $intReleasePath )){
        New-Item -ItemType directory -Path $intReleasePath
        Write-Output "Folder created";
    }
}


function Copy_File($intReleasePath)
{
 Copy-Item $SourceFile -Destination $intReleasePath
}

Write-Output "Duplicating files at:"
Write-Output $ReleasePath
Create_Folder($ReleasePath)
Copy_File($ReleasePath)


Similar to the previous example, the script ReleaseDirectory.ps1 is copied to the PSoC projects directory HelloWorld_Blinky.cydsn. In addition to calling the PowerShell script a parameter is passed to bypass the execution policy, PowerShell -executionpolicy bypass -File ReleaseDirectory.ps1

For this example the call is again placed in the post build section.


PSoC Creator Post Build Powershell
PSoC Creator Post Build Powershell

After the change above to the build settings the Hello World project is built resulting in the output below.

PSoC Creator Post Build PowerShell in Output Window
PSoC Creator Post Build PowerShell in Output Window
In the event that the policy to execute the PowerShell script was not allowed a security error message will be shown in the output window.

PSoC Creator Post Build PowerShell Error in Output Window
PSoC Creator Post Build PowerShell Error in Output Window
The execution policy can be checked using PowerShell ISE and amended with due consideration for local machine security and safety.

PowerShell Execution Policy
PowerShell Execution Policy
As a side note, some virus or firewall software may detect the invoked script as a potential threat, see the Comodo exception shown below. Exclusions should be made for these scripts only.


Comodo HIPS Alert Script in PSoC Creator
Comodo HIPS Alert Script in PSoC Creator

Downloads
The downloads available below use the PSoC Creator 4.2 with projects saved as a minimal archive.


Hello Blinky PSoC Creator 4.2 Project
Hello Blinky PSoC Creator 4.2 Project
ReleaseDirectory.vbs
ReleaseDirectory.vbs
ReleaseDirectory.ps1
ReleaseDirectory.ps1