51 rl_log(
ERROR,
"In create_web_shm: failed to get shared data memory id; " 53 errno, strerror(errno));
58 if (web_data == (
void*)-1) {
59 rl_log(
ERROR,
"In create_web_shm: failed to map shared data memory; %d " 61 errno, strerror(errno));
77 rl_log(
ERROR,
"In create_web_shm: failed to get shared data memory id; " 79 errno, strerror(errno));
84 if (web_data == (
void*)-1) {
85 rl_log(
ERROR,
"In create_web_shm: failed to map shared data memory; %d " 87 errno, strerror(errno));
113 memcpy((buffer->
data) +
129 int pos = ((int)buffer->
head + (
int)buffer->
length - 1 - num) %
151 dest[ch_out++] = src[++ch_in];
153 dest[ch_out++] = src[ch_in++] *
H_L_SCALE;
157 dest[ch_out++] = src[ch_in++] *
H_L_SCALE;
159 dest[ch_out++] = src[ch_in++];
162 dest[ch_out++] = src[ch_in++];
165 dest[ch_out++] = src[ch_in++];
171 dest[ch_out++] = src[++ch_in];
173 dest[ch_out++] = src[ch_in++] *
H_L_SCALE;
177 dest[ch_out++] = src[ch_in++] *
H_L_SCALE;
179 dest[ch_out++] = src[ch_in++];
183 dest[ch_out++] = src[ch_in++];
186 dest[ch_out++] = src[ch_in++];
201 void* buffer_addr, uint32_t sample_data_size,
202 uint32_t samples_count,
207 int num_bin_channels = 0;
226 memset(bin_avg_data, 0,
227 sizeof(uint32_t) * num_bin_channels * WEB_RING_BUFFER_COUNT);
236 for (uint32_t i = 0; i < samples_count; i++) {
242 uint8_t bin_adc1 = (*((int8_t*)(buffer_addr)));
243 uint8_t bin_adc2 = (*((int8_t*)(buffer_addr + 1)));
252 if (sample_data_size == 4) {
254 *((int32_t*)(buffer_addr + sample_data_size * j));
257 *((int16_t*)(buffer_addr + sample_data_size * j));
260 int32_t channel_value =
268 buffer_addr += NUM_CHANNELS * sample_data_size;
280 for (
int j = 0; j < num_bin_channels; j++) {
281 if ((bin_data & MASK) > 0) {
295 bin_data = bin_data | (valid1 << bin_channel_pos);
299 bin_data = bin_data | (valid2 << bin_channel_pos);
305 avg_valid[j][0] = avg_valid[j][0] & valid1;
306 avg_valid[j][1] = avg_valid[j][1] & valid2;
322 &web_data[BUF1_INDEX][i / avg_length[BUF1_INDEX]]
324 avg_data[BUF1_INDEX], conf);
327 for (
int j = 0; j < num_bin_channels; j++) {
332 if (bin_avg_data[BUF1_INDEX][j] >=
333 (avg_length[BUF1_INDEX] / 2)) {
341 memset(avg_data[BUF1_INDEX], 0,
sizeof(int64_t) * num_channels);
342 memset(bin_avg_data[BUF1_INDEX], 0,
343 sizeof(uint32_t) * num_bin_channels);
360 &web_data[BUF10_INDEX]
361 [i / avg_length[BUF10_INDEX]]
363 avg_data[BUF10_INDEX], conf);
366 for (
int j = 0; j < num_bin_channels; j++) {
371 if (bin_avg_data[BUF10_INDEX][j] >=
372 (avg_length[BUF10_INDEX] / 2)) {
380 memset(avg_data[BUF10_INDEX], 0,
sizeof(int64_t) * num_channels);
381 memset(bin_avg_data[BUF10_INDEX], 0,
382 sizeof(uint32_t) * num_bin_channels);
398 &web_data[BUF100_INDEX]
399 [i / avg_length[BUF100_INDEX]]
401 avg_data[BUF100_INDEX], conf);
404 for (
int j = 0; j < num_bin_channels; j++) {
406 if (bin_avg_data[BUF100_INDEX][j] >=
407 (avg_length[BUF100_INDEX] / 2)) {
428 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.