Trouble with multiple instances of FatEngine
average joe
Posts: 795
Hi guys, I'm sure this has been answered before but my google foo just isn't working.
I'm trying to log up to 4 serial inputs to independent files. So I have fullduplexSerial4port + 4 instances of FatEngine. Launch a cog to read each serial stream and write to a file. I think everything is right, up to closing the file... Now when I do a capture, I end up with a corrupted SD card?
*edit*
It actually looks like I'm having problems with the name array now!
I'm trying to log up to 4 serial inputs to independent files. So I have fullduplexSerial4port + 4 instances of FatEngine. Launch a cog to read each serial stream and write to a file. I think everything is right, up to closing the file... Now when I do a capture, I end up with a corrupted SD card?
CON Stuff _clkmode = xtal1 + pll16x _clkfreq = 80_000_000 ' pins and stuff _RXn1 = 0 _TXn1 = 1 _BAUDn1 = 115_200 _TRn1 = 15 _n1 = 0 _RXn2 = 2 _TXn2 = 3 _BAUDn2 = 115_200 _TRn2 = 14 _n2 = 1 _RXbase = 4 _TXbase = 5 _BAUDbase = 115_200 _base = 2 _button = 13 _numOfPorts = 3 _stackSize = 250 obj fat[3] : "SD-MMC_FATEngine.spin" pins : "pins.spin" ser : "FullDuplexSerial4portPlus_0v3" VAR long stack[_numOfPorts * _stackSize], runFlag[_numOfPorts] byte cog[_numOfPorts] DAT fileNptrs long @filename1, @filename2, @filename3, @filename4 filename1 byte "Log000s1.csv", 0 filename2 byte "Log000s2.csv", 0 filename3 byte "Log000s3.csv", 0 filename4 byte "Log000s4.csv", 0 PUB Run pins.updateTicks dira[27..26] := %11 outa[27..26] := %10 ser.init ser.AddPort(_n1,_RXn1,_TXn1,ser#PINNOTUSED,ser#PINNOTUSED,ser#DEFAULTTHRESHOLD,ser#NOMODE,_BAUDn1) ser.AddPort(_n2,_RXn2,_TXn2,ser#PINNOTUSED,ser#PINNOTUSED,ser#DEFAULTTHRESHOLD,ser#NOMODE,_BAUDn2) ser.AddPort(_base,_RXbase,_TXbase,ser#PINNOTUSED,ser#PINNOTUSED,ser#DEFAULTTHRESHOLD,ser#NOMODE,_BAUDbase) ' one more port if we want ser.start outa[27..26] := %01 repeat while ina[_button] outa[27..26] := %11 fat.FATEngineStart(pins#_DOPin, pins#_CLKPin, pins#_DIPin, pins#_CSPin, -1, -1, -1, -1, -1) outa[26] := 1 dira[27] := 0 Start repeat until ina[_button] pins.pause1ms(1000) repeat while ina[_button] Stop outa[26] := 0 repeat waitcnt(cnt) PUB Start | n repeat n from 0 to (_numOfPorts - 1) runFlag[n] := true cog[n] := cognew(Ser2SD(n),@stack[n * _stackSize]) + 1 PUB Stop | n repeat n from 0 to (_numOfPorts -1) if cog[n] ' if driver is running runflag[n] := false pins.pause1ms(5000) fat.unmountPartition pins.pause1ms(1000) fat.FATEngineStop PUB Ser2SD(port) | b[128], n, c fat[port].mountPartition(0) fat[port].newFile(fileNptrs[port]) fat[port].openFile(fileNptrs[port], "W") n := 0 repeat while runFlag[port] if (c := ser.rxcheck(port)) <> -1 b.byte[n ++] := c if c == 13 or n == 512 fat[port].writeData(@b, n) n := 0 dira[27] := 1 outa[27] := 1 pins.pause1ms(100) dira[27] := 0 fat[port].writeData(@b, n ) fat[port].closeFile cogstop(cogid)
*edit*
It actually looks like I'm having problems with the name array now!
Comments
Sure enough! That fixed it.
This works, but I don't like the idea of using static names. What I'd like to do is have a name prototype, say "log"xxx"p"x".csv" and have the filename increment. I think the key is listEntry(entryPathName) but haven't quite wrapped my head around it.