diff --git a/cmd/gqgmc/main.go b/cmd/gqgmc/main.go index 06544fced4daf13a32daf4ad42f6a47991df8c88..46cb804c7fa84cd1175fb3740c1dc15b5fb4e59d 100644 --- a/cmd/gqgmc/main.go +++ b/cmd/gqgmc/main.go @@ -16,7 +16,10 @@ func main() { var ( gc geiger.Counter cps, cpm uint16 + volts int16 + ser string err error + ver string ) gc, err = geiger.New(geiger.Config{ @@ -41,4 +44,26 @@ func main() { return } fmt.Printf("CPS: %d\n", cps) + + ver, err = gc.Version() + if err != nil { + fmt.Printf("Failed to connect to geiger counter: '%s'\n", err) + return + } + fmt.Printf("Version: %s\n", ver) + + ser, err = gc.SerialNum() + if err != nil { + fmt.Printf("Failed to connect to geiger counter: '%s'\n", err) + return + } + fmt.Printf("Version: %s\n", ser) + + volts, err = gc.Volts() + if err != nil { + fmt.Printf("Failed to connect to geiger counter: '%s'\n", err) + return + } + fmt.Printf("Version: %d\n", volts) + } diff --git a/devices/geiger/geiger.go b/devices/geiger/geiger.go index 74648310595da52354c39e2fd74d66558459469e..139ba58f06e620d3cf3273ec0ec8706e0ff15b5a 100644 --- a/devices/geiger/geiger.go +++ b/devices/geiger/geiger.go @@ -23,7 +23,7 @@ type Counter interface { SerialNum() (string, error) GetCPM() (uint16, error) GetCPS() (uint16, error) - GetVoltage() (int16, error) + Volts() (int16, error) GetHistoryData() TurnOnCPS() error TurnOffCPS() error diff --git a/devices/geiger/gqgmc.go b/devices/geiger/gqgmc.go index d58088f2b9825a15f8ff32700aba3dd3627c8999..d66dad5ccfd4c52291d6d03a9689354bb6cf7d94 100644 --- a/devices/geiger/gqgmc.go +++ b/devices/geiger/gqgmc.go @@ -158,7 +158,6 @@ func NewGQGMC(c Config) (*GQGMCCounter, error) { if err != nil { return nil, err } - //vers := getVersion() //getConfigurationData() return &GQGMCCounter{port: p, config: &cfg}, nil } @@ -172,26 +171,25 @@ func (gc *GQGMCCounter) Clear() error { // Version gets the version of the device func (gc *GQGMCCounter) Version() (string, error) { - //communicate(get_version_cmd, version, versize); - // use cmdGetVersion. Returns 14 byte string. - return "", nil + ver, err := gc.communicate(cmdGetVersion, 14) + return string(ver), err } // SerialNum gets the serial number of the device func (gc *GQGMCCounter) SerialNum() (string, error) { - //communicate(get_serial_cmd, serial_number, sernumsize); - // use cmdGetSerial. Returns 7 bytes. - // Turn each 4 bits into corresponging hex char. - bs := []byte{0, 0x30, 0, 0xE3, 0x4A, 0x35, 0x1A} - for _, b := range bs { - fmt.Printf("%02X", b) + serStr := "" + + ser, err := gc.communicate(cmdGetSerial, 7) + if err != nil { + for _, b := range ser { + serStr += fmt.Sprintf("%02X", b) + } } - fmt.Println("") - return "", nil + return serStr, err } func (gc *GQGMCCounter) getReading(what string) (uint16, error) { - buf, err := gc.communicate([]byte(what), 2) + buf, err := gc.communicate(what, 2) if err != nil { return 0, err } @@ -210,8 +208,8 @@ func (gc *GQGMCCounter) GetCPS() (uint16, error) { return gc.getReading(cmdGetCPS) } -// GetVoltage returns current battery voltage -func (gc *GQGMCCounter) GetVoltage() (int16, error) { +// Volts returns current battery voltage +func (gc *GQGMCCounter) Volts() (int16, error) { // Do this differently - for 9.6 return 96. And if not supported, // Return -1. // Public method to read voltage value of battery. The GQ GMC returns @@ -221,15 +219,11 @@ func (gc *GQGMCCounter) GetVoltage() (int16, error) { // expect to see a value higher than 100. The command is get_voltage_cmd // (see GQ GMC COMMANDS above). If the voltage falls below 7.5V, GQ LLC // says the geiger counter cannot be expected to operate properly. - //func (gc *GQGMCCounter) getBatteryVoltage() - //uint32_t voltsize = 1; // one byte of returned data - // Issue command to get battery voltage and read returned data. - //communicate(get_voltage_cmd, voltage_char, voltsize); - // If read of returned data succeeded, convert raw data to float, - //int32_t voltage_int = int16_t(voltage_char[0]); - //voltage = float(voltage_int) / 10.0; - - return 0, nil + volts, err := gc.communicate(cmdGetVoltage, 1) + if err != nil { + return 0, err + } + return int16(volts[0]), err } // GetHistoryData Should return history data but is unimplemented for now @@ -253,34 +247,31 @@ func (gc *GQGMCCounter) TurnOnCPS() error { // separate command. The command is turn_on_cps_cmd // (see GQ GMC COMMANDS above). The returned data is always two // bytes so that samples > 255 can be reported (even though unlikely). - //sendCmd(turn_on_cps_cmd); - // There is no pass/fail return from GQ GMC + gc.sendCmd(cmdTurnOnCPS) return nil } // TurnOffCPS turns off CPS collection func (gc *GQGMCCounter) TurnOffCPS() error { - //sendCmd(turn_off_cps_cmd); - //call Clear() + gc.sendCmd(cmdTurnOffCPS) + gc.Clear() return nil } // GetAutoCPS gets a reading once auto CPS is turned on func (gc *GQGMCCounter) GetAutoCPS() (uint16, error) { - //uint32_t cpssize = 2; // 2 bytes of returned data - //read-from-port(cps_char, cpssize); - // 1st byte is MSB, but note that upper two bits are reserved bits. - // Note that shifting and bitmasking performed in uP register, so - // endianess is irrevelant. - //cps_int |= ((uint16_t(cps_char[0]) << 8) & 0x3f00); - //cps_int |= (uint16_t(cps_char[1]) & 0x00ff); - return 0, nil + buf, err := gc.readCmd(2) + if err != nil { + return 0, err + } + cps := ((uint16(buf[0]) << 8) & 0x3f00) + cps |= (uint16(buf[1]) & 0x00ff) + return cps, nil } // TurnOffPower turns the device off func (gc *GQGMCCounter) TurnOffPower() { - //sendCmd(turn_off_pwr_cmd) - // Note that power off cannot fail because the GQ GMC returns nothing. + gc.sendCmd(cmdTurnOffPwr) return } @@ -339,7 +330,7 @@ func (gc *GQGMCCounter) SetTime(time string) { //communicate(setSecondCmd, ret_char, retsize); } -func (gc *GQGMCCounter) communicate(cmd []byte, length uint32) ([]byte, error) { +func (gc *GQGMCCounter) communicate(cmd string, length uint32) ([]byte, error) { gc.Clear() if len(cmd) > 0 { gc.sendCmd(cmd) @@ -350,8 +341,8 @@ func (gc *GQGMCCounter) communicate(cmd []byte, length uint32) ([]byte, error) { return nil, nil } -func (gc *GQGMCCounter) sendCmd(cmd []byte) { - gc.port.Write(cmd) +func (gc *GQGMCCounter) sendCmd(cmd string) { + gc.port.Write([]byte(cmd)) return }