continuous fetch works
This commit is contained in:
parent
16ac11cddf
commit
d3b716446a
4 changed files with 30 additions and 27 deletions
|
|
@ -25,7 +25,7 @@ struct __attribute__((__packed__)) usbp_measurement_pkt {
|
|||
uint8_t packet_type;
|
||||
uint8_t num_channels;
|
||||
size_t num_samples[2];
|
||||
int32_t measurements[2][2][64];
|
||||
int32_t measurements[2][2][15];
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
48
src/proto.c
48
src/proto.c
|
|
@ -51,41 +51,43 @@ void uart_handle_user_packet(struct ll_pkt *pkt, size_t len) {
|
|||
if (pkt->type == PK_FETCH_RESPONSE) {
|
||||
|
||||
size_t index = (pkt->src - BADDR_MEAS_BASE) & 1;
|
||||
struct pkt_adc_data *pkt = (struct pkt_adc_data *)pkt;
|
||||
size_t offset = st_proto.adc_sp_wr_idx[index];
|
||||
size_t num_new = pkt->sample_count - st_proto.adc_sample_count[index];
|
||||
struct pkt_adc_data *pkt_adc = (struct pkt_adc_data *)pkt;
|
||||
size_t wr_pos = st_proto.adc_sp_wr_idx[index];
|
||||
size_t rd_pos = st_proto.adc_sp_rd_idx[index];
|
||||
size_t num_new = pkt_adc->sample_count - st_proto.adc_sample_count[index];
|
||||
|
||||
if (num_new > COUNT_OF(pkt->samples)) {
|
||||
if (num_new > COUNT_OF(pkt_adc->samples)) {
|
||||
st_proto.last_error = sys_time_us;
|
||||
st_proto.error = ERR_BUFFER_OVERFLOW;
|
||||
num_new = COUNT_OF(pkt->samples);
|
||||
num_new = COUNT_OF(pkt_adc->samples);
|
||||
}
|
||||
|
||||
for (ssize_t i=num_new-1; i>=0; i--) {
|
||||
for (size_t channel=0; channel<2; channel++) {
|
||||
st_proto.adc_samples[index][channel][offset] =
|
||||
pkt->samples[i][channel][2] |
|
||||
pkt->samples[i][channel][1]<<8 |
|
||||
(((int32_t)(int8_t)pkt->samples[i][channel][0])<<16);
|
||||
st_proto.adc_samples[index][channel][wr_pos] =
|
||||
pkt_adc->samples[i][channel][2] |
|
||||
pkt_adc->samples[i][channel][1]<<8 |
|
||||
(((int32_t)(int8_t)pkt_adc->samples[i][channel][0])<<16);
|
||||
}
|
||||
|
||||
offset ++;
|
||||
if (offset >= COUNT_OF(st_proto.adc_samples[0][0])) {
|
||||
offset = 0;
|
||||
size_t new_wr_pos = wr_pos+1;
|
||||
if (new_wr_pos >= COUNT_OF(st_proto.adc_samples[0][0])) {
|
||||
new_wr_pos = 0;
|
||||
}
|
||||
|
||||
if (new_wr_pos == rd_pos) {
|
||||
st_proto.last_error = sys_time_us;
|
||||
st_proto.error = ERR_BUFFER_OVERFLOW;
|
||||
break;
|
||||
} else {
|
||||
wr_pos = new_wr_pos;
|
||||
}
|
||||
}
|
||||
|
||||
size_t old_wr_pos = st_proto.adc_sp_wr_idx[index];
|
||||
size_t rd_pos = st_proto.adc_sp_rd_idx[index];
|
||||
if ((old_wr_pos < rd_pos && rd_pos < offset) || !(offset < rd_pos && rd_pos < old_wr_pos)) {
|
||||
st_proto.last_error = sys_time_us;
|
||||
st_proto.error = ERR_BUFFER_OVERFLOW;
|
||||
}
|
||||
|
||||
st_proto.adc_sp_wr_idx[index] = offset;
|
||||
st_proto.adc_sample_timestamp[index] = pkt->timestamp;
|
||||
st_proto.adc_sampling_interval[index] = pkt->sampling_interval_us;
|
||||
st_proto.adc_sample_count[index] = pkt->sample_count;
|
||||
st_proto.adc_sp_wr_idx[index] = wr_pos;
|
||||
st_proto.adc_sample_timestamp[index] = pkt_adc->timestamp;
|
||||
st_proto.adc_sampling_interval[index] = pkt_adc->sampling_interval_us;
|
||||
st_proto.adc_sample_count[index] = pkt_adc->sample_count;
|
||||
|
||||
proto_handle_host(false);
|
||||
|
||||
|
|
|
|||
|
|
@ -34,16 +34,17 @@ void handle_usb_packet(void *packet, size_t len) {
|
|||
.num_channels = 4,
|
||||
};
|
||||
|
||||
for (size_t board=0; board==2; board++) {
|
||||
for (size_t board=0; board<2; board++) {
|
||||
size_t rd_idx = st_proto.adc_sp_rd_idx[board];
|
||||
size_t wr_idx = st_proto.adc_sp_wr_idx[board];
|
||||
size_t nread = 0;
|
||||
|
||||
while (rd_idx != wr_idx && nread < COUNT_OF(response.measurements[0][0])) {
|
||||
for (size_t channel=0; channel==2; channel++) {
|
||||
for (size_t channel=0; channel<2; channel++) {
|
||||
response.measurements[board][channel][nread] = st_proto.adc_samples[board][channel][rd_idx];
|
||||
}
|
||||
|
||||
nread++;
|
||||
rd_idx++;
|
||||
if (rd_idx == COUNT_OF(st_proto.adc_samples[0][0])) {
|
||||
rd_idx = 0;
|
||||
|
|
|
|||
|
|
@ -84,7 +84,7 @@ void uart_interrupt(uint32_t isr) {
|
|||
return;
|
||||
}
|
||||
|
||||
volatile struct ll_pkt *pkt = (volatile struct ll_pkt *)&uart_st.rx_buf;
|
||||
volatile struct ll_pkt *pkt = (volatile struct ll_pkt *)uart_st.rx_buf;
|
||||
|
||||
if (pkt->dst != uart_st.addr && pkt->dst != SER_ADDR_BROADCAST) {
|
||||
/* we are not addressed */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue