From 84daa92b023571e959f177094a5ac6b632503514 Mon Sep 17 00:00:00 2001
From: Michael Gernoth <michael@gernoth.net>
Date: Sat, 12 Sep 2015 12:26:47 +0200
Subject: [PATCH] hmsniff: add support for firmware-update-mode

---
 hmsniff.c | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/hmsniff.c b/hmsniff.c
index 89e2e82..f341044 100644
--- a/hmsniff.c
+++ b/hmsniff.c
@@ -101,6 +101,12 @@ char *hm_message_types(uint8_t type, uint8_t subtype)
 		case 0x70:
 			return "Weather event";
 			break;
+		case 0xca:
+			return "Firmware";
+			break;
+		case 0xcb:
+			return "Rf configuration";
+			break;
 		default:
 			return "?";
 			break;
@@ -193,6 +199,7 @@ static int parse_hmcfgusb(uint8_t *buf, int buf_len, void *data)
 			break;
 		case 'R':
 		case 'I':
+		case 'G':
 			break;
 		default:
 			hexdump(buf, buf_len, "Unknown> ");
@@ -206,6 +213,7 @@ void hmsniff_syntax(char *prog)
 {
 	fprintf(stderr, "Syntax: %s options\n\n", prog);
 	fprintf(stderr, "Possible options:\n");
+	fprintf(stderr, "\t-f\t\tfast (100k/firmware update) mode\n");
 	fprintf(stderr, "\t-v\t\tverbose mode\n");
 	fprintf(stderr, "\t-V\t\tshow version (" VERSION ")\n");
 
@@ -216,10 +224,15 @@ int main(int argc, char **argv)
 	struct hmcfgusb_dev *dev;
 	struct recv_data rdata;
 	int quit = 0;
+	int speed = 10;
+	uint8_t speed_buf[2];
 	int opt;
 
-	while((opt = getopt(argc, argv, "vV")) != -1) {
+	while((opt = getopt(argc, argv, "fvV")) != -1) {
 		switch (opt) {
+			case 'f':
+				speed = 100;
+				break;
 			case 'v':
 				verbose = 1;
 				break;
@@ -254,6 +267,11 @@ int main(int argc, char **argv)
 		hmcfgusb_send_null_frame(dev, 1);
 		hmcfgusb_send(dev, (unsigned char*)"K", 1, 1);
 
+		hmcfgusb_send_null_frame(dev, 1);
+		speed_buf[0] = 'G';
+		speed_buf[1] = speed;
+		hmcfgusb_send(dev, speed_buf, 2, 1);
+
 		while(!quit) {
 			int fd;
 
-- 
2.39.5