A python package to deliver dashcam functionality using a Raspberry Pi.
This repository is now READ ONLY and UNSUPPORTED.
- various standard libraries
- python-camera
- python-gps
- python-rpi.gpio
- Raspberry Pi (I used a Model B+)
- Raspberry Pi Camera Module V2
- Adafruit Ultimate GPS breakout board connected using the UART on GPIO 14 and 15
- UPS PIco with 450mAh battery from ModMyPi. PICo uses GPIO 22 and 27
- Pi Camera HDMI extender from Tindie
- Two momentary push buttons
- Button A uses GPIO 23
- Button B uses GPIO 24
- One LED
- LED1 uses GPIO 16
- On startup, the camera starts recording to an in-memory buffer of configurable size (default 60s). The video stream is overlaid with current date-time, speed, location and direction of travel.
- LED1 flashes slowly whenever the camera is recording.
- If button A is pressed, the current contents of the buffer are flushed to a file, together with the following few seconds of video. (This can be used to capture the before and after of some event). The camera then goes back to recording into the buffer. LED1 flashes faster whilst the buffer is being saved.
- If button B is pressed, the current contents of the buffer are flushed to a file and recording stopped. LED1 is switched off.
- If button B is pressed again, recording is re-started from new and LED1 flashes slowly again.
- The UPS PIco ensures that recording can continue even if power has been lost (e.g. in a crash)
- In the background, Resilio Sync monitors the folder containing the h264 format video files. If the Pi is connected to my home Wi-Fi, Resilio syncs the contents of the folder to a Mac in the house.
- If the power if switched off (e.g. ignition is turned off) and the Pi is connected to Wi-Fi, the attached UPS keeps the Pi powered for long enough to allow the video files to be synced to my Mac. It then shuts the Pi down gracefully.
- On the Mac, Hazel is monitoring the sync folder. When it sees h264 format files appear, it moves them to another non-syncing folder and converts them to mpeg4 using ffmpeg. By moving the videos to another folder, the limited disk space on the Pi is preserved.
The code comprises an installed system daemon with four threads: 1. Main thread 2. Timer thread that is kicked off as needed 3. Camera thread 4. GPS thread
There are interrupt routines to handle the two buttons.
There are also Events to manage communications to and from the threads
Button A interrupt handler (notable event)
Start Timer thread
set flushBuffer flag on timeout
Button B interrupt handler (toggle recording)
If we are recording
flush the buffer immediately
clear the recording flag
Else
set the recording flag
EndIf
Camera thread
While shutdown flag is not set
While recording flag is set
Initialise Camera
start recording into buffer
While recording flag is set - inner recording loop
update annotation with current date-time, position and speed
If flushBuffer is set
flush buffer to new file
EndIf
EndWhile
wait for 1 second
EndWhile
Exit
GPS Thread
Initialise connection to gpsd
While shutdown flag is not set
add current GPS fix to inter-thread queue
Exit
Power failure
Start Timer thread
set shutdown Event on timeout
Main thread
Set the record flag
Kick off Camera thread
Kick off GPS thread
While shutdown flag is not set
wait for 1 second
While LAN is connected and there are videos in the sync folder
wait for 1 second
Kill threads
Initiate system shutdown
Exit