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
}