forked from Elara6331/itd
		
	Switch to lrpc and use context to handle signals
This commit is contained in:
		| @@ -1,6 +1,7 @@ | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"os" | ||||
| 	"os/signal" | ||||
| 	"syscall" | ||||
| @@ -16,6 +17,13 @@ var client *api.Client | ||||
| func main() { | ||||
| 	log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr}) | ||||
|  | ||||
| 	ctx := context.Background() | ||||
| 	ctx, _ = signal.NotifyContext( | ||||
| 		ctx, | ||||
| 		syscall.SIGINT, | ||||
| 		syscall.SIGTERM, | ||||
| 	) | ||||
|  | ||||
| 	app := cli.App{ | ||||
| 		Name: "itctl", | ||||
| 		Flags: []cli.Flag{ | ||||
| @@ -236,22 +244,8 @@ func main() { | ||||
| 		}, | ||||
| 	} | ||||
|  | ||||
| 	err := app.Run(os.Args) | ||||
| 	err := app.RunContext(ctx, os.Args) | ||||
| 	if err != nil { | ||||
| 		log.Fatal().Err(err).Msg("Error while running app") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func catchSignal(fn func()) { | ||||
| 	sigCh := make(chan os.Signal, 1) | ||||
| 	signal.Notify( | ||||
| 		sigCh, | ||||
| 		syscall.SIGINT, | ||||
| 		syscall.SIGTERM, | ||||
| 	) | ||||
| 	go func() { | ||||
| 		<-sigCh | ||||
| 		fn() | ||||
| 		os.Exit(0) | ||||
| 	}() | ||||
| } | ||||
|   | ||||
| @@ -14,21 +14,23 @@ func watchHeart(c *cli.Context) error { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	catchSignal(cancel) | ||||
|  | ||||
| 	for heartRate := range heartCh { | ||||
| 		if c.Bool("json") { | ||||
| 			json.NewEncoder(os.Stdout).Encode( | ||||
| 				map[string]uint8{"heartRate": heartRate}, | ||||
| 			) | ||||
| 		} else if c.Bool("shell") { | ||||
| 			fmt.Printf("HEART_RATE=%d\n", heartRate) | ||||
| 		} else { | ||||
| 			fmt.Println(heartRate, "BPM") | ||||
| 	for { | ||||
| 		select { | ||||
| 		case heartRate := <-heartCh: | ||||
| 			if c.Bool("json") { | ||||
| 				json.NewEncoder(os.Stdout).Encode( | ||||
| 					map[string]uint8{"heartRate": heartRate}, | ||||
| 				) | ||||
| 			} else if c.Bool("shell") { | ||||
| 				fmt.Printf("HEART_RATE=%d\n", heartRate) | ||||
| 			} else { | ||||
| 				fmt.Println(heartRate, "BPM") | ||||
| 			} | ||||
| 		case <-c.Done(): | ||||
| 			cancel() | ||||
| 			return nil | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func watchBattLevel(c *cli.Context) error { | ||||
| @@ -37,21 +39,23 @@ func watchBattLevel(c *cli.Context) error { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	catchSignal(cancel) | ||||
|  | ||||
| 	for battLevel := range battLevelCh { | ||||
| 		if c.Bool("json") { | ||||
| 			json.NewEncoder(os.Stdout).Encode( | ||||
| 				map[string]uint8{"battLevel": battLevel}, | ||||
| 			) | ||||
| 		} else if c.Bool("shell") { | ||||
| 			fmt.Printf("BATTERY_LEVEL=%d\n", battLevel) | ||||
| 		} else { | ||||
| 			fmt.Printf("%d%%\n", battLevel) | ||||
| 	for { | ||||
| 		select { | ||||
| 		case battLevel := <-battLevelCh: | ||||
| 			if c.Bool("json") { | ||||
| 				json.NewEncoder(os.Stdout).Encode( | ||||
| 					map[string]uint8{"battLevel": battLevel}, | ||||
| 				) | ||||
| 			} else if c.Bool("shell") { | ||||
| 				fmt.Printf("BATTERY_LEVEL=%d\n", battLevel) | ||||
| 			} else { | ||||
| 				fmt.Printf("%d%%\n", battLevel) | ||||
| 			} | ||||
| 		case <-c.Done(): | ||||
| 			cancel() | ||||
| 			return nil | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func watchStepCount(c *cli.Context) error { | ||||
| @@ -60,21 +64,23 @@ func watchStepCount(c *cli.Context) error { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	catchSignal(cancel) | ||||
|  | ||||
| 	for stepCount := range stepCountCh { | ||||
| 		if c.Bool("json") { | ||||
| 			json.NewEncoder(os.Stdout).Encode( | ||||
| 				map[string]uint32{"stepCount": stepCount}, | ||||
| 			) | ||||
| 		} else if c.Bool("shell") { | ||||
| 			fmt.Printf("STEP_COUNT=%d\n", stepCount) | ||||
| 		} else { | ||||
| 			fmt.Println(stepCount, "Steps") | ||||
| 	for { | ||||
| 		select { | ||||
| 		case stepCount := <-stepCountCh: | ||||
| 			if c.Bool("json") { | ||||
| 				json.NewEncoder(os.Stdout).Encode( | ||||
| 					map[string]uint32{"stepCount": stepCount}, | ||||
| 				) | ||||
| 			} else if c.Bool("shell") { | ||||
| 				fmt.Printf("STEP_COUNT=%d\n", stepCount) | ||||
| 			} else { | ||||
| 				fmt.Println(stepCount, "Steps") | ||||
| 			} | ||||
| 		case <-c.Done(): | ||||
| 			cancel() | ||||
| 			return nil | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func watchMotion(c *cli.Context) error { | ||||
| @@ -83,22 +89,24 @@ func watchMotion(c *cli.Context) error { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	catchSignal(cancel) | ||||
|  | ||||
| 	for motionVals := range motionCh { | ||||
| 		if c.Bool("json") { | ||||
| 			json.NewEncoder(os.Stdout).Encode(motionVals) | ||||
| 		} else if c.Bool("shell") { | ||||
| 			fmt.Printf( | ||||
| 				"X=%d\nY=%d\nZ=%d\n", | ||||
| 				motionVals.X, | ||||
| 				motionVals.Y, | ||||
| 				motionVals.Z, | ||||
| 			) | ||||
| 		} else { | ||||
| 			fmt.Println(motionVals) | ||||
| 	for { | ||||
| 		select { | ||||
| 		case motionVals := <-motionCh: | ||||
| 			if c.Bool("json") { | ||||
| 				json.NewEncoder(os.Stdout).Encode(motionVals) | ||||
| 			} else if c.Bool("shell") { | ||||
| 				fmt.Printf( | ||||
| 					"X=%d\nY=%d\nZ=%d\n", | ||||
| 					motionVals.X, | ||||
| 					motionVals.Y, | ||||
| 					motionVals.Z, | ||||
| 				) | ||||
| 			} else { | ||||
| 				fmt.Println(motionVals) | ||||
| 			} | ||||
| 		case <-c.Done(): | ||||
| 			cancel() | ||||
| 			return nil | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user