Add shared waveform processing, generation and firmware image support
This commit is contained in:
22
c/set-protocol/tests/test_firmware_image.c
Normal file
22
c/set-protocol/tests/test_firmware_image.c
Normal file
@@ -0,0 +1,22 @@
|
||||
#include "firmware_image.h"
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
static int parse(const char *text, firmware_hex_cell_t *cells, size_t cap, size_t *count)
|
||||
{ size_t line; return firmware_hex_parse(text, strlen(text), cells, cap, 100, count, &line); }
|
||||
int main(void)
|
||||
{
|
||||
firmware_hex_cell_t cells[32]; size_t count;
|
||||
const char *good = ":020000040800F2\n:0400100001020304E2\n:00000001FF\n";
|
||||
assert(parse(good,cells,32,&count)==0 && count==4);
|
||||
assert(cells[0].address==0x08000010U && cells[3].value==4);
|
||||
assert(firmware_hex_segment_size(cells,count,0)==4);
|
||||
assert(parse(good,cells,3,&count)==FW_HEX_CAPACITY && count==0);
|
||||
assert(parse(":0100000001FE\n:0100000001FE\n:00000001FF",cells,32,&count)==FW_HEX_OVERLAP);
|
||||
assert(parse(":0100000001FF\n:00000001FF",cells,32,&count)==FW_HEX_CHECKSUM);
|
||||
assert(parse(":0100000001FE",cells,32,&count)==FW_HEX_EOF);
|
||||
assert(parse(":0100000001FE\n:00000001FF\n:0100010002FC",cells,32,&count)==FW_HEX_EOF);
|
||||
assert(parse(":0100010002FC\n:0100000001FE\n:00000001FF",cells,32,&count)==0);
|
||||
assert(cells[0].value==1 && cells[1].value==2);
|
||||
assert(parse(":02000004FFFFFC\n:02FFFF000102FD\n:00000001FF",cells,32,&count)==FW_HEX_RANGE);
|
||||
return 0;
|
||||
}
|
||||
51
c/set-protocol/tests/test_signal_wave.c
Normal file
51
c/set-protocol/tests/test_signal_wave.c
Normal file
@@ -0,0 +1,51 @@
|
||||
#include "set_signal.h"
|
||||
#include "set_wavegen.h"
|
||||
#include <assert.h>
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
static int starts,stops;
|
||||
static int start(void *ctx,const uint16_t *p,size_t n,uint32_t rate) {
|
||||
(void)ctx;assert(n==3&&rate==1000&&p[2]==4095);++starts;return 0;
|
||||
}
|
||||
static void stop(void *ctx) {(void)ctx;++stops;}
|
||||
static int exchange(set_wave_state *s,unsigned op,unsigned index,unsigned value,uint16_t *out) {
|
||||
uint8_t req[8],reply[32];size_t n;
|
||||
assert(set_wave_request(16,op,index,value,req,8)==8);
|
||||
n=set_wave_rtu(s,16,req,8,reply,sizeof(reply));assert(n>0);
|
||||
assert(set_wave_response(req,reply,n-1,out,8)==0);
|
||||
return set_wave_response(req,reply,n,out,8);
|
||||
}
|
||||
int main(void) {
|
||||
double x[3]={0,1,2},y[3]={0,1,0},ox[5],oy[5],meta[3],work[170];
|
||||
uint16_t samples[8],out[8],codes[3];set_wave_state state;
|
||||
set_wave_port port={0,start,stop};uint8_t req[8],reply[32];
|
||||
assert(!set_signal_reconstruct(x,y,3,SET_SIGNAL_SPLINE,2,5,1,ox,oy,meta,work,170));
|
||||
assert(fabs(oy[1]-.6875)<1e-12&&fabs(oy[3]-.6875)<1e-12&&meta[2]<1e-12);
|
||||
y[1]=1.65;y[2]=3.3;assert(!set_signal_dac12(y,3,3.3,codes));
|
||||
assert(codes[0]==0&&codes[1]==2048&&codes[2]==4095);
|
||||
y[0]=-1;codes[0]=123;assert(set_signal_dac12(y,3,3.3,codes)&&codes[0]==123);
|
||||
set_wave_init(&state,samples,8,&port);
|
||||
assert(exchange(&state,0,0,0,out)==8&&out[0]==0x5747&&out[7]==8);
|
||||
assert(exchange(&state,6,0,0,out)<0&&starts==0);
|
||||
assert(exchange(&state,1,0,0,out)==1&&stops==1);
|
||||
assert(exchange(&state,2,0,1000,out)==1);
|
||||
assert(exchange(&state,3,0,3,out)==1);
|
||||
assert(exchange(&state,4,1,10,out)<0); /* no holes */
|
||||
assert(exchange(&state,4,0,0,out)==1);
|
||||
assert(exchange(&state,4,0,0,out)==1&&state.received==1); /* idempotent replay */
|
||||
assert(exchange(&state,4,0,5,out)<0);
|
||||
assert(exchange(&state,5,0,0,out)<0); /* incomplete upload cannot commit */
|
||||
assert(exchange(&state,4,1,2048,out)==1);
|
||||
assert(exchange(&state,4,2,4095,out)==1);
|
||||
assert(exchange(&state,7,1,0,out)==1&&out[0]==2048);
|
||||
assert(exchange(&state,5,0,0,out)==1&&state.ready);
|
||||
assert(exchange(&state,6,0,0,out)==1&&state.running&&starts==1);
|
||||
assert(exchange(&state,3,0,2,out)<0&&state.count==3);
|
||||
assert(exchange(&state,4,0,2,out)<0&&samples[0]==0);
|
||||
set_wave_request(16,1,0,0,req,8);req[7]^=1;
|
||||
assert(!set_wave_rtu(&state,16,req,8,reply,32)&&state.running);
|
||||
set_wave_request(17,1,0,0,req,8);
|
||||
assert(!set_wave_rtu(&state,16,req,8,reply,32)&&state.running);
|
||||
assert(exchange(&state,1,0,0,out)==1&&!state.running);
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user