phc2sys: disentangle the PPS loop from the read_phc loop.
The main loop has become a bit messy, mixing two completely disjunct code paths. This patch separates the two use cases for the sake of clarity. Signed-off-by: Richard Cochran <richardcochran@gmail.com>
This commit is contained in:
		
							parent
							
								
									99d7c128a1
								
							
						
					
					
						commit
						c890a4b935
					
				
							
								
								
									
										60
									
								
								phc2sys.c
									
									
									
									
									
								
							
							
						
						
									
										60
									
								
								phc2sys.c
									
									
									
									
									
								
							| @ -191,6 +191,28 @@ static int read_pps(int fd, int64_t *offset, uint64_t *ts) | |||||||
| 	return 1; | 	return 1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static int do_pps_loop(char *pps_device, double kp, double ki, clockid_t dst) | ||||||
|  | { | ||||||
|  | 	int64_t pps_offset; | ||||||
|  | 	uint64_t pps_ts; | ||||||
|  | 	int fd; | ||||||
|  | 
 | ||||||
|  | 	fd = open(pps_device, O_RDONLY); | ||||||
|  | 	if (fd < 0) { | ||||||
|  | 		fprintf(stderr, "cannot open '%s': %m\n", pps_device); | ||||||
|  | 		return -1; | ||||||
|  | 	} | ||||||
|  | 	while (1) { | ||||||
|  | 		if (!read_pps(fd, &pps_offset, &pps_ts)) { | ||||||
|  | 			continue; | ||||||
|  | 		} | ||||||
|  | 		printf("pps %9lld ", pps_offset); | ||||||
|  | 		do_servo(&servo, dst, pps_offset, pps_ts, kp, ki); | ||||||
|  | 	} | ||||||
|  | 	close(fd); | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static void usage(char *progname) | static void usage(char *progname) | ||||||
| { | { | ||||||
| 	fprintf(stderr, | 	fprintf(stderr, | ||||||
| @ -213,9 +235,9 @@ int main(int argc, char *argv[]) | |||||||
| 	double kp = KP, ki = KI; | 	double kp = KP, ki = KI; | ||||||
| 	char *device = NULL, *progname; | 	char *device = NULL, *progname; | ||||||
| 	clockid_t src = CLOCK_INVALID, dst = CLOCK_REALTIME; | 	clockid_t src = CLOCK_INVALID, dst = CLOCK_REALTIME; | ||||||
| 	uint64_t pps_ts, phc_ts; | 	uint64_t phc_ts; | ||||||
| 	int64_t pps_offset, phc_offset; | 	int64_t phc_offset; | ||||||
| 	int c, fd = 0, phc_readings = 5, phc_rate = 1; | 	int c, phc_readings = 5, phc_rate = 1; | ||||||
| 
 | 
 | ||||||
| 	/* Process the command line arguments. */ | 	/* Process the command line arguments. */ | ||||||
| 	progname = strrchr(argv[0], '/'); | 	progname = strrchr(argv[0], '/'); | ||||||
| @ -256,13 +278,6 @@ int main(int argc, char *argv[]) | |||||||
| 		usage(progname); | 		usage(progname); | ||||||
| 		return -1; | 		return -1; | ||||||
| 	} | 	} | ||||||
| 	if (device) { |  | ||||||
| 		fd = open(device, O_RDONLY); |  | ||||||
| 		if (fd < 0) { |  | ||||||
| 			fprintf(stderr, "cannot open %s: %m\n", device); |  | ||||||
| 			return -1; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	if (src != CLOCK_INVALID) { | 	if (src != CLOCK_INVALID) { | ||||||
| 		struct timespec now; | 		struct timespec now; | ||||||
| 		if (clock_gettime(src, &now)) | 		if (clock_gettime(src, &now)) | ||||||
| @ -270,24 +285,17 @@ int main(int argc, char *argv[]) | |||||||
| 		if (clock_settime(dst, &now)) | 		if (clock_settime(dst, &now)) | ||||||
| 			perror("clock_settime"); | 			perror("clock_settime"); | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	if (device) | ||||||
|  | 		return do_pps_loop(device, kp, ki, dst); | ||||||
|  | 
 | ||||||
| 	while (1) { | 	while (1) { | ||||||
| 		if (fd > 0) { | 		usleep(1000000 / phc_rate); | ||||||
| 			if (!read_pps(fd, &pps_offset, &pps_ts)) | 		if (!read_phc(src, dst, phc_readings, &phc_offset, &phc_ts)) { | ||||||
| 				continue; | 			continue; | ||||||
| 			printf("pps %9lld ", pps_offset); |  | ||||||
| 		} else |  | ||||||
| 			usleep(1000000 / phc_rate); |  | ||||||
| 
 |  | ||||||
| 		if (src != CLOCK_INVALID) { |  | ||||||
| 			if (!read_phc(src, dst, phc_readings, &phc_offset, &phc_ts)) |  | ||||||
| 				continue; |  | ||||||
| 			printf("phc %9lld ", phc_offset); |  | ||||||
| 		} | 		} | ||||||
| 
 | 		printf("phc %9lld ", phc_offset); | ||||||
| 		if (fd > 0) | 		do_servo(&servo, dst, phc_offset, phc_ts, kp, ki); | ||||||
| 			do_servo(&servo, dst, pps_offset, pps_ts, kp, ki); |  | ||||||
| 		else |  | ||||||
| 			do_servo(&servo, dst, phc_offset, phc_ts, kp, ki); |  | ||||||
| 	} | 	} | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user