[{"content":"","date":"October 15, 2021","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","date":"October 15, 2021","externalUrl":null,"permalink":"/tags/electron/","section":"Tags","summary":"","title":"Electron","type":"tags"},{"content":"","date":"October 15, 2021","externalUrl":null,"permalink":"/categories/embedded-systems/","section":"Categories","summary":"","title":"Embedded Systems","type":"categories"},{"content":"I am Riccardo Dal Fiume. This website is my technical diary.\nI use it to document embedded, IoT, and software projects with implementation details, constraints, and trade-offs.\nThe focus is practical engineering: what worked, what did not, and why specific choices were made.\n","date":"October 15, 2021","externalUrl":null,"permalink":"/","section":"Engineering notes, shipped in public","summary":"I am Riccardo Dal Fiume. This website is my technical diary.\nI use it to document embedded, IoT, and software projects with implementation details, constraints, and trade-offs.\nThe focus is practical engineering: what worked, what did not, and why specific choices were made.\n","title":"Engineering notes, shipped in public","type":"page"},{"content":"","date":"October 15, 2021","externalUrl":null,"permalink":"/tags/environmental-monitoring/","section":"Tags","summary":"","title":"Environmental Monitoring","type":"tags"},{"content":"","date":"October 15, 2021","externalUrl":null,"permalink":"/tags/fluidics/","section":"Tags","summary":"","title":"Fluidics","type":"tags"},{"content":"","date":"October 15, 2021","externalUrl":null,"permalink":"/tags/freertos/","section":"Tags","summary":"","title":"FreeRTOS","type":"tags"},{"content":"","date":"October 15, 2021","externalUrl":null,"permalink":"/tags/mechatronics/","section":"Tags","summary":"","title":"Mechatronics","type":"tags"},{"content":"","date":"October 15, 2021","externalUrl":null,"permalink":"/posts/","section":"Posts","summary":"","title":"Posts","type":"posts"},{"content":"","date":"October 15, 2021","externalUrl":null,"permalink":"/tags/robotics/","section":"Tags","summary":"","title":"Robotics","type":"tags"},{"content":"Environmental monitoring is changing rapidly with unmanned aerial vehicles (UAVs). I worked on a specialized amphibious UAV platform built for georeferenced water sampling and real-time chemical analysis in rivers and open basins. The mechatronics, airframe, and much of the onboard electronics were developed by others; my contribution was focused on ground-side software and on how the embedded stack should be structured.\nThe Amphibious Mechatronic Challenge # Unlike camera-only drones, this UAV had to land on water, operate against river currents up to 2 m/s, and interact with the environment physically.\nThe platform centered on an IP43-rated 8-rotor coaxial drone with a custom dual-board payload on ARM Cortex-M4 MCUs:\nMain Board: point-to-point 2.4 GHz datalink to the ground station, telemetry logging, and Dead Reckoning with a dedicated IMU/GNSS for position and attitude when GPS was degraded or lost. Slave Board: mechatronic control of the sampling framework over an RS485 field bus. Robotic Arms and Fluidics (System Context) # The vehicle carried a motorized pantograph arm to lower a multi-parameter water probe (pH, dissolved oxygen, turbidity, and more) to about 1.25 m below the surface, mechanically compensating for pitch while floating so the probe stayed vertical.\nFor deeper water, an automated winch could lower a Van Dorn bottle to about 30 m, with servo messenger release and a thermal wire-cutting fail-safe for entanglement. An onboard fluidic path (micro-pump, flow meter, solenoid manifold) supported rinsing (\u0026ldquo;avvinamento\u0026rdquo;) before filling onboard vessels to limit cross-contamination.\nThat complexity sat outside my direct design work; it is the context in which the tools I built had to operate reliably.\nWhat I Built: Electron, Vue.js, and Serial Control # I designed and implemented a desktop application with Electron and Vue.js that talked to the hardware over a serial link. Operators used it to:\ndefine and generate acquisition plans (how and when sampling should run), and send commands to the drone\u0026rsquo;s pantograph and related acquisition workflow. The app was the operator-facing bridge between mission intent and the mechatronic payload, not the flight stack itself.\nRTOS Architecture: Definition vs Implementation # I also defined the software architecture for the onboard firmware around an RTOS—FreeRTOS in this project—including how tasks, communication, and timing boundaries should be split so flight-adjacent logic, sampling, and I/O could coexist predictably.\nThe actual FreeRTOS-based implementation was carried out by a third-party team; my role was architectural specification and alignment with the ground tool and serial protocol.\nOutcome # The result, as a system, was flight dynamics, robotics, and fluidics working together for automated environmental workflows. On my side, the deliverable was clear ground tooling and a documented RTOS-shaped architecture that another group could implement without ambiguity.\n","date":"October 15, 2021","externalUrl":null,"permalink":"/posts/uav-environmental-sampling/","section":"Posts","summary":"Environmental monitoring is changing rapidly with unmanned aerial vehicles (UAVs). I worked on a specialized amphibious UAV platform built for georeferenced water sampling and real-time chemical analysis in rivers and open basins. The mechatronics, airframe, and much of the onboard electronics were developed by others; my contribution was focused on ground-side software and on how the embedded stack should be structured.\nThe Amphibious Mechatronic Challenge # Unlike camera-only drones, this UAV had to land on water, operate against river currents up to 2 m/s, and interact with the environment physically.\n","title":"Sky-High Data: Architecting a Mechatronic System for Environmental UAVs","type":"posts"},{"content":"","date":"October 15, 2021","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"","date":"October 15, 2021","externalUrl":null,"permalink":"/tags/uav/","section":"Tags","summary":"","title":"UAV","type":"tags"},{"content":"","date":"October 15, 2021","externalUrl":null,"permalink":"/tags/vue.js/","section":"Tags","summary":"","title":"Vue.js","type":"tags"},{"content":"","date":"September 20, 2021","externalUrl":null,"permalink":"/tags/calendar/","section":"Tags","summary":"","title":"Calendar","type":"tags"},{"content":"Consulting and project work often live in the calendar first: blocks for clients, meetings, and focus time. Turning that into a timesheet or a billing summary usually means retyping or awkward copy-paste from Google Calendar, Outlook, or Apple Calendar into a spreadsheet. Exporting iCalendar (.ics) is built into most of those products; the missing piece is a lightweight way to reshape that export into tabular data you can sum and attach to an invoice.\nCalTS (Calendar TimeSheet) is a small tool I built for that workflow: parse an .ics file in the browser, inspect and filter events, then copy the visible rows to the clipboard for Excel, LibreOffice, or whatever you use downstream.\nWhy client-side only # The calendar file often contains meeting titles, attendee hints, and locations—data you may not want on a random SaaS backend. CalTS runs entirely in the browser: you choose a file, parsing happens with JavaScript, and nothing is sent to a server. The trade-off is obvious: you need a modern browser and you are limited by local memory if someone hands you a multi-year, high-volume export. For typical monthly or quarterly slices, that has never been a problem in practice.\nWhat it does # Parse standard .ics files using ical.js (Mozilla’s parser, battle-tested on real-world feeds). Filter by a start and end date before you even think about exporting. Search across the loaded events so you can narrow by client code in the title, project name, or any text field you keep in summaries. Show durations so you can sanity-check blocks against what you remember billing. Export the currently visible (filtered) rows to the clipboard as tab-separated values—paste once into a sheet and you are done. The UI is built with Vue 3 (Composition API), TypeScript, Vite, and Vuetify 3 for a dense data table without reinventing grids and date pickers. That stack was chosen for fast iteration and predictable typing around parsed event objects, not for novelty.\nTypical workflow # Export your calendar (or the relevant sub-calendar) to an .ics file from your provider’s UI. Open the live app, choose the file, set the date range, and click Parse. Refine with the search box until the table matches what you want on the timesheet. Copy visible events to clipboard and paste into your spreadsheet; add rates or project columns there if your process needs them. If your organization blocks clipboard APIs in locked-down browsers, try a normal desktop profile—the app does not require installation.\nLimits and expectations # iCalendar is a flexible format; recurring events, time zones, and all-day entries behave differently across calendar apps. CalTS is a practical extractor, not a full calendaring engine: after a big import, spot-check a few rows (especially around daylight-saving boundaries and all-day vs timed events) before you treat the sheet as authoritative for billing.\nSource and demo # GitLab repository — build instructions, npm run dev / npm run build, ESLint setup. Live webapp — static hosting on GitLab Pages. ","date":"September 20, 2021","externalUrl":null,"permalink":"/posts/extract-timesheet-from-ical/","section":"Posts","summary":"Consulting and project work often live in the calendar first: blocks for clients, meetings, and focus time. Turning that into a timesheet or a billing summary usually means retyping or awkward copy-paste from Google Calendar, Outlook, or Apple Calendar into a spreadsheet. Exporting iCalendar (.ics) is built into most of those products; the missing piece is a lightweight way to reshape that export into tabular data you can sum and attach to an invoice.\n","title":"Extract timesheet from iCal","type":"posts"},{"content":"","date":"September 20, 2021","externalUrl":null,"permalink":"/tags/privacy/","section":"Tags","summary":"","title":"Privacy","type":"tags"},{"content":"","date":"September 20, 2021","externalUrl":null,"permalink":"/tags/productivity/","section":"Tags","summary":"","title":"Productivity","type":"tags"},{"content":"","date":"September 20, 2021","externalUrl":null,"permalink":"/tags/timesheet/","section":"Tags","summary":"","title":"Timesheet","type":"tags"},{"content":"","date":"September 20, 2021","externalUrl":null,"permalink":"/categories/tools/","section":"Categories","summary":"","title":"Tools","type":"categories"},{"content":"","date":"September 20, 2021","externalUrl":null,"permalink":"/tags/typescript/","section":"Tags","summary":"","title":"TypeScript","type":"tags"},{"content":"","date":"September 20, 2021","externalUrl":null,"permalink":"/tags/vite/","section":"Tags","summary":"","title":"Vite","type":"tags"},{"content":"","date":"September 19, 2021","externalUrl":null,"permalink":"/tags/automation/","section":"Tags","summary":"","title":"Automation","type":"tags"},{"content":"","date":"September 19, 2021","externalUrl":null,"permalink":"/tags/embedded-development/","section":"Tags","summary":"","title":"Embedded Development","type":"tags"},{"content":"","date":"September 19, 2021","externalUrl":null,"permalink":"/tags/gitlab-ci/cd/","section":"Tags","summary":"","title":"GitLab CI/CD","type":"tags"},{"content":"This is a practical setup I use to build Keil uVision projects automatically with GitLab CI/CD.\nThe goal is simple: every commit should produce a reproducible firmware build, with logs and binaries attached as artifacts.\nIf you work on embedded systems, this gives you fast feedback on broken builds and avoids \u0026ldquo;works on my machine\u0026rdquo; problems.\nPrerequisites # Before creating the pipeline, ensure:\nA Windows GitLab Runner is available and tagged (for example windows). Keil MDK / uVision is installed on the runner. The runner service account can access UV4.exe. Your project can already build from uVision command line. Keil command-line reference:\nuVision command-line options\nWhy this pipeline layout # The original approach works, but repeating the same PowerShell logic across Debug and Release jobs becomes hard to maintain.\nThis version uses:\none reusable template job (.keil_build_template) one variable (UVISION_TARGET) to switch target explicit artifact collection readable mapping of Keil exit codes Example .gitlab-ci.yml # \u0026nbsp; YAML stages: - build variables: GIT_SUBMODULE_STRATEGY: recursive UV4_PATH: \u0026#34;C:\\\\Keil_v5\\\\UV4\\\\UV4.exe\u0026#34; UV_PROJ: \u0026#34;.\\\\projectname.uvprojx\u0026#34; BUILD_LOG: \u0026#34;.\\\\Objects\\\\build.log\u0026#34; .keil_build_template: stage: build tags: - windows script: - | \u0026amp; \u0026#34;$env:UV4_PATH\u0026#34; -crb \u0026#34;$env:UV_PROJ\u0026#34; -t\u0026#34;$env:UVISION_TARGET\u0026#34; -o \u0026#34;$env:BUILD_LOG\u0026#34; -sg -j0 | Out-Null $code = $LASTEXITCODE switch ($code) { 0 { Write-Host \u0026#34;No errors or warnings\u0026#34;; exit 0 } 1 { Write-Host \u0026#34;Warnings only\u0026#34;; exit 0 } 2 { Write-Host \u0026#34;Build errors\u0026#34;; exit 2 } 3 { Write-Host \u0026#34;Fatal build errors\u0026#34;; exit 3 } 11 { Write-Host \u0026#34;Cannot open project file for writing\u0026#34;; exit 11 } 12 { Write-Host \u0026#34;Device not found in database\u0026#34;; exit 12 } 13 { Write-Host \u0026#34;Error writing project file\u0026#34;; exit 13 } 15 { Write-Host \u0026#34;Error reading import XML file\u0026#34;; exit 15 } 20 { Write-Host \u0026#34;Project conversion error\u0026#34;; exit 20 } default { Write-Host \u0026#34;Unknown uVision exit code: $code\u0026#34; exit $code } } after_script: - if (Test-Path \u0026#34;$env:BUILD_LOG\u0026#34;) { Get-Content \u0026#34;$env:BUILD_LOG\u0026#34; -Tail 20 } artifacts: when: always expire_in: 14 days paths: - Objects/*.hex - Objects/*.axf - Objects/*.htm - Objects/*.log - Listings/*.map build_debug: extends: .keil_build_template variables: UVISION_TARGET: \u0026#34;Debug\u0026#34; build_release: extends: .keil_build_template variables: UVISION_TARGET: \u0026#34;Release\u0026#34; Notes on exit-code policy # In this setup, exit code 1 (\u0026ldquo;warnings only\u0026rdquo;) is treated as success.\nThat is intentional when warnings are acceptable in your process.\nIf you want a stricter gate, change:\n1 { Write-Host \u0026quot;Warnings only\u0026quot;; exit 0 } to:\n1 { Write-Host \u0026quot;Warnings only\u0026quot;; exit 1 } and the job will fail on warnings.\nCommon issues on self-hosted Windows runners # Runner cannot find UV4.exe: check installation path and permissions for the runner service account. License or pack problems: verify the runner machine has a valid MDK setup and required device packs. Project path issues: use quoted paths and avoid assumptions about current working directory. Artifacts missing: confirm output folder names (Objects, Listings) match your project settings. Suggested next improvements # Once the basic build is stable, useful extensions are:\nadd a test stage for host-side unit tests (if available) publish firmware binaries with semantic version names add a release job triggered by tags archive build metadata (commit, toolchain version, timestamp) This keeps the pipeline simple while making embedded firmware builds more traceable and repeatable.\n","date":"September 19, 2021","externalUrl":null,"permalink":"/posts/gitlab-ci-cd-pipeline-for-keil-uvision/","section":"Posts","summary":"This is a practical setup I use to build Keil uVision projects automatically with GitLab CI/CD.\nThe goal is simple: every commit should produce a reproducible firmware build, with logs and binaries attached as artifacts.\nIf you work on embedded systems, this gives you fast feedback on broken builds and avoids “works on my machine” problems.\nPrerequisites # Before creating the pipeline, ensure:\n","title":"GitLab CI/CD pipeline for Keil uVision","type":"posts"},{"content":"","date":"September 19, 2021","externalUrl":null,"permalink":"/tags/keil-uvision/","section":"Tags","summary":"","title":"Keil UVision","type":"tags"},{"content":"","date":"September 19, 2021","externalUrl":null,"permalink":"/tags/powershell/","section":"Tags","summary":"","title":"PowerShell","type":"tags"},{"content":"Direct contact pages.\n","externalUrl":null,"permalink":"/contacts/","section":"Contacts","summary":"Direct contact pages.\n","title":"Contacts","type":"contacts"},{"content":" Back to contacts CONTACTS\nRiccardo Dal Fiume Use this page to save my contact card or reach out directly.\nContact\nMobile +39 338 5390822 Website dalfiume.io Email Reveal PEC Reveal Download contact (.vcf) Billing details\nP.IVA IT03186761205 CF DLFRCR91P08C265K SDI M5UXCR1 ","externalUrl":null,"permalink":"/contacts/riccardodalfiume/","section":"Contacts","summary":" Back to contacts CONTACTS\nRiccardo Dal Fiume Use this page to save my contact card or reach out directly.\nContact\nMobile +39 338 5390822 Website dalfiume.io Email Reveal PEC Reveal Download contact (.vcf) Billing details\nP.IVA IT03186761205 CF DLFRCR91P08C265K SDI M5UXCR1 ","title":"Riccardo Dal Fiume","type":"contacts"}]