Skip to content

Instantly share code, notes, and snippets.

#if __has_include(<component-version.h>)
/* as invoked by Makefile, regardless of cmsis-atmel version */
#include <component-version.h>
#include <samd51.h>
#else
/* as invoked by a certain ide, in case people want to use it to test modules in isolation */
#include <samd51/include/component-version.h>
#include <samd51/include/samd51.h>
#endif
@rlcamp
rlcamp / configure
Last active February 1, 2024 20:38
#!/usr/bin/env bash
# richard campbell
# isc license
#
# assumptions/caveats:
# - this script is run by bash 3.2+, produces a Makefile suitable for gnu make 3.81+
# - targets to build have a main function in a .c file of the same name
# - each module depended upon is in the same directory
# - each module depended upon consists of one .c and one .h file
# - if you need to link in external libraries, you still need to manually provide those to make via LDLIBS
@rlcamp
rlcamp / one_interval_has_elapsed.c
Last active November 19, 2023 15:04
Blink without delay, but with the one_interval_has_elapsed() function in its own .c file, and with processor-specific sleep modes
#include "one_interval_has_elapsed.h"
#if defined(__AVR__)
#include <avr/power.h>
#if 1
/* avr using timer2 and SLEEP_MODE_PWR_SAVE, uses 400-800 uA at 3.3V depending on clock speed */
#include <avr/io.h>
@rlcamp
rlcamp / conflicts.sh
Last active November 4, 2023 04:40
find files in adjacent directories with the same filenames and different contents
#!/bin/sh
find . -type f \( -name '*.c' -o -name '*.h' -o -name '*.py' \) \
-not -name 'main*' \
-not -name '__init__.py' \
-not -name 'version.h' \
-not -name 'ViewController.h' \
-not -name 'AppDelegate.h' \
-not -name 'test.c' \
-not -name 'config.h' -exec cksum {} + |
@rlcamp
rlcamp / pending.sh
Last active November 3, 2023 17:03
list git repos with uncommitted or unpushed changes
#!/bin/sh
set -e
for repo in $(find . -mindepth 2 -type d -name '.git' | sed -e 's/\/.git//'); do
(cd $repo &&
git diff --exit-code HEAD &&
git log --decorate --oneline | head -n1 | grep origin
) 1>/dev/null || printf '"%s" has uncommitted or unpushed changes\n' $(basename $repo) >&2
done
@rlcamp
rlcamp / flock.pl
Last active October 30, 2023 15:54
calls flock(2) for various use cases, behaves like unix flock, python and perl implementations
#!/usr/bin/perl -w
use strict;
use Fcntl qw(:DEFAULT :flock);
if (!@ARGV) { die "Usage: $0 fd | { lockfile prog args }\n"; }
# get a filehandle to either the supplied filename or fd, depending on whether it is an integer
open(my $fh, $ARGV[0] =~ /^\d+$/ ? ">&=" : ">", $ARGV[0]) or die "cannot open: $!\n";
# flock the filehandle
/* allows c code to printf() within arduino sketches, given arm newlib or avr-libc */
#ifdef __arm__
/* TODO: proper check for newlib */
#ifdef USE_TINYUSB
#include <Adafruit_TinyUSB.h>
#endif
#include <Arduino.h>
extern "C"
@rlcamp
rlcamp / popen_generator.c
Last active October 18, 2023 04:57
demo of a three thread generator-style pipeline where the middle thread is a child process, with which communication happens via its stdin and stdout
/* demo of a three thread generator-style pipeline where the middle thread is a child process, with
which communication happens via its stdin and stdout */
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <pthread.h>
@rlcamp
rlcamp / plot_image_vs_time.py
Last active July 27, 2023 01:57
using matplotlib to plot data vs unix time with yaxis_date is ungoogleable
#!/usr/bin/env python3
import sys
import os
def plot_image_vs_time(data, timestamps, x0, dx, xlabel, title=None):
import datetime
try:
import numpy
#!/bin/bash
# campbell, 2022-2023
# Given a mesh of already-mutually-known peers, initially not fully connected with non-stale
# handshakes, this script will propagate knowledge of current endpoints to peers which need
# them, such that in the steady state, the network is fully-connected and will self-heal if
# an endpoint moves around.
# This conservative implementation requires that a peer already be known to wireguard in
# order to have its endpoint updated. No provision is made for having peers forward traffic