This project shows how the camera settings for this camera are adjusted using a mobile-responsive web page and then passed via JavaScript and WebSockets to a daemon written in C++ and then picked-up again by the camera. The settings themselves are described below in Interface Definition Language (IDL).
// IDL for Motion Camera Settings. namespace OV5642_Settings; table Settings { jpeg_size:uint8; quality:uint8; frames:uint8; light_mode:uint8; color_saturation:uint8; brightness:uint8; contrast:uint8; hue:uint8; effect:uint8; exposure:uint8; sharpness:uint8; mirror:uint8; test_pattern:uint8; } root_type Settings;If you plan to make changes to the IDL copy the above into a file named motion_camera_settings.fbs and follow the examples below. For more information about FLatBuffers see the reademe.md.
./flatc --cpp --force-empty --force-empty-vectors --gen-mutable -o interface/ motion_camera_settings.fbs ./flatc --js --force-empty --force-empty-vectors -o interface/ motion_camera_settings.fbs This camera project includes a trivial fork of the Google FlatBuffers project. I had to make one or two tiny changes in capitalization to get the project to compile in my case-sensitive operating system.
- Install libpoco on Ubuntu 20.04 (Focal Fossa)
sudo apt install libpoco-dev libpoco-doc libpocofoundation62 \ libpocojson62 libpoconet62 libpococrypto62 libpocodata62 \ libpocodatamysql62 libpocodataodbc62 libpocodatasqlite62 \ libpocoencodings62 libpocomongodb62 libpoconetssl62 libpocoredis62 \ libpocoutil62 libpocoxml62 libpocozip62
- Run
cmakein the usual way in the project root folder.
-1. Make a directory named camera_settings in your home directory.
-2. Copy the contents of the run directory from this project into it.
-3. Edit camera_settings.service to reflect your username, group, and the path to your home directory. Hint: read the comments.
-4. As root, copy camera_settings.service to /etc/systemd/system and enable the service:
sudo systemctl enable camera_settings.service Created symlink /etc/systemd/system/multi-user.target.wants/camera_settings.service → /etc/systemd/system/camera_settings.service.-5. Start the new service and check it's status.
sudo systemctl start camera_settings sudo systemctl status camera_settings ● camera_settings.service - 5MP Camera Settings Service Loaded: loaded (/etc/systemd/system/camera_settings.service; enabled; vendor preset: enabled) Active: active (exited) since Tue 2020-06-16 15:08:35 EDT; 8min ago Process: 3578 ExecStart=/home/patrick/camera_settings/camera_settings --daemon --pidfile camera_settings.pid (code=exited, status=0/SUCCES Main PID: 3578 (code=exited, status=0/SUCCESS) Tasks: 4 (limit: 4915) Memory: 996.0K CGroup: /system.slice/camera_settings.service └─3582 /home/patrick/camera_settings/camera_settings --daemon --pidfile camera_settings.pid Jun 16 15:08:35 raspi4 systemd[1]: Started 5MP Camera Settings Service.-6. Edit camera_settings.properties in $HOME/camera_settings and change path for the default_buffer and new_buffer properties to reflect your home directory path. While you're in there you can change the WebSocket port if desired. If you do, be sure to reflect the change in the platformio.ini for the camera. Change SOCKET_PORT to the same number.
WebSocketServer.port: 8880 WebSocketServer.default_buffer: /home/patrick/camera_settings/default_buffer.bin WebSocketServer.new_buffer: /home/patrick/camera_settings/new_buffer.binThe camera_settings binary has the ability to verify and compare the default and new buffers and report validity, matches and differences. This is helpful as a way to test that the web application is working as expected. In the following sample both buffers are valid but the frames setting has been incremented in the new buffer so they don't match.
./camera_settings --compare Comparing: /home/patrick/camera_settings/default_buffer.bin, /home/patrick/camera_settings/new_buffer.bin flatbuffers::VerifySettingsBuffer PASSED for default_buffer.bin flatbuffers::VerifySettingsBuffer PASSED for new_buffer.bin key default new match ------------------------------------------- jpeg_size 0 0 true quality 1 1 true frames 0 1 false light_mode 0 0 true color_saturation 4 4 true brightness 4 4 true effect 7 7 true contrast 4 4 true hue 6 6 true exposure 5 5 true sharpness 0 0 true mirror 7 7 true test_pattern 7 7 true Compare result: buffers DO NOT match. - Thank you to obiltschnig and the Poco Project Team for providing the example and library code from which the WebSocket server in this project is built.
- Thank you to the FlatBuffer contributors for the Google FlatBuffer project.
- Thank you to Vestride for the Fancy Index project from which I built the web page in this project.
If you find a bug please create an issue. If you'd like to contribute please send a pull request.
I used Doxygen to create the project documentation. You can read it here.
The following were helpful references in the development of this project.
