63 lines
3.5 KiB
C
63 lines
3.5 KiB
C
#include "altera_stream.h"
|
|
#include <assert.h>
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
static void meta(void *s,uint32_t session,int uart) {
|
|
uint8_t data[32];uint32_t id;size_t n,i;
|
|
n=las_metadata(LAS_DEVICE_ID,session,1000000,(uint32_t)uart,&id,data,sizeof(data));assert(n);
|
|
assert(id==0x1EE3FE00U);
|
|
if(uart) for(i=0;i<n;++i) las_uart(s,data+i,1);
|
|
else las_can(s,id,data,n,1,0);
|
|
}
|
|
static void sample(void *s,uint32_t session,uint32_t index,int uart) {
|
|
uint8_t data[32];uint32_t id;size_t n;
|
|
n=las_data(LAS_DEVICE_ID,session,index,index&65535U,(uint32_t)uart,&id,data,sizeof(data));assert(n);
|
|
assert(id==0x1EE3FF00U);
|
|
if(uart) las_uart(s,data,n);else las_can(s,id,data,n,1,0);
|
|
}
|
|
int main(void) {
|
|
void *can=malloc(las_context_size()),*uart=malloc(las_context_size());
|
|
uint64_t *indices=malloc(LAS_CAPACITY*sizeof(uint64_t));
|
|
uint16_t *samples=malloc(LAS_CAPACITY*sizeof(uint16_t));
|
|
uint8_t *breaks=malloc(LAS_CAPACITY);uint8_t packet[32];uint32_t id;size_t n,i;
|
|
assert(can&&uart&&indices&&samples&&breaks);
|
|
assert(las_init(can,14)&&las_init(uart,14));assert(!las_init(can,16));
|
|
sample(can,1,0,0);assert(las_get(can,LAS_COUNT)==0);
|
|
meta(can,1,0);meta(uart,1,1);
|
|
/* Independent golden SETCAN bytes. */
|
|
n=las_data(14,1,0x12345678U,0x8001,0,&id,packet,sizeof(packet));
|
|
{ const uint8_t v[]={1,0,1,0x80,0x78,0x56,0x34,0x12};assert(n==8&&!memcmp(v,packet,8)); }
|
|
for(i=0;i<9000;++i) { sample(can,1,(uint32_t)i,0);sample(uart,1,(uint32_t)i,1); }
|
|
assert(las_get(can,LAS_COUNT)==8192&&las_get(uart,LAS_COUNT)==8192);
|
|
assert(las_get(can,LAS_RECEIVED)==9000&&las_get(uart,LAS_RECEIVED)==9000);
|
|
assert(las_snapshot(can,indices,samples,breaks,LAS_CAPACITY)==8192);
|
|
assert(indices[0]==808&&indices[8191]==8999&&samples[8191]==8999);
|
|
assert(las_snapshot(uart,indices,samples,breaks,LAS_CAPACITY)==8192);
|
|
assert(indices[0]==808&&indices[8191]==8999&&samples[8191]==8999);
|
|
sample(can,1,8999,1);assert(las_get(can,LAS_DUPLICATES)==1); /* second transport duplicate */
|
|
sample(can,1,9003,0);assert(las_get(can,LAS_MISSING)==3);
|
|
las_snapshot(can,indices,samples,breaks,LAS_CAPACITY);assert(breaks[8191]);
|
|
/* Repeated metadata must not erase rolling history. */
|
|
meta(can,1,1);assert(las_get(can,LAS_COUNT)==8192);
|
|
meta(can,2,0);assert(las_get(can,LAS_COUNT)==0);
|
|
sample(can,1,9004,1);assert(las_get(can,LAS_COUNT)==0);
|
|
meta(can,1,1);assert(las_get(can,LAS_SESSION)==2);
|
|
sample(can,2,0xffffffffU,0);sample(can,2,0,1);
|
|
las_snapshot(can,indices,samples,breaks,LAS_CAPACITY);
|
|
assert(indices[0]==0xffffffffULL&&indices[1]==0x100000000ULL&&!breaks[1]);
|
|
/* Reject wrong address, standard ID, RTR and short payload. */
|
|
n=las_data(14,2,1,0,0,&id,packet,sizeof(packet));assert(n==8);
|
|
las_can(can,id,packet,8,0,0);las_can(can,id,packet,8,1,1);
|
|
las_can(can,id^(1U<<20),packet,8,1,0);las_can(can,id,packet,7,1,0);
|
|
assert(las_get(can,LAS_COUNT)==2&&las_get(can,LAS_INVALID)==1);
|
|
n=las_data(14,2,1,1,1,&id,packet,sizeof(packet));packet[n-1]^=0x80;
|
|
las_uart(can,packet,n);assert(las_get(can,LAS_CRC_ERRORS)==1);
|
|
sample(can,2,1,1);assert(las_get(can,LAS_COUNT)==3); /* recovery after CRC */
|
|
assert(!las_metadata(14,65536,1000,0,&id,packet,sizeof(packet)));
|
|
assert(!las_metadata(14,1,0,0,&id,packet,sizeof(packet)));
|
|
assert(!las_data(14,1,0,65536,0,&id,packet,sizeof(packet)));
|
|
free(can);free(uart);free(indices);free(samples);free(breaks);
|
|
puts("Altera SETCAN/CAN/UART stream tests passed");return 0;
|
|
}
|