52 rl_log(
ERROR,
"In create_web_shm: failed to get shared data memory id; " 54 errno, strerror(errno));
59 if (web_data == (
void*)-1) {
60 rl_log(
ERROR,
"In create_web_shm: failed to map shared data memory; %d " 62 errno, strerror(errno));
78 rl_log(
ERROR,
"In create_web_shm: failed to get shared data memory id; " 80 errno, strerror(errno));
85 if (web_data == (
void*)-1) {
86 rl_log(
ERROR,
"In create_web_shm: failed to map shared data memory; %d " 88 errno, strerror(errno));
114 memcpy((buffer->
data) +
130 int pos = ((int)buffer->
head + (
int)buffer->
length - 1 - num) %
152 dest[ch_out++] = src[++ch_in];
154 dest[ch_out++] = src[ch_in++] *
H_L_SCALE;
158 dest[ch_out++] = src[ch_in++] *
H_L_SCALE;
160 dest[ch_out++] = src[ch_in++];
163 dest[ch_out++] = src[ch_in++];
166 dest[ch_out++] = src[ch_in++];
172 dest[ch_out++] = src[++ch_in];
174 dest[ch_out++] = src[ch_in++] *
H_L_SCALE;
178 dest[ch_out++] = src[ch_in++] *
H_L_SCALE;
180 dest[ch_out++] = src[ch_in++];
184 dest[ch_out++] = src[ch_in++];
187 dest[ch_out++] = src[ch_in++];
202 void* buffer_addr, uint32_t sample_data_size,
203 uint32_t samples_count,
208 int num_bin_channels = 0;
233 for (uint32_t i = 0; i < samples_count; i++) {
239 uint8_t bin_adc1 = (*((int8_t*)(buffer_addr)));
240 uint8_t bin_adc2 = (*((int8_t*)(buffer_addr + 1)));
249 if (sample_data_size == 4) {
251 *((int32_t*)(buffer_addr + sample_data_size * j));
254 *((int16_t*)(buffer_addr + sample_data_size * j));
257 int32_t channel_value =
265 buffer_addr += NUM_CHANNELS * sample_data_size;
277 for (
int j = 0; j < num_bin_channels; j++) {
278 if ((bin_data & MASK) > 0) {
292 bin_data = bin_data | (valid1 << bin_channel_pos);
296 bin_data = bin_data | (valid2 << bin_channel_pos);
302 avg_valid[j][0] = avg_valid[j][0] & valid1;
303 avg_valid[j][1] = avg_valid[j][1] & valid2;
319 &web_data[BUF1_INDEX][i / avg_length[BUF1_INDEX]]
321 avg_data[BUF1_INDEX], conf);
324 for (
int j = 0; j < num_bin_channels; j++) {
329 if (bin_avg_data[BUF1_INDEX][j] >=
330 (avg_length[BUF1_INDEX] / 2)) {
338 memset(avg_data[BUF1_INDEX], 0,
sizeof(int64_t) * num_channels);
339 memset(bin_avg_data[BUF1_INDEX], 0,
340 sizeof(uint32_t) * num_bin_channels);
357 &web_data[BUF10_INDEX]
358 [i / avg_length[BUF10_INDEX]]
360 avg_data[BUF10_INDEX], conf);
363 for (
int j = 0; j < num_bin_channels; j++) {
368 if (bin_avg_data[BUF10_INDEX][j] >=
369 (avg_length[BUF10_INDEX] / 2)) {
377 memset(avg_data[BUF10_INDEX], 0,
sizeof(int64_t) * num_channels);
378 memset(bin_avg_data[BUF10_INDEX], 0,
379 sizeof(uint32_t) * num_bin_channels);
395 &web_data[BUF100_INDEX]
396 [i / avg_length[BUF100_INDEX]]
398 avg_data[BUF100_INDEX], conf);
401 for (
int j = 0; j < num_bin_channels; j++) {
403 if (bin_avg_data[BUF100_INDEX][j] >=
404 (avg_length[BUF100_INDEX] / 2)) {
412 memset(avg_data[BUF100_INDEX], 0,
sizeof(int64_t) * num_channels);
413 memset(bin_avg_data[BUF100_INDEX], 0,
414 sizeof(uint32_t) * num_bin_channels);
432 timestamp_realtime->
sec * 1000 + timestamp_realtime->
nsec / 1000000;
struct ringbuffer buffer[WEB_RING_BUFFER_COUNT]
Array of ring buffers for different time scales.
int offsets[NUM_CHANNELS]
Channel offsets (in bit)
#define SHMEM_DATA_KEY
Key for web shared memory (used for creation)
#define NUM_DIGITAL_INPUTS
Number of RocketLogger digital channels.
struct web_shm * web_create_shm(void)
double scales[NUM_CHANNELS]
Channel scalings.
#define BINARY_MASK
Mask for binary inputs read from PRU.
#define BUF10_INDEX
Index of 10s/div buffer.
struct rl_status status
Current status of RocketLogger.
int64_t sec
Seconds in UNIX time (UTC)
struct web_shm * web_open_shm(void)
#define BUFFER1_SIZE
Size of 1s/div buffer.
void rl_log(rl_log_type type, const char *format,...)
void web_buffer_add(struct ringbuffer *buffer, int64_t *data)
#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 wait_sem(int sem_id, int sem_num, int time_out)
int digital_inputs
En-/disable digital inputs.
int64_t data[NUM_WEB_CHANNELS *NUM_WEB_POINTS]
Data array.
int enable_web_server
En-/disable plots on web interface.
int sem_id
ID of semaphore set.
#define DATA_SEM
Number of data semaphore in set (manages access to shared memory data)
#define BUF100_INDEX
Index of 100s/div buffer.
#define VALID_MASK
Mask for valid bit read from PRU.
struct web_shm * web_data
Pointer to shared memory data.
void web_buffer_reset(struct ringbuffer *buffer, int element_size, int length)
#define NUM_I_CHANNELS
Maximum number of RocketLogger current channels.
uint32_t filled
Number of elements in buffer.
#define NUM_CHANNELS
Maximum number of RocketLogger channels.
#define CHANNEL_ENABLED
Channel sampling enabled.
#define SHMEM_PERMISSIONS
Permissions for shared memory.
#define BUFFER100_SIZE
Size of 100s/div buffer.
#define PRU_DIG_SIZE
Size of PRU digital information in bytes.
void web_handle_data(struct web_shm *web_data_ptr, int sem_id, void *buffer_addr, uint32_t sample_data_size, uint32_t samples_count, struct time_stamp *timestamp_realtime, struct rl_conf *conf)
int channels[NUM_CHANNELS]
Channels to sample.
#define BUF1_INDEX
Index of 1s/div buffer.
int64_t time
Time stamp of most recent datum (in UNIX time, UTC)
uint32_t head
Current position (in elements)
#define WEB_RING_BUFFER_COUNT
Number of ring buffers in shared memory.
#define H_L_SCALE
Current high-low scale difference.
uint32_t element_size
Size of buffer element.
#define SEM_WRITE_TIME_OUT
Time out time in seconds, waiting on semaphore write.
uint32_t length
Size of buffer in elements.
int count_channels(int channels[NUM_CHANNELS])
void web_merge_currents(uint8_t *valid, int64_t *dest, int64_t *src, struct rl_conf *conf)
int64_t * web_buffer_get(struct ringbuffer *buffer, int num)
int8_t num_channels
Number of channels sampled.
#define DIGITAL_INPUTS_ENABLED
Digital input sampling ensabled.
struct rl_calibration calibration
Calibration data.