altos: Add the ability to configure a different USB vendor ID
[fw/altos] / src / util / ao-make-product.5c
index 5f2eb8e895557a492405c016336cac51dd3eedea..3ab8d16ec474aba3403cc9a6654c24f4868eefa9 100644 (file)
@@ -1,54 +1,58 @@
-#!/bin/sh
+#!/usr/bin/nickle
 
 autoimport ParseArgs;
 
+file  out = stdout;
+
 void
 write_ucs2(string a, string description)
 {
        int len = String::length(a);
 
-       printf("/* %s */\n", description);
-       printf("#define AO_%s_LEN 0x%02x\n", description, len * 2 + 2);
-       printf("#define AO_%s_STRING \"%s\"\n", description, a);
-       printf("#define AO_%s_UCS2", description);
+       File::fprintf(out, "/* %s */\n", description);
+       File::fprintf(out, "#define AO_%s_LEN 0x%02x\n", description, len * 2 + 2);
+       File::fprintf(out, "#define AO_%s_STRING \"%s\"\n", description, a);
+       File::fprintf(out, "#define AO_%s_UCS2", description);
        for (int i = 0; i < len; i++) {
                int     c = a[i];
                if (i > 0)
-                       printf(",");
+                       File::fprintf(out, ",");
                if (0x20 <= c && c < 128)
-                       printf(" '%c', 0", c);
+                       File::fprintf(out, " '%c', 0", c);
                else
-                       printf(" LE_WORD(0x%04x),", c);
+                       File::fprintf(out, " LE_WORD(0x%04x),", c);
        }
-       printf("\n\n");
+       File::fprintf(out, "\n\n");
 }
 
 void
 write_string(string a, string description)
 {
-       printf ("/* %s */\n", description);
-       printf ("#define AO_%s_STRING \"%s\"\n", description, a);
+       File::fprintf(out, "/* %s */\n", description);
+       File::fprintf(out, "#define AO_%s_STRING \"%s\"\n", description, a);
 }
 
 void
 write_int(int a, string description)
 {
-       printf ("/* %s */\n", description);
-       printf ("#define AO_%s_NUMBER %d\n\n", description, a);
+       File::fprintf(out, "/* %s */\n", description);
+       File::fprintf(out, "#define AO_%s_NUMBER %d\n\n", description, a);
 }
 
 void
 write_hex(int a, string description)
 {
-       printf ("/* %s */\n", description);
-       printf ("#define AO_%s_NUMBER 0x%04x\n\n", description, a);
+       File::fprintf(out, "/* %s */\n", description);
+       File::fprintf(out, "#define AO_%s_NUMBER 0x%04x\n\n", description, a);
 }
 
 string manufacturer = "altusmetrum.org";
 string product = "TeleMetrum";
 string version = "0.0";
+string output = "";
 int serial = 1;
 int user_argind = 0;
+int id_vendor = 0xfffe;
 int id_product = 0x000a;
 
 argdesc argd = {
@@ -65,6 +69,12 @@ argdesc argd = {
                        .name = "product",
                        .expr_name = "prod",
                        .desc = "Product name." },
+               {
+                       .var = { .arg_int = &id_vendor },
+                       .abbr = 'V',
+                       .name = "id_vendor",
+                       .expr_name = "id_v",
+                       .desc = "Vendor ID." },
                {
                        .var = { .arg_int = &id_product },
                        .abbr = 'i',
@@ -83,6 +93,12 @@ argdesc argd = {
                        .name = "version",
                        .expr_name = "string",
                        .desc = "Program version." },
+               {
+                       .var = { .arg_string = &output },
+                       .abbr = 'o',
+                       .name = "output",
+                       .expr_name = "out",
+                       .desc = "Output file." },
        },
        .prog_name = "usb descriptors",
 };
@@ -92,11 +108,14 @@ main()
 {
        string[dim(argv)-1] nargv = {[n] = argv[n+1]};
        parseargs(&argd, &nargv);
+       if (output != "")
+               out = File::open(output, "w");
        write_ucs2(manufacturer, "iManufacturer");
        write_ucs2(product, "iProduct");
        write_ucs2(sprintf("%06d", serial), "iSerial");
        write_int(serial, "iSerial");
        write_hex(id_product, "idProduct");
+       write_hex(id_vendor, "idVendor");
        write_string(version, "iVersion");
 }