73 lines
3.3 KiB
C
73 lines
3.3 KiB
C
#include "altera_logic.h"
|
|
#include <assert.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
static void response(void *s, uint8_t *data, size_t n) {
|
|
size_t i; uint8_t sum=0;
|
|
for(i=0;i<n-1;++i) sum^=data[i]; data[n-1]=sum;
|
|
/* Serial reads can split at every byte. */
|
|
for(i=0;i<n;++i) la_feed(s,data+i,1);
|
|
}
|
|
static void connect_ok(void *s) {
|
|
uint8_t p[6], info[]={0x5a,0x81,0,16,0,16,50,1,0xe8};
|
|
const uint8_t request[]={0xa5,1,0,0,0,0xa4};
|
|
la_init(s); assert(la_next(s,p,5)==0);
|
|
assert(la_next(s,p,6)==6 && !memcmp(p,request,6));
|
|
assert(la_next(s,p,6)==0);
|
|
response(s,info,sizeof(info)); assert(la_get(s,LA_STATE)==LA_READY);
|
|
}
|
|
int main(void) {
|
|
void *s=calloc(1,la_context_size()); uint8_t p[6], ack[4], status[7], block[133];
|
|
uint16_t samples[4096]; unsigned int cmd, offset, i;
|
|
assert(s); connect_ok(s);
|
|
assert(la_start(s,65536,0,0,0,0)==LA_ARGUMENT);
|
|
assert(la_start(s,49,1,0,1,1)==LA_ARGUMENT);
|
|
assert(la_start(s,49,0,0,1,1)==0);
|
|
for(cmd=2;cmd<=7;++cmd) {
|
|
assert(la_next(s,p,6)==6 && p[1]==cmd);
|
|
if(cmd==2) { const uint8_t v[]={0xa5,2,49,0,0,0x96}; assert(!memcmp(p,v,6)); }
|
|
ack[0]=0x5a; ack[1]=(uint8_t)(cmd|0x80); ack[2]=0; response(s,ack,4);
|
|
}
|
|
assert(la_next(s,p,6)==0); la_tick(s,25);
|
|
assert(la_next(s,p,6)==6 && p[1]==8);
|
|
{ uint8_t waiting[]={0x5a,0x88,0,1,0,8,0}; response(s,waiting,7); }
|
|
la_tick(s,60000); /* Waiting for a physical trigger is not a UART timeout. */
|
|
assert(la_get(s,LA_STATE)==LA_CAPTURING);
|
|
assert(la_next(s,p,6)==6 && p[1]==8);
|
|
status[0]=0x5a; status[1]=0x88; status[2]=0; status[3]=6;
|
|
status[4]=0;status[5]=8;response(s,status,7);
|
|
for(offset=0;offset<4096;offset+=64) {
|
|
assert(la_next(s,p,6)==6 && p[1]==9 && p[4]==64);
|
|
assert((unsigned int)(p[2]|(p[3]<<8))==offset);
|
|
block[0]=0x5a;block[1]=0x89;block[2]=0;block[3]=64;
|
|
for(i=0;i<64;++i) { block[4+2*i]=(uint8_t)(offset+i);block[5+2*i]=(uint8_t)((offset+i)>>8); }
|
|
response(s,block,133);
|
|
}
|
|
assert(la_get(s,LA_STATE)==LA_DONE);
|
|
assert(la_samples(s,samples,4095)==0);
|
|
assert(la_samples(s,samples,4096)==4096);
|
|
for(i=0;i<4096;++i) assert(samples[i]==i);
|
|
assert(la_get(s,LA_TRIGGER_INDEX)==2048);
|
|
/* Corrupt XOR, wrong command, device error, timeout and extra data. */
|
|
la_init(s);la_next(s,p,6);
|
|
{ uint8_t bad[]={0x5a,0x81,0,16,0,16,50,1,0};la_feed(s,bad,9); }
|
|
assert(la_get(s,LA_ERROR_CODE)==LA_CHECKSUM);
|
|
la_init(s);la_next(s,p,6);
|
|
{ uint8_t bad[]={0x5a,0x88};la_feed(s,bad,2); }
|
|
assert(la_get(s,LA_ERROR_CODE)==LA_BAD_FRAME);
|
|
la_init(s);la_next(s,p,6);
|
|
{ uint8_t bad[]={0x5a,0x81,1,0};response(s,bad,4); }
|
|
assert(la_get(s,LA_ERROR_CODE)==LA_DEVICE_ERROR);
|
|
la_init(s);la_next(s,p,6);la_tick(s,999);
|
|
assert(la_get(s,LA_STATE)==LA_CONNECTING);la_tick(s,1);
|
|
assert(la_get(s,LA_ERROR_CODE)==LA_TIMEOUT && la_next(s,p,6)==0);
|
|
connect_ok(s);la_feed(s,p,1);assert(la_get(s,LA_ERROR_CODE)==LA_BAD_FRAME);
|
|
la_init(s);la_next(s,p,6);
|
|
{ uint8_t bad[]={0x5a,0x81,0,8,0,16,50,1,0};response(s,bad,9); }
|
|
assert(la_get(s,LA_ERROR_CODE)==LA_UNSUPPORTED);
|
|
la_demo_init(s);assert(la_demo_capture(s,49)==0);
|
|
assert(la_get(s,LA_STATE)==LA_DONE && la_samples(s,samples,4096)==4096);
|
|
free(s);puts("Altera Logic C tests passed");return 0;
|
|
}
|