diff --git a/rescuesdriq/readme.md b/rescuesdriq/readme.md index 83a33ed93..6d2092bc0 100644 --- a/rescuesdriq/readme.md +++ b/rescuesdriq/readme.md @@ -12,9 +12,9 @@ The header is composed as follows: - Sample size as 16 or 24 bits (4 bytes, 32 bits) - filler with all zeroes (4 bytes, 32 bits) - CRC32 (IEEE) of the 28 bytes above (4 bytes, 32 bits) - -The header size is 32 bytes in total which is a multiple of 8 bytes thus occupies an integer number of samples whether in 16 or 24 bits mode. When migrating from a pre version 4.2.1 header you may crunch a very small amount of samples. - + +The header size is 32 bytes in total which is a multiple of 8 bytes thus occupies an integer number of samples whether in 16 or 24 bits mode. When migrating from a pre version 4.2.1 header you may crunch a very small amount of samples. + You can replace values in the header with the following options: - -sr uint @@ -28,21 +28,21 @@ You can replace values in the header with the following options: - -sz uint Sample size (16 or 24) (default 16) -You need to specify an input file. If no output file is specified the current header values are printed to the console and the program exits: - +You need to specify an input file. If no output file is specified the current header values are printed to the console and the program exits: + - -in string input file (default "foo") - + To convert to a new file you need to specify the output file: - -out string output file (default "foo") - -You can specify a block size in multiples of 4k for the copy. Large blocks will yield a faster copy but a larger output file. With the default of 1 (4k) the copy does not take much time anyway: - + +You can specify a block size in multiples of 4k for the copy. Large blocks will yield a faster copy but a larger output file. With the default of 1 (4k) the copy does not take much time anyway: + - -bz uint Copy block size in multiple of 4k (default 1) - +

Build

The program is written in go and is provided only in source code form. Compiling it is very easy: @@ -55,5 +55,11 @@ You will usually find a `golang` package in your distribution. For example in Ub In this directory just do `go build` - - \ No newline at end of file +

Unit testing

+ +Unit test (very simple) is located in `rescuesdriq_test.go`. It uses the [Go Convey](https://github.com/smartystreets/goconvey) framework. You should first install it with: +`go get github.com/smartystreets/goconvey` + +You can run unit test from command line with: `go test` + +Or with the Go Convey server that you start from this directory with: `$GOPATH/bin/goconvey` where `$GOPATH` is the path to your go installation. diff --git a/rescuesdriq/rescuesdriq.go b/rescuesdriq/rescuesdriq.go index 6149140b1..adbfdf619 100644 --- a/rescuesdriq/rescuesdriq.go +++ b/rescuesdriq/rescuesdriq.go @@ -1,41 +1,39 @@ package main import ( + "bufio" + "bytes" + "encoding/binary" "flag" "fmt" - "bufio" - "io" - "os" - "bytes" - "encoding/binary" - "time" - "hash/crc32" + "hash/crc32" + "io" + "os" + "time" ) - type HeaderStd struct { - SampleRate uint32 - CenterFrequency uint64 - StartTimestamp int64 - SampleSize uint32 - Filler uint32 - CRC32 uint32 + SampleRate uint32 + CenterFrequency uint64 + StartTimestamp int64 + SampleSize uint32 + Filler uint32 + CRC32 uint32 } - func check(e error) { - if e != nil { - panic(e) - } + if e != nil { + panic(e) + } } func analyze(r *bufio.Reader) HeaderStd { - headerbuf := make([]byte, 32) // This is a full header with CRC + headerbuf := make([]byte, 32) // This is a full header with CRC n, err := r.Read(headerbuf) if err != nil && err != io.EOF { panic(err) } - if (n != 32) { + if n != 32 { panic("Header too small") } @@ -44,7 +42,7 @@ func analyze(r *bufio.Reader) HeaderStd { err = binary.Read(headerr, binary.LittleEndian, &header) check(err) - return header + return header } func writeHeader(writer *bufio.Writer, header *HeaderStd) { @@ -62,7 +60,7 @@ func setCRC(header *HeaderStd) { header.CRC32 = crc32.ChecksumIEEE(bin_buf.Bytes()[0:28]) } -func getCRC(header *HeaderStd) uint32 { +func GetCRC(header *HeaderStd) uint32 { var bin_buf bytes.Buffer header.Filler = 0 binary.Write(&bin_buf, binary.LittleEndian, header) @@ -70,13 +68,13 @@ func getCRC(header *HeaderStd) uint32 { } func printHeader(header *HeaderStd) { - fmt.Println("Sample rate:", header.SampleRate) - fmt.Println("Frequency :", header.CenterFrequency) - fmt.Println("Sample Size:", header.SampleSize) - tm := time.Unix(header.StartTimestamp, 0) - fmt.Println("Start :", tm) + fmt.Println("Sample rate:", header.SampleRate) + fmt.Println("Frequency :", header.CenterFrequency) + fmt.Println("Sample Size:", header.SampleSize) + tm := time.Unix(header.StartTimestamp, 0) + fmt.Println("Start :", tm) fmt.Println("CRC32 :", header.CRC32) - fmt.Println("CRC32 OK :", getCRC(header)) + fmt.Println("CRC32 OK :", GetCRC(header)) } func copyContent(reader *bufio.Reader, writer *bufio.Writer, blockSize uint) { @@ -97,7 +95,7 @@ func copyContent(reader *bufio.Reader, writer *bufio.Writer, blockSize uint) { } } else { writer.Write(p) - sz += int64(blockSize)*4096 + sz += int64(blockSize) * 4096 } fmt.Printf("Wrote %d bytes\r", sz) @@ -107,14 +105,14 @@ func copyContent(reader *bufio.Reader, writer *bufio.Writer, blockSize uint) { } func main() { - inFileStr := flag.String("in", "foo", "input file") + inFileStr := flag.String("in", "foo", "input file") outFileStr := flag.String("out", "foo", "output file") sampleRate := flag.Uint("sr", 0, "Sample rate (S/s)") centerFreq := flag.Uint64("cf", 0, "Center frequency (Hz)") sampleSize := flag.Uint("sz", 16, "Sample size (16 or 24)") - timeStr := flag.String("ts", "", "start time RFC3339 (ex: 2006-01-02T15:04:05Z)") - timeNow := flag.Bool("now", false , "use now for start time") - blockSize := flag.Uint("bz", 1, "Copy block size in multiple of 4k") + timeStr := flag.String("ts", "", "start time RFC3339 (ex: 2006-01-02T15:04:05Z)") + timeNow := flag.Bool("now", false, "use now for start time") + blockSize := flag.Uint("bz", 1, "Copy block size in multiple of 4k") flag.Parse() flagSeen := make(map[string]bool) @@ -123,16 +121,16 @@ func main() { if flagSeen["in"] { fmt.Println("input file :", *inFileStr) - // open input file - fi, err := os.Open(*inFileStr) - check(err) - // close fi on exit and check for its returned error - defer func() { - err := fi.Close(); - check(err) - }() - // make a read buffer - reader := bufio.NewReader(fi) + // open input file + fi, err := os.Open(*inFileStr) + check(err) + // close fi on exit and check for its returned error + defer func() { + err := fi.Close() + check(err) + }() + // make a read buffer + reader := bufio.NewReader(fi) var headerOrigin HeaderStd = analyze(reader) printHeader(&headerOrigin) @@ -150,7 +148,7 @@ func main() { } } else if flagSeen["ts"] { t, err := time.Parse(time.RFC3339, *timeStr) - if (err == nil) { + if err == nil { headerOrigin.StartTimestamp = t.Unix() } else { fmt.Println("Incorrect time specified. Defaulting to now") @@ -169,10 +167,10 @@ func main() { fo, err := os.Create(*outFileStr) check(err) - defer func() { - err := fo.Close(); - check(err) - }() + defer func() { + err := fo.Close() + check(err) + }() writer := bufio.NewWriter(fo) diff --git a/rescuesdriq/rescuesdriq_test.go b/rescuesdriq/rescuesdriq_test.go new file mode 100644 index 000000000..3046a2c1b --- /dev/null +++ b/rescuesdriq/rescuesdriq_test.go @@ -0,0 +1,26 @@ +package main + +import ( + "testing" + + . "github.com/smartystreets/goconvey/convey" +) + +func TestSpec(t *testing.T) { + + // Only pass t into top-level Convey calls + Convey("Given a header structure", t, func() { + var header HeaderStd + header.SampleRate = 75000 + header.CenterFrequency = 435000000 + header.StartTimestamp = 1539083921 + header.SampleSize = 16 + header.Filler = 0 + + crc32 := GetCRC(&header) + + Convey("The CRC32 value should be 2294957931", func() { + So(crc32, ShouldEqual, 2294957931) + }) + }) +}