#include "gas_logger.h" #include #include typedef struct { uint32_t irq; uint16_t value; int fail; } board; static uint32_t enter(void *u) { board *b=u; uint32_t old=b->irq; b->irq=1; return old; } static void leave(void *u,uint32_t state) { board *b=u; assert(b->irq==1); b->irq=state; } static int source(void *u,uint16_t a,uint16_t *v) { board *b=u; assert(b->irq==1); if(b->fail && a==11) return 0; *v=b->value+a; return 1; } int main(void) { gl_channel channels[]={{10,100,200},{11,101,201}}; gl_config c={0x6000,2,3,0x12345678UL,channels}; board b={0,0,0}; gl_port p={&b,enter,leave,source}; gas_logger l; uint16_t bank0[21],bank1[21],out[125],i; assert(gl_init(&l,&c,&p,bank0,bank1,20)==GL_ARGUMENT); assert(gl_init(&l,&c,&p,bank0,bank1,21)==GL_OK); assert(gl_snapshot(&l)==GL_EMPTY); assert(gl_capture(&l,0,0)==GL_BUSY); assert(gl_write(&l,0x6012,GL_START)==GL_OK); for(i=0;i<5;i++) { b.value=i; assert(gl_capture(&l,i,2)==GL_OK); } assert(gl_snapshot(&l)==GL_OK && l.recording && l.count==0); assert(gl_read(&l,0x6100,out,21)==GL_OK); assert(out[0]==2 && out[7]==3 && out[14]==4 && out[5]==12); for(i=5;i<15;i++) { b.value=i; assert(gl_capture(&l,i,3)==GL_OK); } assert(gl_snapshot(&l)==GL_BUSY && l.missed==1 && l.recording); assert(gl_read(&l,0x6100,out,21)==GL_OK && out[0]==2 && out[14]==4); assert(gl_read(&l,0x6114,out,2)==GL_ADDRESS); assert(gl_read(&l,65535,out,2)==GL_ARGUMENT); assert(gl_write(&l,0x6012,GL_RELEASE)==GL_STALE); assert(gl_write(&l,0x6013,1)==GL_OK); assert(gl_write(&l,0x6014,0)==GL_OK); assert(gl_write(&l,0x6012,GL_RELEASE)==GL_OK && l.recording); assert(gl_read(&l,0x6100,out,1)==GL_ADDRESS); assert(gl_snapshot(&l)==GL_OK); assert(gl_read(&l,0x6100,out,21)==GL_OK && out[0]==12 && out[14]==14); assert(gl_modbus_read(&l,100,out,2)==GL_OK && out[0]==24 && out[1]==25); assert(gl_can_read(&l,200,out,2)==GL_OK && out[0]==24 && out[1]==25); b.fail=1; out[0]=555;out[1]=666; assert(gl_read(&l,10,out,2)==GL_SOURCE_ERROR && out[0]==555 && out[1]==666); assert(gl_capture(&l,15,0)==GL_SOURCE_ERROR && l.count==0 && l.source_errors==1); b.fail=0;b.irq=1; assert(gl_capture(&l,16,0)==GL_OK && b.irq==1); b.irq=0;l.sequence=0xffffffffUL; assert(gl_capture(&l,0xffffffffUL,0)==GL_OK && l.sequence==0); assert(gl_write(&l,0x6012,0)==GL_ARGUMENT && l.recording); c.base=0xff00; assert(gl_init(&l,&c,&p,bank0,bank1,21)==GL_ARGUMENT); c.base=0x6000;channels[1].can=200; assert(gl_init(&l,&c,&p,bank0,bank1,21)==GL_ARGUMENT); assert(b.irq==0); puts("GAS logger core: PASS");return 0; }