From 02c6bd124f16bb9a401216b9064b88deacdd0e7c Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Tue, 23 Sep 2025 22:25:07 +0300 Subject: [PATCH] cont --- F3:F303/MLX90640multi/i2c.c | 3 +- F3:F303/MLX90640multi/main.c | 17 +- F3:F303/MLX90640multi/mlx90640.bin | Bin 14460 -> 24696 bytes F3:F303/MLX90640multi/mlx90640.c | 3 +- F3:F303/MLX90640multi/mlx90640.creator.user | 2 +- F3:F303/MLX90640multi/mlxproc.c | 169 +++++++++++++------- F3:F303/MLX90640multi/mlxproc.h | 17 +- F3:F303/MLX90640multi/proto.c | 74 +++++---- F3:F303/MLX90640multi/version.inc | 4 +- 9 files changed, 175 insertions(+), 114 deletions(-) diff --git a/F3:F303/MLX90640multi/i2c.c b/F3:F303/MLX90640multi/i2c.c index c0379c1..7407783 100644 --- a/F3:F303/MLX90640multi/i2c.c +++ b/F3:F303/MLX90640multi/i2c.c @@ -44,7 +44,7 @@ static volatile uint16_t dma_remain = 0; // remain bytes of DMA read/write static inline int isI2Cbusy(){ cntr = Tms; do{ - if(Tms - cntr > I2C_TIMEOUT){ U("Timeout, DMA transfer in progress?"); return 1;} + if(Tms - cntr > I2C_TIMEOUT){ USND("Timeout, DMA transfer in progress?"); return 1;} }while(I2Cbusy); return 0; } @@ -329,6 +329,7 @@ void i2c_bufdudump(){ // get DMA buffer with conversion to little-endian (if transfer was for 16-bit) uint16_t *i2c_dma_getbuf(uint16_t *len){ + if(i2c_got_DMA) USND("DMA GOT!"); if(!i2c_got_DMA || i2cbuflen < 1) return NULL; i2c_got_DMA = 0; i2cbuflen >>= 1; // for hexdump16 - now buffer have uint16_t! diff --git a/F3:F303/MLX90640multi/main.c b/F3:F303/MLX90640multi/main.c index d4ca7cc..f6697cc 100644 --- a/F3:F303/MLX90640multi/main.c +++ b/F3:F303/MLX90640multi/main.c @@ -44,7 +44,8 @@ int main(void){ i2c_setup(I2C_SPEED_100K); USB_setup(); USBPU_ON(); - uint32_t ctr = Tms, Tlastima = 0; + uint32_t ctr = Tms, Tlastima[N_SESORS] = {0}; + mlx_continue(); // init state machine while(1){ if(Tms - ctr > 499){ ctr = Tms; @@ -66,13 +67,13 @@ int main(void){ } } mlx_process(); - if(cartoon){ - uint32_t Tnow = mlx_lastimT(); - if(Tnow != Tlastima){ - fp_t *i = mlx_getimage(&Tnow); - if(i){ - U("Timage="); USND(u2str(Tnow)); drawIma(i); - Tlastima = Tnow; + if(cartoon) for(int i = 0; i < N_SESORS; ++i){ + uint32_t Tnow = mlx_lastimT(i); + if(Tnow != Tlastima[i]){ + fp_t *im = mlx_getimage(i); + if(im){ + U("Timage="); USND(u2str(Tnow)); drawIma(im); + Tlastima[i] = Tnow; } } } diff --git a/F3:F303/MLX90640multi/mlx90640.bin b/F3:F303/MLX90640multi/mlx90640.bin index 06ac0442b68e6cf52b38a9e5a14541686287e6ec..330aaa26ea6c3da926f0746699a33ec168e10c23 100755 GIT binary patch literal 24696 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 literal 14460 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 / (1<resolEE) / (1<resolEE) / (1<<2); // ONLY DEFAULT! int16_t i16a; fp_t dvdd, dTa, Kgain, pixOS[2]; // values for both subpages // 11.2.2.2. Supply voltage value calculation diff --git a/F3:F303/MLX90640multi/mlx90640.creator.user b/F3:F303/MLX90640multi/mlx90640.creator.user index 5594cc8..87043fd 100644 --- a/F3:F303/MLX90640multi/mlx90640.creator.user +++ b/F3:F303/MLX90640multi/mlx90640.creator.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/F3:F303/MLX90640multi/mlxproc.c b/F3:F303/MLX90640multi/mlxproc.c index 9ac2dc7..4986863 100644 --- a/F3:F303/MLX90640multi/mlxproc.c +++ b/F3:F303/MLX90640multi/mlxproc.c @@ -21,36 +21,44 @@ #include "i2c.h" #include "mlxproc.h" #include "mlx90640_regs.h" -//#include "usb_dev.h" -//#include "strfunc.h" +#include "usb_dev.h" +#include "strfunc.h" extern volatile uint32_t Tms; // current state and state before `stop` called -static mlx_state_t MLX_state = MLX_NOTINIT, MLX_oldstate = MLX_NOTINIT; -static MLX90640_params p; -static int parsrdy = 0; -static uint8_t MLX_address = 0x33 << 1; +static mlx_state_t MLX_state = MLX_RELAX, MLX_oldstate = MLX_RELAX; static int errctr = 0; // errors counter - cleared by mlx_continue -static uint32_t Tlastimage = 0; -static uint8_t resolution = 2; // default: 18bit +static uint32_t Tlastimage[N_SESORS] = {0}; -static int16_t subpage1[REG_IMAGEDATA_LEN]; +// subpages and configs of all sensors +static int16_t imdata[N_SESORS][REG_IMAGEDATA_LEN]; +static uint16_t confdata[N_SESORS][MLX_DMA_MAXLEN]; +static uint8_t sens_addresses[N_SESORS] = {0x10<<1, 0x11<<1, 0x12<<1, 0x13<<1, 0x14<<1}; // addresses of all sensors (if 0 - omit this one) +static uint8_t sensaddr[N_SESORS]; + +static int sensno = -1; // get current state mlx_state_t mlx_state(){ return MLX_state; } // set address -int mlx_setaddr(uint8_t addr){ +int mlx_setaddr(int n, uint8_t addr){ + if(n < 0 || n > N_SESORS) return 0; if(addr > 0x7f) return 0; - MLX_address = addr << 1; - Tlastimage = Tms; // refresh counter for autoreset I2C in case of error + sens_addresses[n] = addr << 1; + Tlastimage[n] = Tms; // refresh counter for autoreset I2C in case of error return 1; } -// temporary stop -void mlx_stop(){ +// pause state machine and stop +void mlx_pause(){ MLX_oldstate = MLX_state; MLX_state = MLX_RELAX; } +void mlx_stop(){ + MLX_oldstate = MLX_NOTINIT; + MLX_state = MLX_RELAX; +} + // continue processing void mlx_continue(){ errctr = 0; @@ -62,96 +70,145 @@ void mlx_continue(){ //case MLX_NOTINIT: //case MLX_WAITPARAMS: default: + memcpy(sensaddr, sens_addresses, sizeof(sens_addresses)); MLX_state = MLX_NOTINIT; + sensno = -1; break; } } +static int nextsensno(int s){ + if(mlx_nactive() == 0){ + mlx_stop(); + return -1; + } + int next = s + 1; + for(; next < N_SESORS; ++next) if(sensaddr[next]) break; + if(next == N_SESORS) return nextsensno(-1); // roll to start + U(i2str(next)); USND(" - new sensor number"); + return next; +} + +// count active sensors +int mlx_nactive(){ + int N = 0; + for(int i = 0; i < N_SESORS; ++i) if(sensaddr[i]) ++N; + return N; +} + +/** + * @brief mlx_process - main state machine + * 1. Process conf data for each sensor + * 2. Start image processing and store subpage1 for each sensor + */ void mlx_process(){ + static uint32_t TT = 0; + if(Tms == TT) return; + TT = Tms; // static uint32_t Tlast = 0; static int subpage = 0; + if(MLX_state == MLX_RELAX) return; + if(sensno == -1){ // init + sensno = nextsensno(-1); + if(-1 == sensno) return; // no sensors found + } switch(MLX_state){ case MLX_NOTINIT: // start reading parameters - if(i2c_read_reg16(MLX_address, REG_CALIDATA, MLX_DMA_MAXLEN, 1)){ + if(i2c_read_reg16(sensaddr[sensno], REG_CALIDATA, MLX_DMA_MAXLEN, 1)){ + U(i2str(sensno)); USND(" wait conf"); errctr = 0; MLX_state = MLX_WAITPARAMS; }else ++errctr; break; case MLX_WAITPARAMS: // check DMA ends and calculate parameters - if(i2c_dma_haderr()) MLX_state = MLX_NOTINIT; + if(i2c_dma_haderr()){ MLX_state = MLX_NOTINIT; USND("DMA err");} else{ uint16_t len, *buf = i2c_dma_getbuf(&len); - if(buf){ - if(len != MLX_DMA_MAXLEN) MLX_state = MLX_NOTINIT; - else if(get_parameters(buf, &p)){ - errctr = 0; - MLX_state = MLX_WAITSUBPAGE; // fine! we could wait subpage - parsrdy = 1; - } - } + if(buf) USND("READ"); + else break; + if(len != MLX_DMA_MAXLEN){ MLX_state = MLX_NOTINIT; break; } + memcpy(confdata[sensno], buf, MLX_DMA_MAXLEN * sizeof(uint16_t)); + U(i2str(sensno)); USND(" got conf"); + int next = nextsensno(sensno); + errctr = 0; + if(next <= sensno) MLX_state = MLX_WAITSUBPAGE; // all configuration read + else MLX_state = MLX_NOTINIT; // read next + sensno = next; + return; } break; case MLX_WAITSUBPAGE: // wait for subpage 1 ready - {uint16_t *got = i2c_read_reg16(MLX_address, REG_STATUS, 1, 0); + {uint16_t *got = i2c_read_reg16(sensaddr[sensno], REG_STATUS, 1, 0); if(got && *got & REG_STATUS_NEWDATA){ if(subpage == (*got & REG_STATUS_SPNO)){ - if(subpage == 0){ subpage = 1; break; } - if(i2c_read_reg16(MLX_address, REG_IMAGEDATA, REG_IMAGEDATA_LEN, 1)){ + errctr = 0; + if(subpage == 0){ // omit zero subpage for each sensor + int next = nextsensno(sensno); + if(next <= sensno) subpage = 1; // all scanned - now wait for page 1 + break; + } + if(i2c_read_reg16(sensaddr[sensno], REG_IMAGEDATA, REG_IMAGEDATA_LEN, 1)){ errctr = 0; MLX_state = MLX_READSUBPAGE; // U("spstart"); USB_putbyte('0'+subpage); USB_putbyte('='); USND(u2str(Tms - Tlast)); }else ++errctr; } - }} + }else ++errctr; + } break; case MLX_READSUBPAGE: // wait ends of DMA read and calculate subpage - if(i2c_dma_haderr()) MLX_state = MLX_NOTINIT; + if(i2c_dma_haderr()) MLX_state = MLX_WAITSUBPAGE; else{ uint16_t len, *buf = i2c_dma_getbuf(&len); if(buf){ // U("spread="); USND(u2str(Tms - Tlast)); if(len != REG_IMAGEDATA_LEN){ - MLX_state = MLX_WAITSUBPAGE; - }else{ + ++errctr; + }else{ // fine! we could check next sensor errctr = 0; - memcpy(subpage1, buf, REG_IMAGEDATA_LEN * sizeof(int16_t)); - MLX_state = MLX_WAITSUBPAGE; // fine! we could wait next subpage + memcpy(imdata[sensno], buf, REG_IMAGEDATA_LEN * sizeof(int16_t)); // U("spgot="); USND(u2str(Tms - Tlast)); - Tlastimage = Tms; - // U("imgot="); USND(u2str(Tms - Tlast)); Tlast = Tms; + Tlastimage[sensno] = Tms; + // U("imgot="); USND(u2str(Tms - Tlast)); Tlast = Tms; + int next = nextsensno(sensno); + if(next <= sensno) subpage = 0; // roll to start - omit page 0 for all } - subpage = 0; + MLX_state = MLX_WAITSUBPAGE; } } break; default: return; } - if(MLX_state != MLX_RELAX && Tms - Tlastimage > MLX_I2CERR_TMOUT){ i2c_setup(i2c_curspeed); Tlastimage = Tms; } - if(errctr > MLX_MAX_ERRORS) mlx_stop(); + if(MLX_state != MLX_RELAX && Tms - Tlastimage[sensno] > MLX_I2CERR_TMOUT){ i2c_setup(i2c_curspeed); Tlastimage[sensno] = Tms; } + if(errctr > MLX_MAX_ERRORS){ + errctr = 0; + sensaddr[sensno] = 0; // throw out this value + sensno = nextsensno(sensno); + } } -// get parameters - memcpy to user's -int mlx_getparams(MLX90640_params *pars){ - if(!pars || !parsrdy) return 0; - memcpy(pars, &p, sizeof(p)); +// recalculate parameters +int mlx_getparams(int n, MLX90640_params *pars){ + if(!pars) return 0; + if(!get_parameters(confdata[n], pars)) return 0; return 1; } -uint32_t mlx_lastimT(){ return Tlastimage; } +uint32_t mlx_lastimT(int n){ return Tlastimage[n]; } -fp_t *mlx_getimage(uint32_t *Tgot){ - fp_t *ready_image = process_image(&p, subpage1); +fp_t *mlx_getimage(int n){ + if(n < 0 || n >= N_SESORS || !sensaddr[n]) return NULL; + MLX90640_params p; + if(!get_parameters(confdata[n], &p)) return NULL; + fp_t *ready_image = process_image(&p, imdata[n]); if(!ready_image) return NULL; - if(Tgot) *Tgot = Tlastimage; return ready_image; } -uint8_t mlx_getresolution(){ - return resolution; -} - -int mlx_sethwaddr(uint8_t addr){ +// this function can be run only when state machine is paused/stopped! +// WARNING: `MLX_address` is shifted, `addr` - NOT! +int mlx_sethwaddr(uint8_t MLX_address, uint8_t addr){ if(addr > 0x7f) return 0; uint16_t data[2], *ptr; if(!(ptr = i2c_read_reg16(MLX_address, REG_MLXADDR, 1, 0))) return 0; @@ -179,13 +236,3 @@ int mlx_sethwaddr(uint8_t addr){ return 1; } -int mlx_setresolution(uint8_t newresol){ - if(newresol > 3) return 0; - uint16_t data[2], *ptr; - if(!(ptr = i2c_read_reg16(MLX_address, REG_CONTROL, 1, 0))) return 0; - data[0] = REG_CONTROL; - data[1] = (*ptr & ~REG_CONTROL_RESMASK) | (newresol << 10); - if(!i2c_write(MLX_address, data, 2)) return 0; - resolution = newresol; - return 1; -} diff --git a/F3:F303/MLX90640multi/mlxproc.h b/F3:F303/MLX90640multi/mlxproc.h index f7a4006..a93032d 100644 --- a/F3:F303/MLX90640multi/mlxproc.h +++ b/F3:F303/MLX90640multi/mlxproc.h @@ -22,6 +22,9 @@ #include "mlx90640.h" +// amount of sensors processing +#define N_SESORS (5) + // maximal errors number to stop processing #define MLX_MAX_ERRORS (11) // if there's no new data by this time - reset bus @@ -35,14 +38,14 @@ typedef enum{ MLX_RELAX // do nothing - pause } mlx_state_t; -int mlx_setaddr(uint8_t addr); +int mlx_setaddr(int n, uint8_t addr); mlx_state_t mlx_state(); +int mlx_nactive(); +void mlx_pause(); void mlx_stop(); void mlx_continue(); void mlx_process(); -int mlx_getparams(MLX90640_params *pars); -fp_t *mlx_getimage(uint32_t *Tgot); -int mlx_setresolution(uint8_t newresol); -uint8_t mlx_getresolution(); -int mlx_sethwaddr(uint8_t addr); -uint32_t mlx_lastimT(); +int mlx_getparams(int sensno, MLX90640_params *pars); +fp_t *mlx_getimage(int sensno); +int mlx_sethwaddr(uint8_t MLX_address, uint8_t addr); +uint32_t mlx_lastimT(int sensno); diff --git a/F3:F303/MLX90640multi/proto.c b/F3:F303/MLX90640multi/proto.c index 6e2ce99..0fd60db 100644 --- a/F3:F303/MLX90640multi/proto.c +++ b/F3:F303/MLX90640multi/proto.c @@ -41,12 +41,12 @@ const char *helpstring = "d - draw image in ASCII\n" "i0..4 - setup I2C with speed 10k, 100k, 400k, 1M or 2M (experimental!)\n" "p - pause MLX\n" - "r0..3 - change resolution (0 - 16bit, 3 - 19-bit)\n" + "s - stop MLX (and start from zero @ 'c'\n" "t - show temperature map\n" "C - \"cartoon\" mode on/off (show each new image)\n" - "D - dump MLX parameters\n" + "Dn - dump MLX parameters for sensor number n\n" "G - get MLX state\n" - "Ia addr - set device address\n" + "Ia addr [n] - set device address for interactive work or (with n) change address of n'th sensor\n" "Ir reg n - read n words from 16-bit register\n" "Iw words - send words (hex/dec/oct/bin) to I2C\n" "Is - scan I2C bus\n" @@ -78,7 +78,7 @@ TRUE_INLINE const char *chhwaddr(const char *buf){ if(buf && *buf){ const char *nxt = getnum(buf, &a); if(nxt && nxt != buf){ - if(!mlx_sethwaddr(a)) return ERR; + if(!mlx_sethwaddr(I2Caddress, a)) return ERR; }else{ USND("Wrong number"); return ERR; @@ -90,24 +90,16 @@ TRUE_INLINE const char *chhwaddr(const char *buf){ return OK; } -TRUE_INLINE const char *chres(const char *buf){ - uint32_t r; - if(buf && *buf){ - const char *nxt = getnum(buf, &r); - if(nxt && nxt != buf) if(!mlx_setresolution(r)) return ERR; - } - r = mlx_getresolution(); - U("MLXRESOLUTION="); USND(u2str(r)); - return NULL; -} - TRUE_INLINE const char *chaddr(const char *buf){ - uint32_t addr; + uint32_t addr, num; const char *nxt = getnum(buf, &addr); if(nxt && nxt != buf){ if(addr > 0x7f) return ERR; - mlx_setaddr(addr); I2Caddress = (uint8_t) addr << 1; + buf = getnum(nxt, &num); + if(buf && nxt != buf && num < N_SESORS){ + mlx_setaddr(num, addr); + } }else addr = I2Caddress >> 1; U("I2CADDR="); USND(uhex2str(addr)); return NULL; @@ -163,9 +155,13 @@ static void dumpfarr(float *arr){ } } // dump MLX parameters -TRUE_INLINE void dumpparams(){ +TRUE_INLINE void dumpparams(const char *buf){ + uint32_t N = 0; + const char *nxt = getnum(buf, &N); + U(u2str(N)); USND("sn"); + if(!nxt || buf == nxt || N > N_SESORS){ U(ERR); return; } MLX90640_params params; - if(!mlx_getparams(¶ms)){ U(ERR); return; } + if(!mlx_getparams(N, ¶ms)){ U(ERR); return; } U("\nkVdd="); printi(params.kVdd); U("\nvdd25="); printi(params.vdd25); U("\nKvPTAT="); printfl(params.KvPTAT, 4); @@ -221,17 +217,35 @@ TRUE_INLINE void getst(){ USND(states[s]); } +// `draw`==1 - draw, ==0 - show T map +static const char *drawimg(const char *buf, int draw){ + uint32_t sensno; + const char *nxt = getnum(buf, &sensno); + if(nxt && nxt != buf && sensno < N_SESORS){ + uint32_t T = mlx_lastimT(sensno); + fp_t *img = mlx_getimage(sensno); + if(img){ + U("Timage="); USND(u2str(T)); + if(draw) drawIma(img); + else dumpIma(img); + return NULL; + } + } + return ERR; +} + const char *parse_cmd(char *buf){ if(!buf || !*buf) return NULL; - uint32_t u32; if(buf[1]){ switch(*buf){ // "long" commands case 'a': return chhwaddr(buf + 1); case 'i': return setupI2C(buf + 1); - case 'r': - return chres(buf + 1); + case 'D': + dumpparams(buf + 1); + return; + break; case 'I': buf = omit_spaces(buf + 1); switch(*buf){ @@ -257,25 +271,19 @@ const char *parse_cmd(char *buf){ mlx_continue(); return OK; break; case 'd': - {fp_t *i = mlx_getimage(&u32); - if(i){ U("Timage="); USND(u2str(u32)); drawIma(i); } - else U(ERR);} + return drawimg(buf+1, 1); break; case 'i': return setupI2C(NULL); // current settings case 'p': - mlx_stop(); return OK; + mlx_pause(); return OK; break; - case 'r': return chres(NULL); + case 's': + mlx_stop(); return OK; case 't': - {fp_t *i = mlx_getimage(&u32); - if(i){ U("Timage="); USND(u2str(u32)); dumpIma(i); } - else U(ERR);} + return drawimg(buf+1, 0); break; case 'C': cartoon = !cartoon; return OK; - case 'D': - dumpparams(); - break; case 'G': getst(); break; diff --git a/F3:F303/MLX90640multi/version.inc b/F3:F303/MLX90640multi/version.inc index d495d31..b668fbf 100644 --- a/F3:F303/MLX90640multi/version.inc +++ b/F3:F303/MLX90640multi/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "14" -#define BUILD_DATE "2025-09-22" +#define BUILD_NUMBER "30" +#define BUILD_DATE "2025-09-23"