Program Listing for File globals.h

Return to documentation for file (microsync/src/globals.h)

#pragma once

#ifndef UNIT_TEST
#include <ioport.h>
#include "pins.h"
#endif

#define VERSION "2.4.0"


/************************************************************************/
/*                    PINOUT AND WIRING DEFINITIONS                     */
/************************************************************************/
// Laser shutters
#define CY2_PIN     PIO_PA16_IDX    // A0
#define CY3_PIN     PIO_PA24_IDX    // A1
#define CY5_PIN     PIO_PA23_IDX    // A2
#define CY7_PIN     PIO_PA22_IDX    // A3

const uint32_t shutter_pins[] = { CY2_PIN, CY3_PIN, CY5_PIN, CY7_PIN };

#define CAMERA_PIN  PIO_PB15_IDX    // A12

// Error indicator trigger
#define ERR_PIN     PIO_PB14_IDX    // D53

inline void err_led_on(){
    ioport_set_pin_level(ERR_PIN, 1);
}

inline void err_led_off(){
    ioport_set_pin_level(ERR_PIN, 0);
}

// Debug pin
#define DBG_PIN  PIO_PA7_IDX        // D31

inline void dbg_pin_up(){
    ioport_set_pin_level(DBG_PIN, 1);
}

inline void dbg_pin_dn(){
    ioport_set_pin_level(DBG_PIN, 0);
}

// Burst pulse train pin
#define BURST_PIN    PIO_PC25_IDX   // D5, TIOA6  (TC2, channel 0)


// Interlock configuration (see datasheet table 36-4)
#define INTLCK_IN             PIO_PD8_IDX   // D12
#define INTLCK_TIOB
#ifdef INTLCK_TIOA
    #define INTLCK_OUT        PIO_PB25_IDX  //  D2, TIOA0  (TC0, channel 0)
    #define INTLCK_OUT_PERIPH IOPORT_MODE_MUX_B
#else
    #define INTLCK_OUT        PIO_PB27_IDX  // D13, TIOB0  (TC0, channel 0)
    #define INTLCK_OUT_PERIPH IOPORT_MODE_MUX_B
#endif
#define ID_INTLCK_TC          ID_TC0
#define INTLCK_TC             TC0   // ID / 3
#define INTLCK_TC_CH          0     // ID % 3
#define INTLCK_TC_Handler     TC0_Handler
#define INTLCK_TC_IRQn        TC0_IRQn
#define INTLCK_TC_PERIOD_US   25000UL

/************************************************************************/
/*                    UART AND DMA CONFIGURATION                        */
/************************************************************************/
#define UART_BUFFER_SIZE 512   // Size of DMA-controlled UART buffers
#define UART_BAUDRATE 115200   // bits per second
#define UART_TIMEOUT  25       // ms - timeout for UART communication
// UART uses timer 4 (module TC1 channel 1)
#define ID_UART_TC           ID_TC4
#define UART_TC              TC1    // ID / 3
#define UART_TC_CH           1      // ID % 3
#define UART_TIMEOUT_Handler TC4_Handler
#define UART_TC_IRQn         TC4_IRQn


/************************************************************************/
/*                      EVENT HANDLING                                  */
/************************************************************************/
#define WATCHDOG_TIMEOUT  100UL  // ms

// Maximum allowed number of events in the event table
#define MAX_N_EVENTS    450UL

// Uniform time delay added to every single scheduled event, us
// It should be long enough to ensure correct event processing
// under any circumstance
#define UNIFORM_TIME_DELAY 500UL

// Minimal interval between two subsequent runs of the same events, us
#define MIN_EVENT_INTERVAL 20UL

// Grace period for event processing - any event within this interval gets fired
#define TS_TOLERANCE        2UL   // us
#define TS_MISSED_TOLERANCE 100UL // us - when we decide the event has been missed


/************************************************************************/
/*    SYSTEM TIMER CONFIGURATION AND TIME CONVERSION FUNCTIONS          */
/************************************************************************/

// Timer prescaler configuration. See SAM3X TC_CMR register, datasheet p883
// Options are 2, 8, 32, and 128
#define PRESC32

#ifdef PRESC2    // 1ct = 24ns, overflow after 102s  (1min 42s)
#define SYS_TC_PRESCALER 2UL
#define SYS_TC_CMR_TCCLKS_TIMER_CLOCK TC_CMR_TCCLKS_TIMER_CLOCK1
#endif

#ifdef PRESC8    // 1ct = 95ns, overflow after 409s  (6min 49s)
#define SYS_TC_PRESCALER 8UL
#define SYS_TC_CMR_TCCLKS_TIMER_CLOCK TC_CMR_TCCLKS_TIMER_CLOCK2
#endif

#ifdef PRESC32   // 1ct = 381ns, overflow after 1636s (27min 16s)
#define SYS_TC_PRESCALER 32UL
#define SYS_TC_CMR_TCCLKS_TIMER_CLOCK TC_CMR_TCCLKS_TIMER_CLOCK3
#endif

#ifdef PRESC128  // 1ct = 1524ns, overflow after 6544s (1h 49min)
#define SYS_TC_PRESCALER 128UL
#define SYS_TC_CMR_TCCLKS_TIMER_CLOCK TC_CMR_TCCLKS_TIMER_CLOCK4
#endif

#define SYS_TC_CONVERSION_MULTIPLIER (8400000UL/SYS_TC_PRESCALER)
#define TS_TOLERANCE_CTS (TS_TOLERANCE * SYS_TC_CONVERSION_MULTIPLIER / 100000UL)
#define TS_MISSED_TOLERANCE_CTS (TS_MISSED_TOLERANCE * SYS_TC_CONVERSION_MULTIPLIER / 100000UL)
#define UNIFORM_TIME_DELAY_CTS (UNIFORM_TIME_DELAY * SYS_TC_CONVERSION_MULTIPLIER / 100000UL)

// microseconds to counts
static inline uint64_t us2cts(uint64_t us) {
    return us * SYS_TC_CONVERSION_MULTIPLIER / 100000ULL;
}

// counts to microseconds
static inline uint64_t cts2us(uint64_t cts) {
    return cts * 100000ULL / SYS_TC_CONVERSION_MULTIPLIER;
}


// Main timer/counter for events (module TC1 channel 0)
#define ID_SYS_TC       ID_TC3
#define SYS_TC          TC1     // ID / 3
#define SYS_TC_CH       0       // ID % 3
#define SYS_TC_Handler  TC3_Handler
#define SYS_TC_IRQn     TC3_IRQn