5 #define _FILE_OFFSET_BITS 64 12 pthread_mutex_t
waiting = PTHREAD_MUTEX_INITIALIZER;
15 pthread_cond_t
done = PTHREAD_COND_INITIALIZER;
23 unsigned int event = *((
unsigned int *) voidEvent);
27 pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype);
30 prussdrv_pru_wait_event(event);
33 pthread_cond_signal(&
done);
46 struct timespec abs_time;
53 clock_gettime(CLOCK_REALTIME, &abs_time);
54 abs_time.tv_sec += timeout;
58 err = pthread_cond_timedwait(&
done, &
waiting, &abs_time);
83 if((fd = open(
"/dev/mem", O_RDWR | O_SYNC)) == -1){
89 void* pru_mmap = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, (off_t)pru_memory);
91 if(pru_mmap == (
void *) -1) {
111 if(munmap(pru_mmap, size) == -1) {
131 prussdrv_pru_write_memory(PRUSS0_PRU0_DATARAM, 0, (
unsigned int*) &state,
sizeof(
int));
142 tpruss_intc_initdata pruss_intc_initdata = PRUSS_INTC_INITDATA;
144 if (prussdrv_open(PRU_EVTOUT_0) == -1) {
148 prussdrv_pruintc_init(&pruss_intc_initdata);
162 uint32_t pru_sample_rate;
174 pru_sample_rate =
K1;
179 pru_sample_rate =
K1;
184 pru_sample_rate =
K1;
189 pru_sample_rate =
K1;
194 pru_sample_rate =
K2;
199 pru_sample_rate =
K4;
204 pru_sample_rate =
K8;
209 pru_sample_rate =
K16;
214 pru_sample_rate =
K32;
219 pru_sample_rate =
K64;
269 uint32_t avg_factor = 1;
311 int web_buffer_element_size = buffer_sizes[i] * num_web_channels*
sizeof(int64_t);
322 tpruss_intc_initdata pruss_intc_initdata = PRUSS_INTC_INITDATA;
323 prussdrv_pruintc_init(&pruss_intc_initdata);
334 if(2*buffer_size_bytes > max_size) {
335 rl_log(
ERROR,
"not enough memory allocated. Run:\n rmmod uio_pruss\n modprobe uio_pruss extram_pool_sz=0x%06x", 2*buffer_size_bytes);
341 void* buffer1 = buffer0 + buffer_size_bytes;
354 file_header.
channel = file_channel;
371 prussdrv_pru_write_memory(PRUSS0_PRU0_DATARAM, 0, (
unsigned int*) &pru,
sizeof(
struct pru_data_struct));
374 if (prussdrv_exec_program (0,
PRU_CODE) < 0) {
387 prussdrv_pru_clear_event(PRU_EVTOUT_0, PRU0_ARM_INTERRUPT);
390 uint32_t buffer_lost = 0;
392 uint32_t samples_buffer;
393 uint32_t num_files = 1;
405 uint64_t file_size = (uint64_t) ftello(data);
420 char* file_ending = file_name;
421 while(strchr(file_ending, target) != NULL) {
422 file_ending = strchr(file_ending, target);
428 sprintf(new_file_ending,
"_p%d", num_files++);
429 strcat(new_file_ending, file_ending);
430 strcpy(file_ending, new_file_ending);
433 data = fopen(file_name,
"w+");
452 buffer_addr = buffer0;
454 buffer_addr = buffer1;
472 prussdrv_pru_wait_event(PRU_EVTOUT_0);
476 prussdrv_pru_clear_event(PRU_EVTOUT_0, PRU0_ARM_INTERRUPT);
480 uint32_t buffer = *((uint32_t*) buffer_addr);
482 buffer_lost += (buffer - i);
483 rl_log(
WARNING,
"overrun: %d samples (%d buffer) lost (%d in total)", (buffer - i) * pru.
buffer_size, buffer - i, buffer_lost);
512 int num_web_clients = semctl(sem_id,
WAIT_SEM, GETNCNT);
575 prussdrv_pru_clear_event(PRU_EVTOUT_0, PRU0_ARM_INTERRUPT);
585 prussdrv_pru_disable(0);
int write_status(struct rl_status *status)
Limited sampling mode (limited by number of samples to take)
struct ringbuffer buffer[WEB_RING_BUFFER_COUNT]
Array of ring buffers for different time scales.
#define NUM_DIGITAL_INPUTS
Number of RocketLogger digital channels.
rl_mode mode
Sampling mode.
int pru_data_setup(struct pru_data_struct *pru, struct rl_conf *conf, uint32_t avg_factor)
void store_header_csv(FILE *data, struct rl_file_header *file_header)
void meter_print_buffer(struct rl_conf *conf, void *buffer_addr, uint32_t sample_size)
rl_pru_state state
Current PRU state.
struct rl_status status
Current status of RocketLogger.
void update_header_bin(FILE *data, struct rl_file_header *file_header)
#define BUFFER1_SIZE
Size of 1s/div buffer.
#define NUM_WEB_POINTS
Number of data points in web plot.
#define NUMBER_ADC_COMMANDS
Number of ADC commands.
#define WAIT_SEM
Number of wait semaphore in set (blocks all server processes, until new data is available) ...
void rl_log(rl_log_type type, const char *format,...)
int read_file_value(char filename[])
#define PRU_TIMEOUT
PRU time out in seconds.
#define BUFFER10_SIZE
Size of 10s/div buffer.
int set_sem(int sem_id, int sem_num, int val)
uint32_t num_channels
Number of channels sampled.
int unmap_pru_memory(void *pru_mmap)
enum pru_state rl_pru_state
int ceil_div(int n, int d)
int digital_inputs
En-/disable digital inputs.
#define MAX_PATH_LENGTH
Maximum path length in characters.
uint64_t sample_count
Total sample count.
uint16_t channel_bin_count
Binary channel count.
int enable_web_server
En-/disable plots on web interface.
#define PRU_CODE
PRU binary file location.
int sem_id
ID of semaphore set.
void reset_buffer(struct ringbuffer *buffer, int element_size, int length)
#define DATA_SEM
Number of data semaphore in set (manages access to shared memory data)
int pru_sample(FILE *data, struct rl_conf *conf)
Continuous sampling mode.
uint64_t samples_taken
Number of samples taken.
struct web_shm * create_web_shm(void)
int remove_sem(int sem_id)
struct web_shm * web_data
Pointer to shared memory data.
uint32_t buffer_size
Shared buffer size.
int sample_limit
Sample limit (0 for continuous)
#define NUM_CHANNELS
Maximum number of RocketLogger channels.
#define CHANNEL_ENABLED
Channel sampling enabled.
uint32_t number_commands
Number of ADC commands to send.
#define BUFFER100_SIZE
Size of 100s/div buffer.
char file_name[MAX_PATH_LENGTH]
Data file name.
#define PRU_DIG_SIZE
Size of PRU digital information in bytes.
uint32_t sample_limit
Samples to take (0 for continuous)
int channels[NUM_CHANNELS]
Channels to sample.
uint16_t channel_count
Analog channel count.
void store_header_bin(FILE *data, struct rl_file_header *file_header)
#define PRU_BUFFER_STATUS_SIZE
Size of PRU buffer status in bytes.
rl_file_format file_format
File format.
uint32_t buffer_number
Number of buffers taken.
void * map_pru_memory(void)
#define WEB_RING_BUFFER_COUNT
Number of ring buffers in shared memory.
uint32_t sample_size
Sample size in shared memory.
int update_rate
Data update rate.
uint32_t precision
ADC precision (in bit)
void update_header_csv(FILE *data, struct rl_file_header *file_header)
int sample_rate
Sampling rate.
void * pru_wait_event(void *voidEvent)
pthread_cond_t done
Notification variable.
int buffer_sizes[WEB_RING_BUFFER_COUNT]
Buffer sizes for different time scales.
uint32_t buffer0_location
Pointer to shared buffer 0.
uint64_t max_file_size
Maximum data file size.
rl_sampling sampling
Sampling state.
int count_channels(int channels[NUM_CHANNELS])
uint32_t buffer1_location
Pointer to shared buffer 1.
#define MIN_ADC_RATE
Minimal ADC sampling rate.
uint32_t commands[NUMBER_ADC_COMMANDS]
ADC commands to send.
int pru_wait_event_timeout(unsigned int event, unsigned int timeout)
uint32_t data_block_count
Number of data blocks stored in the file.
void handle_data_buffer(FILE *data, void *buffer_addr, uint32_t sample_size, uint32_t samples_buffer, struct rl_conf *conf, int sem_id, struct web_shm *web_data_ptr)
Meter mode (display current values in terminal)
#define MMAP_FILE
Memory map file.
void pru_set_state(rl_pru_state state)
pthread_mutex_t waiting
PRU access mutex.
void setup_lead_in(struct rl_file_lead_in *lead_in, struct rl_conf *conf)
#define DIGITAL_INPUTS_ENABLED
Digital input sampling ensabled.
void setup_header(struct rl_file_header *file_header, struct rl_conf *conf)