Generate and decode binary barcodes over TTL signals to synchronize multiple data acquisition systems.
→ Full documentation Barcodes encode a timestamp or random value as a sequence of timed HIGH/LOW pulses, transmittable over any digital output.
from ttl_barcoder.core import BarcodeTTL, BarcodeConfig, TTLType, TimestampPrecision
# Timestamp barcode (default) — encodes current time at ms precision
barcoder = BarcodeTTL()
sequence = barcoder.get_sequence() # [(level: bool, duration_ms: float), ...]
# Random barcode
config = BarcodeConfig(ttl_type=TTLType.random, barcode_bits=32)
barcoder = BarcodeTTL(config)
sequence = barcoder.get_sequence()from ttl_barcoder.core import BarcodeTTL
from ttl_barcoder.hardware.bpod import inject_barcode_states
barcoder = BarcodeTTL()
sequence = barcoder.get_sequence()
inject_barcode_states(sma, sequence, bnc_channel='BNC1', first_state_name='send_sync', last_state_name='next')from ttl_barcoder.hardware.pigpio import send_barcode_sequence
send_barcode_sequence(barcoder.get_sequence(), pin=18)pip install ttl-barcoder # core only
pip install ttl-barcoder[bpod] # + Bpod
pip install ttl-barcoder[pigpio] # + Raspberry Pi GPIOBarcodeConfig is a Pydantic model — all fields are validated on construction.
from ttl_barcoder.core import BarcodeConfig, TTLType, TimestampPrecision
config = BarcodeConfig(
ttl_type=TTLType.timestamp, # or TTLType.random
barcode_bits=37, # 16–64 bits
timestamp_precision=TimestampPrecision.milliseconds, # s / ms / us
bit_duration_ms=35.0,
init_duration_ms=10.0,
tolerance=0.25,
)Presets: default, high_speed, conservative, high_precision, random
from ttl_barcoder.core import get_preset
config = get_preset("conservative")| Preset | Bits | Precision | Bit duration | TX duration | Coverage |
|---|---|---|---|---|---|
default |
37 | ms | 35 ms | 1355 ms | 4.4 yr |
high_speed |
32 | ms | 25 ms | 848 ms | 49 days |
conservative |
37 | ms | 50 ms | 1940 ms | 4.4 yr |
high_precision |
42 | us | 50 ms | 2190 ms | 51 days |
ttl_barcoder/
├── core/
│ ├── config.py # BarcodeConfig (Pydantic), TTLType, TimestampPrecision
│ ├── generator.py # TTLGenerator ABC → TimestampGenerator / RandomGenerator
│ ├── encoder.py # bits → (level, duration_ms) timing sequence
│ ├── decoder.py # edge timestamps → barcode value
│ └── barcode_ttl.py # BarcodeTTL — main interface combining the above
└── hardware/
├── bpod/ # Bpod StateMachine integration
└── pigpio/ # Raspberry Pi GPIO via pigpio
- The generator is selected via a factory (
create_generator(config)) based onTTLType. TimestampGeneratorquantizes Unix time at the configured precisionRandomGeneratordraws from a numpy RNG. Both share the sameencode_bits/max_valueinterface on theTTLGeneratorbase class.
examples/dry_simulation.py— full walkthrough, no hardware neededexamples/bpod_loopback.py— Bpod StateMachine with loopback testexamples/pigpio_send.py— Raspberry Pi GPIO transmission
- Fork and create a feature branch
- Add tests for new functionality
- Run
pytest - Submit a pull request
- Based on barcode synchronization from University of Colorado ONE Core
- Inspired by Open Ephys protocols
- Built for the neuroscience and scientific DAQ community
This software is released under the BSD 3-Clause License.