Enabling Case Sensitivity in Windows

I recently needed to download a large number of files from a Linux server using SCP, which would take nearly 12 hours. When i checked the next day this transfer had stopped to ask if I wanted to overwrite a file. This was because two files had the same name, differing only in case.

I remembered there was a registry setting that could set the NTFS filesystem to be case sensitive[0], but I’d rather not do that on this workstation. I did a Google search anyway, but then I found there is a newer way to do this which is on a per-folder basis instead of globally[1].

There is a command called “fsutil.exe” that can adjust a lot of filesystem settings, one of them is “SetCaseSensitiveInfo”, which controls if the folder is case sensitive or not.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
fsutil.exe file SetCaseSensitiveInfo C:\folder enable
fsutil.exe file SetCaseSensitiveInfo C:\folder enable
fsutil.exe file SetCaseSensitiveInfo C:\folder enable

When I restarted the download, it still didn’t work, because that command only applies it to the specified folder, and any new folders created after. It does not apply to existing sub-folders. The following PowerShell command will apply the setting to any existing folder.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Get-ChildItem C:\folder -Recurse |
? {$_.PSIsContainer} |
% { fsutil.exe file SetCaseSensitiveInfo $_.FullName enable }
Get-ChildItem C:\folder -Recurse | ? {$_.PSIsContainer} | % { fsutil.exe file SetCaseSensitiveInfo $_.FullName enable }
Get-ChildItem C:\folder -Recurse | 
	? {$_.PSIsContainer} |
	% { fsutil.exe file SetCaseSensitiveInfo $_.FullName enable }

References

[0] https://superuser.com/questions/266110/how-do-you-make-windows-7-fully-case-sensitive-with-respect-to-the-filesystem

[1] https://docs.microsoft.com/en-us/windows/wsl/case-sensitivity

     

Stopping “No Disk” Error Pop-up In Windows

While working on a project that used the Microchip C18 compiler I got this error message:-

If I clicked “Continue” it would appear again instantly, and this kept going dozens of times, the compile worked fine but the error message was very annoying. The drive in question was a partition on my main hard disk, it was not a removable drive!

After a bit of research I found out how to suppress the error message by modifying the system registry. Below is an example of the .reg file I created.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows]
"ErrorMode"=dword:00000002
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows] "ErrorMode"=dword:00000002
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows]
"ErrorMode"=dword:00000002

This will disable all application and system error pop-ups, which may not be what you want so what I did is create two reg files, on disables the errors, the other enables the errors. This means I can temporarily disable the errors when I want.

For more information on this see this Microsoft support page.

WARNING! Modifying your system registry could be dangerous, proceed with caution. I am not responsible for any damage you cause to your system!

I recommend creating a system restore point before making any modifications to the system registry.

   

Changing File Permissions in Cygwin (Windows 8)

I tried to change the permissions of my ssh private/public keys in the .ssh directory under Cygwin on Windows 8 and it didn’t work. This seems to be a bug in Cygwin but there is a work around that I found through SuperUser.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
chgrp -R Users ~/.ssh
chgrp -R Users ~/.ssh
chgrp -R Users ~/.ssh

Now all you need to do is run the chmod commands as usual and all should work.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
chmod 644 id_rsa.pub
chmod 600 id_rsa
chmod 644 id_rsa.pub chmod 600 id_rsa
 chmod 644 id_rsa.pub
 chmod 600 id_rsa
     

Handling SIGUSR1 in GDB

I was debugging a project that used SIGUSR1 heavily, GDB stops on SIGUSR1 by default and it was making debugging a pain when I didn’t care when the signal was being generated. So here is now to set how GDB interprets signals.

By entering the following into the GDB prompt you can instruct it to not print, or stop when the signal happens and to pass it to the program.

handle SIGUSR1 nostop noprint pass

     

Extracting Audio From MP4 Videos

I’ve been asked to help someone create a device that can play steam train whistle sounds when a button is pressed. I was given a load of MP4 video files with recordings of the whistles.

First I wanted to rename them because they all had a “Prj ” prefix on them. The code snippet below is what I used to remove the prefix from the file names.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
for file in *.mp4 ;
do
mv "$file" $(echo "$file" | sed 's/Prj //')
done
for file in *.mp4 ; do mv "$file" $(echo "$file" | sed 's/Prj //') done
for file in *.mp4 ;
do
    mv "$file" $(echo "$file" | sed 's/Prj //')
done

The next thing to do is extract the audio from all the videos. FFMPEG is perfect for this. The Bash code below will extract the audio from all of the MP4 files in a directory.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
for file in *.mp4 ;
do
ffmpeg -i $file -map 0:1 -acodec pcm_s16le -ac 2 ${file/.mp4/.wav}
done
for file in *.mp4 ; do ffmpeg -i $file -map 0:1 -acodec pcm_s16le -ac 2 ${file/.mp4/.wav} done
for file in *.mp4 ;
do
    ffmpeg -i $file -map 0:1 -acodec pcm_s16le -ac 2 ${file/.mp4/.wav}
done

Now that I’ve got the audio files I need to open them in Audacity and edit them, that is something I can’t automate unfortunately 😢

         

Reading the Current Temperature of Raspberry Pi SoC

To measure the Raspberry Pi’s core temperature run the following command in the terminal.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
/opt/vc/bin/vcgencmd measure_temp
/opt/vc/bin/vcgencmd measure_temp
/opt/vc/bin/vcgencmd measure_temp

This is very helpful when putting your Pi into a case as you can make sure it is not getting too hot, especially when over-clocking.

   

Contolling the CPU Governor in Linux

Recently I wondered how you control CPU throttling in GNU/Linux systems so after doing a little research this script is what I’ve come up with. It’s based on some others that I’ve come across. All it does is set the CPU throttling mode to “performance” then displays the current CPU frequency setting, which should be full speed.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#!/bin/sh
for CPUGOV in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
do
echo -n performance > $CPUGOV;
done
# Display Stats about new settings
grep -E '^model name' /proc/cpuinfo | head -n 1
for CPUFREQ in /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq
do
cat $CPUFREQ | awk '{ print $1 / 1e6 "GHz"; }'
done
exit 0
#!/bin/sh for CPUGOV in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor do echo -n performance > $CPUGOV; done # Display Stats about new settings grep -E '^model name' /proc/cpuinfo | head -n 1 for CPUFREQ in /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq do cat $CPUFREQ | awk '{ print $1 / 1e6 "GHz"; }' done exit 0
#!/bin/sh
for CPUGOV in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
do
    echo -n performance > $CPUGOV;
done
 
# Display Stats about new settings
grep -E '^model name' /proc/cpuinfo | head -n 1
for CPUFREQ in /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq
do
    cat  $CPUFREQ | awk '{ print $1 / 1e6 "GHz"; }'
done
 
exit 0
     

A Switch Debouncing Method

There are a lot of different methods used to debounce switch inputs and this post is just about one method that I read about recently and used a couple of times now. So far it seems pretty good and does the job.

The C code for this method is just below, I defined it as a macro so I can use it for multiple switch inputs. All you need to do is execute this code at a fixed sample rate and it will do the rest.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
if( input == OFF ) {
if( integrator > 0 ) {
integrator--;
}
} else if( integrator < PERIOD ) {
integrator++;
}
if( integrator == 0 ) {
output = OFF;
} else if( integrator >= PERIOD ) {
output = ON;
integrator = PERIOD;
}
if( input == OFF ) { if( integrator > 0 ) { integrator--; } } else if( integrator < PERIOD ) { integrator++; } if( integrator == 0 ) { output = OFF; } else if( integrator >= PERIOD ) { output = ON; integrator = PERIOD; }
if( input == OFF ) {
    if( integrator > 0 ) {
        integrator--;
    }
} else if( integrator < PERIOD ) {
    integrator++;
}
 
if( integrator == 0 ) {
    output = OFF;
} else if( integrator >= PERIOD ) {
    output = ON;
    integrator = PERIOD;
}

What this basically does is average samples. When the input is high the “integrator” counts up until it reaches the PERIOD constant. Then it sets the output high and also saturates the integrator to the value of PERIOD. When the input is low the integrator counts down until it reaches 0 when it sets the output low.

I cant remember where I found this method, I believe the link is somewhere on Jack Ganssle’s website. He also has a good tutorial on switch debouncing.

       

Creating an IO Assignment Header File

When developing embedded firmware I like to define macros that provide aliases for the IO port registers that I need. The name of each of the macros will correspond to the net name on the schematic to make it easy to check for errors. I put all of these macros into a single header file that I can include, I have sometimes seen these called board support packages. They can sometime be entire libraries that abstract details of the hardware. In my case they are just simple header files as that is all I need for now.

Recently I decided to automate some of the work of creating these files as it can be very time consuming. This is the Awk script I ended up with.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#!/usr/bin/awk -f
{
if ($0 == "") next;
if ($2 == "PORTA") { port = "A"; }
if ($2 == "PORTB") { port = "B"; }
if ($2 == "PORTC") { port = "C"; }
if ($2 == "PORTD") { port = "D"; }
if ($2 == "PORTE") { port = "E"; }
if ($2 == "PORTF") { port = "F"; }
if ($2 == "PORTG") { port = "G"; }
print "#define " $1 "_PIN " $3;
print "#define " $1 "_TRIS TRIS" port "bits.TRIS" port $3;
print "#define " $1 "_LAT LAT" port "bits.LAT" port $3;
print "#define " $1 "_PORT PORT" port "bits.R" port $3;
print "";
}
#!/usr/bin/awk -f { if ($0 == "") next; if ($2 == "PORTA") { port = "A"; } if ($2 == "PORTB") { port = "B"; } if ($2 == "PORTC") { port = "C"; } if ($2 == "PORTD") { port = "D"; } if ($2 == "PORTE") { port = "E"; } if ($2 == "PORTF") { port = "F"; } if ($2 == "PORTG") { port = "G"; } print "#define " $1 "_PIN " $3; print "#define " $1 "_TRIS TRIS" port "bits.TRIS" port $3; print "#define " $1 "_LAT LAT" port "bits.LAT" port $3; print "#define " $1 "_PORT PORT" port "bits.R" port $3; print ""; }
#!/usr/bin/awk -f
{
    if ($0 == "") next;
 
    if ($2 == "PORTA") { port = "A"; }
    if ($2 == "PORTB") { port = "B"; }
    if ($2 == "PORTC") { port = "C"; }
    if ($2 == "PORTD") { port = "D"; }
    if ($2 == "PORTE") { port = "E"; }
    if ($2 == "PORTF") { port = "F"; }
    if ($2 == "PORTG") { port = "G"; }
 
    print "#define " $1 "_PIN " $3;
    print "#define " $1 "_TRIS TRIS" port "bits.TRIS" port $3;
    print "#define " $1 "_LAT LAT" port "bits.LAT" port $3;
    print "#define " $1 "_PORT PORT" port "bits.R" port $3;
    print "";
}

All I need to do is write a space separated file in which each line contains the name I want, the port it is on and the number of the pin that it is attached to. Then this simple script generates the C code. This was for a PIC24F series micro, I have a slightly different script for a project involving a PIC32 which I may post later.

This makes creating BSP header files really easy, especially if you need to modify the pin assignments!

       

Profiling Python Applications

I’ve been working on a project that’s written in Python, it continuously communicates with some external industrial equipment. It will poll the status of this equipment 4 times per second and also sends commands to them when requested to. My job this week was to raise the update rate to 5Hz…. I needed to make sure I had enough time to do this!

I decided before doing anything I should profile the code to find out how much time the main loop needs to run and what methods take the longest time. That way I’d know if the code can support 5Hz and if not what I can do about it.

Once again the Python standard library comes to the rescue, the cProfile module will monitor the execution of your program and generate a report. Below is an example of how to use it.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
import cProfile
cProfile.run("main()")
import cProfile cProfile.run("main()")
import cProfile
cProfile.run("main()")

The next thing I did is write a simple bit of code that will print to stdout the current update rate of my application every second. It’s pretty much a Python port of the JavaScript library stats.js.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
from __future__ import division
import time
class stats(object):
def __init__(self):
self.msMin = 1000
self.msMax = 0
self.msTime = 0
self.fpsMin = 1000
self.fpsMax = 0
self.fps = 0;
self.updates = 0
self.startTime = int((time.time()+0.5)*1000)
self.prevTime = int((time.time()+0.5)*1000)
def begin(self):
"""Calling the method signifies the start of a frame
"""
self.startTime = int((time.time()+0.5)*1000)
def end(self):
"""Calling this method signifies the end of a frame
"""
now = int((time.time()+0.5)*1000)
self.msTime = now-self.startTime
self.msMax = max(self.msMax, self.msTime)
self.msMin = min(self.msMin, self.msTime)
#print "ms: %i (%i - %i)" % (self.msTime, self.msMin, self.msMax)
self.updates = self.updates + 1
if now > (self.prevTime + 1000.0):
self.fps = round((self.updates*1000.0)/float(now-self.prevTime))
self.fpsMax = max(self.fpsMax, self.fps)
self.fpsMin = min(self.fpsMin, self.fps)
print "stats: %i fps (%.i fps - %i fps)" % (self.fps, self.fpsMin, self.fpsMax)
self.prevTime = now
self.updates = 0
return now
def update(self):
self.startTime = self.end()
from __future__ import division import time class stats(object): def __init__(self): self.msMin = 1000 self.msMax = 0 self.msTime = 0 self.fpsMin = 1000 self.fpsMax = 0 self.fps = 0; self.updates = 0 self.startTime = int((time.time()+0.5)*1000) self.prevTime = int((time.time()+0.5)*1000) def begin(self): """Calling the method signifies the start of a frame """ self.startTime = int((time.time()+0.5)*1000) def end(self): """Calling this method signifies the end of a frame """ now = int((time.time()+0.5)*1000) self.msTime = now-self.startTime self.msMax = max(self.msMax, self.msTime) self.msMin = min(self.msMin, self.msTime) #print "ms: %i (%i - %i)" % (self.msTime, self.msMin, self.msMax) self.updates = self.updates + 1 if now > (self.prevTime + 1000.0): self.fps = round((self.updates*1000.0)/float(now-self.prevTime)) self.fpsMax = max(self.fpsMax, self.fps) self.fpsMin = min(self.fpsMin, self.fps) print "stats: %i fps (%.i fps - %i fps)" % (self.fps, self.fpsMin, self.fpsMax) self.prevTime = now self.updates = 0 return now def update(self): self.startTime = self.end()
from __future__ import division
import time

class stats(object):
    def __init__(self):
        self.msMin = 1000
        self.msMax = 0
        self.msTime = 0
        self.fpsMin = 1000
        self.fpsMax = 0
        self.fps = 0;
        self.updates = 0
        self.startTime = int((time.time()+0.5)*1000)
        self.prevTime = int((time.time()+0.5)*1000)

    def begin(self):
        """Calling the method signifies the start of a frame
        """
        self.startTime = int((time.time()+0.5)*1000)

    def end(self):
        """Calling this method signifies the end of a frame
        """
        now = int((time.time()+0.5)*1000)

        self.msTime = now-self.startTime
        self.msMax = max(self.msMax, self.msTime)
        self.msMin = min(self.msMin, self.msTime)

        #print "ms: %i (%i - %i)" % (self.msTime, self.msMin, self.msMax)

        self.updates = self.updates + 1

        if now > (self.prevTime + 1000.0):
            self.fps = round((self.updates*1000.0)/float(now-self.prevTime))
            self.fpsMax = max(self.fpsMax, self.fps)
            self.fpsMin = min(self.fpsMin, self.fps)

            print "stats: %i fps (%.i fps - %i fps)" % (self.fps, self.fpsMin, self.fpsMax)

            self.prevTime = now
            self.updates = 0

        return now

        def update(self):
            self.startTime = self.end()

Simply add a call to begin() to the start of your loop and a corresponding call to end()  at the end of your loop. Now I get a nice counter that tells me how the code is performing. As I work on the code I can see how this affects the main loop performance.