Files
dist_tester/src/eth_demux.c

206 lines
5.8 KiB
C

/*
* eth_demux.c
*
* Created on: 21-05-2024
* Author: Krzysztof Jakubczyk
*/
#include <math.h>
#include <string.h>
#include "tdefs.h"
#include "misc.h"
#include "eth.h"
#include "helper.h"
#include "eth_demux.h"
#include "analog_in.h"
#include "R87L.h"
u16 eth_comm_bits_act[8] = {0,0,0,0,0,0,0,0};
int eth_demux_initlog(void *arguments, void *logic)
{
struct eth_demux_args *args = (struct eth_demux_args *)arguments;
struct eth_demux_logic *log = (struct eth_demux_logic *)logic;
// u8 i;
if(set_pointer_in_ptr(args->io.stream1_ptr_in,(u32*)&log->stream_in[0]))
return -1;
if(set_pointer_in_ptr(args->io.stream2_ptr_in,(u32*)&log->stream_in[1]))
return -1;
if(set_pointer_in_ptr(args->io.stream3_ptr_in,(u32*)&log->stream_in[2]))
return -1;
if(set_pointer_in_ptr(args->io.stream4_ptr_in,(u32*)&log->stream_in[3]))
return -1;
if(set_pointer_in_ptr(args->io.stream5_ptr_in,(u32*)&log->stream_in[4]))
return -1;
if(set_pointer_in_ptr(args->io.stream6_ptr_in,(u32*)&log->stream_in[5]))
return -1;
if(set_pointer_in_ptr(args->io.stream7_ptr_in,(u32*)&log->stream_in[6]))
return -1;
if(set_pointer_in_ptr(args->io.stream8_ptr_in,(u32*)&log->stream_in[7]))
return -1;
if(set_bit_ptr_struct(args->io.stream1_act_in,&log->stream_in_act[0]))
return -1;
if(set_bit_ptr_struct(args->io.stream2_act_in,&log->stream_in_act[1]))
return -1;
if(set_bit_ptr_struct(args->io.stream3_act_in,&log->stream_in_act[2]))
return -1;
if(set_bit_ptr_struct(args->io.stream4_act_in,&log->stream_in_act[3]))
return -1;
if(set_bit_ptr_struct(args->io.stream5_act_in,&log->stream_in_act[4]))
return -1;
if(set_bit_ptr_struct(args->io.stream6_act_in,&log->stream_in_act[5]))
return -1;
if(set_bit_ptr_struct(args->io.stream7_act_in,&log->stream_in_act[6]))
return -1;
if(set_bit_ptr_struct(args->io.stream8_act_in,&log->stream_in_act[7]))
return -1;
if(set_pointer_out_ptr(args->io.stream1_ptr_out,(u32*)&log->stream_out[0]))
return -1;
if(set_pointer_out_ptr(args->io.stream2_ptr_out,(u32*)&log->stream_out[1]))
return -1;
if(set_pointer_out_ptr(args->io.stream3_ptr_out,(u32*)&log->stream_out[2]))
return -1;
if(set_pointer_out_ptr(args->io.stream4_ptr_out,(u32*)&log->stream_out[3]))
return -1;
if(set_pointer_out_ptr(args->io.stream5_ptr_out,(u32*)&log->stream_out[4]))
return -1;
if(set_pointer_out_ptr(args->io.stream6_ptr_out,(u32*)&log->stream_out[5]))
return -1;
if(set_pointer_out_ptr(args->io.stream7_ptr_out,(u32*)&log->stream_out[6]))
return -1;
if(set_pointer_out_ptr(args->io.stream8_ptr_out,(u32*)&log->stream_out[7]))
return -1;
if(set_bit_ptr_struct(args->io.streams_ok_out,&log->streams_ok))
return -1;
if(set_bit_ptr_struct(args->io.przeglad1_out,&log->przeglad[0]))
return -1;
if(set_bit_ptr_struct(args->io.przeglad2_out,&log->przeglad[1]))
return -1;
if(set_bit_ptr_struct(args->io.przeglad3_out,&log->przeglad[2]))
return -1;
if(set_bit_ptr_struct(args->io.przeglad4_out,&log->przeglad[3]))
return -1;
if(set_bit_ptr_struct(args->io.przeglad5_out,&log->przeglad[4]))
return -1;
if(set_bit_ptr_struct(args->io.przeglad6_out,&log->przeglad[5]))
return -1;
if(set_bit_ptr_struct(args->io.przeglad7_out,&log->przeglad[6]))
return -1;
if(set_bit_ptr_struct(args->io.przeglad8_out,&log->przeglad[7]))
return -1;
log->jednostki = args->params.liczba_jednostek+2;
if(log->jednostki>8)
log->jednostki=8;
if(set_float_ptr(args->io.endpoints_float_out,&log->endpoints))
return -1;
*log->endpoints=log->jednostki;
return 0;
}
void eth_demux(void *arguments, void *logic)
{
struct eth_demux_logic *log = (struct eth_demux_logic *)logic;
u8 i,j,stream_ok,str_ok[8],str_ok_ndelay[8];
stream_ok=1;
for(i=0;i<log->jednostki;i++)
{
str_ok[i]=1;
str_ok_ndelay[i]=1;
if(check_struct(&log->stream_in_act[i]))
{
log->snum_cur[i]=log->stream_in[i]->sample_stamp;
if((log->snum_prev[i]+(SAMPLES_PER_MS*LOOP_CYCLE_MS))%(SAMPLES_PER_MS*1000)!=log->snum_cur[i])
{
log->sfault_delay_cnt[i]=20;
if(!(eth_comm_bits_act[i] & R87L_COMM_PRZEGLAD))
stream_ok=0;
str_ok[i]=0;
str_ok_ndelay[i]=0;
}
else if(log->sfault_delay_cnt[i])
{
if(log->sfault_delay_cnt[i]>=LOOP_CYCLE_MS)
log->sfault_delay_cnt[i]-=LOOP_CYCLE_MS;
else
log->sfault_delay_cnt[i]=0;
if(!(eth_comm_bits_act[i] & R87L_COMM_PRZEGLAD))
stream_ok=0;
str_ok[i]=0;
}
log->ostream_ptr[i]=log->stream_in[i];
log->snum_prev[i]=log->snum_cur[i];
}
else
{
if(!(eth_comm_bits_act[i] & R87L_COMM_PRZEGLAD))
stream_ok=0;
str_ok_ndelay[i]=0;
str_ok[i]=0;
}
if(i>0 && log->snum_cur[i]!=log->snum_cur[i-1] && !(eth_comm_bits_act[i] & R87L_COMM_PRZEGLAD) && !(eth_comm_bits_act[i-1] & R87L_COMM_PRZEGLAD))
{
log->sfault_delay_cnt[i]=20;
stream_ok=0;
str_ok[i]=0;
str_ok_ndelay[i]=0;
}
}
for(i=0;i<log->jednostki;i++)
{
if(str_ok[i])
eth_comm_bits_act[i]=log->ostream_ptr[i]->bits;
check_and_set_struct(eth_comm_bits_act[i] & R87L_COMM_PRZEGLAD,&log->przeglad[i]);
}
check_and_set_struct(stream_ok,&log->streams_ok);
if(stream_ok)
{
for(i=0;i<log->jednostki;i++)
{
if(!(eth_comm_bits_act[i] & R87L_COMM_PRZEGLAD))
memcpy((u8 *)&log->stream_out[i],(u8 *)log->ostream_ptr[i],sizeof(struct stream_frame));
else
{
memset((u8*)&log->stream_out[i],0,sizeof(log->stream_out[0]));
log->stream_out[i].bits=(eth_comm_bits_act[i] & (R87L_COMM_PRZEGLAD|0xFF00)); // przeglad bit i GPbits przepisuj w przegladzie
}
}
}
else
{
for(i=0;i<log->jednostki;i++)
if(str_ok_ndelay[i])
memcpy((u8 *)&log->stream_out[i],(u8 *)log->ostream_ptr[i],sizeof(struct stream_frame));
else
{
for(j=0;j<3;j++)
log->stream_out[i].A[j]=32768.0f;
}
// memset((u8*)log->stream_out,0,sizeof(log->stream_out)); // zostawic ostatnie dane?
// for(i=0;i<3;i++)
// log->stream_out[i].bits=(comm_bits_act[i] & R87L_COMM_PRZEGLAD);
}
}