' ' Datenlogger MR2, Rev12x2 (c) Avisaro AG, 13.04.2014 ' with timestamp (end of line: ) ' with ring buffering ' ------------------------------------------------ ' Storage mode ' 1 = one file per channel ' 2 = new file every day ' 3 = circular buffer let mode = 1 ' ------------------------------------------------ ' One or two RS232 Ports (1, 2) ? let ports = 2 ' ------------------------------------------------ ' 2nd serial Port Settings if ports = 2 then auxopen -4, 9600, asc("N"), 1, 8, asc("N") end if ' ------------------------------------------------ ' max filesize in MByte (max. 2000 MB) - only for circular buffer let size = 10 ' ------------------------------------------------ ' Max line length (must be < 150) let ml = 80 '------------------------------------------------- inmode -3 outmode -2 if size > 2000 then let size = 2000 end if let size = size * 1000000 ' ------------------------------------------------ let red = -202 let green = -203 let inkey = -204 ' ------------------------------------------------ DIM A(1) DIM B(152) DIM M(1) DIM N(152) let E = 0 let D = 0 let D2 = 0 let z = time let z2 = time let mi = time let mil = millis let delet = 0 let creat = 0 let x = 0 print "Avisaro Timestamp Logger Rev 2.13a."; print ports; print " ,(c) 2012 Avisaro AG ("; print date$;",";time$;")" BEGIN: put green, #1 put red, #0 let n$ = date$ if lof(0) = 0 then sleep 100 goto BEGIN end if if mode > 1 then exec "mkdir logs" end if gosub Datei_erzeugen if LASTERR <> 0 then close 1 close 2 goto BEGIN end if gosub Datei_pruefen ' FIfo leer lesen get -3, A get -4, A ' Tasten entprellen get inkey, in if in = 0 then goto BEGIN end if if lof(0) = 0 then sleep 0 goto BEGIN end if put red, #1 let t = time do REM Daten von RS232 lesen und auf Karte schreiben if mi <> time then ' do background stuff every second let mi = time let mil = millis gosub Datei_pruefen let x = lof(0) REM Beenden ? if (x = 0) or ((KEYS & 1)= 1) then put red, #0 close 1 close 2 goto FIN_KEY end if end if get -3, A if BYTESREAD > 0 then let z = time + 5 put red, #0 if A(0) <> 13 and A(0) <> 10 then let B(D) = A(0) let D = D + 1 if D > (ml - 3) then LET D = ml LET B(ml -2) = 13 LET B(ml -1) = 10 end if end if if A(0) = 10 then let B(D) = 13 let B(D+1) = 10 let D = D + 2 put red, #1 end if if (B((D-1))= 10) then let T$ = date$ + " " + time$ + " " let temp = millis - mil if temp = 1000 then let temp = 999 end if if temp < 10 then let T$ = T$ + "0" end if if temp < 100 then let T$ = T$ + "0" end if let T$ = T$ + str$(temp) let T$ = T$ + " " put 1, T$ put 1 , B, D LET D = 0 end if end if ' timeout ? if ((z = time) and (D > 0)) then put red, #0 let T$ = date$ + " " + time$ + " " let temp = millis - mil if temp < 10 then let T$ = T$ + "0" end if if temp < 100 then let T$ = T$ + "0" end if let T$ = T$ + str$(temp) let T$ = T$ + " " put 1, T$ put 1 , B, D put 1 , #13 put 1 , #10 LET D = 0 put red, #1 end if if ports = 2 then get -4, M if BYTESREAD > 0 then let z2 = time + 5 put red, #0 if M(0) <> 13 and M(0) <> 10 then let N(D2) = M(0) let D2 = D2 + 1 if D2 > (ml - 3) then LET D2 = ml LET N(ml -2) = 13 LET N(ml -1) = 10 end if end if if M(0) = 10 then let N(D2) = 13 let N(D2 +1) = 10 let D2 = D2 + 2 put red, #1 end if if (N((D2-1))= 10) then let T$ = date$ + " " + time$ + " " let temp = millis - mil if temp < 10 then let T$ = T$ + "0" end if if temp < 100 then let T$ = T$ + "0" end if let T$ = T$ + str$(temp) let T$ = T$ + " " put 2, T$ put 2 , N, D2 LET D2 = 0 end if end if ' timeout ? if ((z2 = time) and (D2 > 0)) then put red, #0 let T$ = date$ + " " + time$ + " " let temp = millis - mil if temp < 10 then let T$ = T$ + "0" end if if temp < 100 then let T$ = T$ + "0" end if let T$ = T$ + str$(temp) let T$ = T$ + " " put 2, T$ put 2 , N, D2 put 2 , #13 put 2 , #10 LET D2 = 0 put red, #1 end if end if loop Datei_pruefen: if mode = 1 then return end if if mode = 2 then ' new file ? if n$ <> date$ then let n$ = date$ gosub Datei_erzeugen end if return end if ' --- mode = 3 if (lof(1) > size) then gosub Datei_erzeugen end if if ports = 2 then if (lof(2) > size) then gosub Datei_erzeugen end if end if return FIN_KEY: REM Warten bis Taste nicht gedrückt if (KEYS & 1) = 1 then goto FIN_KEY end if FINISH: put red, #0 REM Warten bis Karte entnommen oder Taste gedrückt let x = lof(0) if (x = 0) or ((KEYS & 1) = 1) then goto BEGIN else goto FINISH end if Datei_erzeugen: close 1 close 2 if mode = 1 then ' one file per channel let f$ = "log_1.txt" open "AB", 1, f$ if (LASTERR <> 0) then open "WB", 1, f$ if LASTERR <> 0 then ' didn't work out let e = 1 return end if end if let f$ = "log_2.txt" open "AB", 2, f$ if (LASTERR <> 0) then open "WB", 2, f$ if LASTERR <> 0 then ' didn't work out let e = 1 return end if end if return end if if mode = 2 then ' every day new file let f$ = "logs/" let f$ = f$ + mid$(date$, 3 , 2) + mid$(date$, 6 , 2) + mid$(date$, 9 , 2) let f$ = f$ + "_1.txt" open "AB", 1, f$ if (LASTERR <> 0) then open "WB", 1, f$ if LASTERR <> 0 then ' didn't work out let e = 1 return end if end if let f$ = "logs/" let f$ = f$ + mid$(date$, 3 , 2) + mid$(date$, 6 , 2) + mid$(date$, 9 , 2) let f$ = f$ + "_2.txt" open "AB", 2, f$ if (LASTERR <> 0) then open "WB", 2, f$ if LASTERR <> 0 then ' didn't work out let e = 1 return end if end if return end if ' --- circular buffer let wd = time + 5 let e = 0 let si = lof(0) if si = 0 then ' Karte nicht drin let e = 1 return end if load 0, creat load 5, delet ' Alte Dateien löschen ? KILLFILE: if wd < time then let e = 1 return end if if (delet < 10000) or (delet > 99998) then ' range check let delet = 10000 save 5, delet end if let temp$ = str$(delet) put -100, temp$ let temp$ = str$(creat) put -101, temp$ let disk = lof(0) let used = loc(0) ' free - etwas resevere für ein file schaffen let free = disk - used - (size/1000) let temp$ = str$(disk) put -102, temp$ let temp$ = str$(used) put -103, temp$ ' neue Karte ? -> Zeiger zurücksetzen if (disk > 0) and (used < 200) then let creat = 1 let delet = 1 save 0, creat save 5, delet end if if free < (size/1000) then ' too little space for new file let k$ = str$(delet) let k$ = "logs/" + k$ + "_1.txt" kill k$ let k$ = str$(delet) let k$ = "logs/" + k$ + "_2.txt" kill k$ let delet = delet + 1 save 5, delet goto KILLFILE end if ' neue Datei erzeugen ? NEWFILE: if wd < time then let e = 1 return end if if (creat < 10000) or (creat > 99998) then ' range check let creat = 10000 save 0, creat end if close 1 let f$ = str$(creat) let f$ = f$ + "_1" let f$ = "logs/" + f$ + ".txt" open "AB", 1, f$ if (LASTERR <> 0) then open "WB", 1, f$ if LASTERR <> 0 then ' didn't work out let e = 1 return end if end if let f$ = str$(creat) let f$ = f$ + "_2" let f$ = "logs/" + f$ + ".txt" open "AB", 2, f$ if (LASTERR <> 0) then open "WB", 2, f$ if LASTERR <> 0 then ' didn't work out let e = 1 return end if end if put -104, f$ let x = lof(1) if x > size then let creat = creat + 1 save 0, creat goto NEWFILE end if return REM +++