11use tio:: proto:: DeviceRoute ;
22use tio:: proxy;
33use tio:: util;
4- use twinleaf:: data:: { ColumnData , DeviceDataParser } ;
4+ use twinleaf:: data:: { DeviceDataParser } ;
55use twinleaf:: tio;
66use twinleaf_tools:: { tio_opts, tio_parseopts} ;
77
@@ -515,16 +515,6 @@ fn log_data_dump(args: &[String]) -> Result<(), ()> {
515515 Ok ( ( ) )
516516}
517517
518- fn match_value ( data : ColumnData ) -> String {
519- let data_type = match data {
520- ColumnData :: Int ( x) => format ! ( "{}" , x) ,
521- ColumnData :: UInt ( x) => format ! ( "{}" , x) ,
522- ColumnData :: Float ( x) => format ! ( "{}" , x) ,
523- ColumnData :: Unknown => "?" . to_string ( ) ,
524- } ;
525- data_type
526- }
527-
528518fn log_csv ( args : & [ String ] ) -> Result < ( ) , ( ) > {
529519 let mut parser = DeviceDataParser :: new ( args. len ( ) > 1 ) ;
530520 let id: u8 = args[ 1 ] . parse ( ) . unwrap ( ) ;
@@ -538,61 +528,33 @@ fn log_csv(args: &[String]) -> Result<(), ()> {
538528 . create ( true )
539529 . open ( path)
540530 . or ( Err ( ( ) ) ) ?;
541- let mut streamhead : bool = false ;
542- let mut first : bool = true ;
531+
532+ let mut header_written : bool = false ;
543533
544534 for path in & args[ 2 ..] {
545535 let mut rest: & [ u8 ] = & std:: fs:: read ( path) . unwrap ( ) ;
546536 while rest. len ( ) > 0 {
547537 let ( pkt, len) = tio:: Packet :: deserialize ( rest) . unwrap ( ) ;
548538 rest = & rest[ len..] ;
549539 for sample in parser. process_packet ( & pkt) {
550- //match stream id
551- if sample. stream . stream_id == id as u8 {
552- //iterate through values
553- for col in & sample. columns {
554- let time = format ! ( "{:.6}" , sample. timestamp_end( ) ) ;
555- let value = match_value ( col. value . clone ( ) ) ;
556-
557- //write in column names
558- if !streamhead {
559- let timehead = format ! ( "{}," , "time" ) ;
560- let _ = file. write_all ( timehead. as_bytes ( ) ) ;
561-
562- for col in & sample. columns {
563- let mut header = format ! ( "{}," , col. desc. name) ;
564-
565- if col. desc . name
566- == sample. columns [ & sample. columns . len ( ) - 1 ] . desc . name . clone ( )
567- {
568- header = format ! ( "{}" , col. desc. name) ;
569- }
570-
571- file. write_all ( header. as_bytes ( ) ) . or ( Err ( ( ) ) ) ?;
572- }
573- file. write_all ( b"\n " ) . or ( Err ( ( ) ) ) ?;
574- streamhead = true ;
575- }
576-
577- //write in data
578- let timefmt = format ! ( "{}," , time) ;
579- let mut formatted_value = format ! ( "{}," , value) ;
580- if first {
581- let _ = file. write_all ( timefmt. as_bytes ( ) ) ;
582- first = false ;
583- }
584-
585- if value
586- == match_value ( sample. columns [ & sample. columns . len ( ) - 1 ] . value . clone ( ) )
587- {
588- formatted_value = format ! ( "{}" , value) ;
589- }
590-
591- file. write_all ( formatted_value. as_bytes ( ) ) . or ( Err ( ( ) ) ) ?;
592- }
593- file. write_all ( b"\n " ) . or ( Err ( ( ) ) ) ?;
594- first = true ;
540+ if sample. stream . stream_id != id {
541+ continue ;
595542 }
543+
544+ if !header_written {
545+ let mut headers: Vec < String > = vec ! [ "time" . to_string( ) ] ;
546+ headers. extend ( sample. columns . iter ( ) . map ( |col| col. desc . name . clone ( ) ) ) ;
547+
548+ writeln ! ( file, "{}" , headers. join( "," ) ) . or ( Err ( ( ) ) ) ?;
549+ header_written = true ;
550+ }
551+
552+ let mut values: Vec < String > = Vec :: new ( ) ;
553+ values. push ( format ! ( "{:.6}" , sample. timestamp_end( ) ) ) ;
554+
555+ values. extend ( sample. columns . iter ( ) . map ( |col| col. value . to_string ( ) ) ) ;
556+
557+ writeln ! ( file, "{}" , values. join( "," ) ) . or ( Err ( ( ) ) ) ?;
596558 }
597559 }
598560 }
0 commit comments