diff clojure/com/aurellem/vbm.clj @ 72:c88ad4f6d9b4

can now write proper vbm files from clojure
author Robert McIntyre <rlm@mit.edu>
date Thu, 08 Mar 2012 03:41:24 -0600
parents 39928bf4622d
children 8a895ed4c0f9
line wrap: on
line diff
     1.1 --- a/clojure/com/aurellem/vbm.clj	Thu Mar 08 02:47:09 2012 -0600
     1.2 +++ b/clojure/com/aurellem/vbm.clj	Thu Mar 08 03:41:24 2012 -0600
     1.3 @@ -15,9 +15,9 @@
     1.4  
     1.5  (defn repair-vbm
     1.6    "Two 0's must be inserted after every reset."
     1.7 -  [vbm-seq]
     1.8 +  [vbm-masks]
     1.9    (loop [fixed []
    1.10 -         pending vbm-seq]
    1.11 +         pending vbm-masks]
    1.12      (if (empty? pending) fixed
    1.13          (let [mask (first pending)]
    1.14            (if (not= 0x0000 (bit-and mask (button-code :reset)))
    1.15 @@ -38,7 +38,58 @@
    1.16    (reset)
    1.17    (dorun (map step (vbm-masks vbm))))
    1.18  
    1.19 +(defn convert-buttons
    1.20 +  "To write a vbm file, we must remove the last two buttons after any
    1.21 +   reset event."
    1.22 +  [buttons]
    1.23 +  (loop [fixed []
    1.24 +         pending buttons]
    1.25 +    (if (empty? pending) fixed
    1.26 +        (let [mask (first pending)]
    1.27 +          (if (contains? (first pending) :reset)
    1.28 +            (recur (conj fixed mask) (drop 3 pending))
    1.29 +            (recur (conj fixed mask) (next pending)))))))
    1.30  
    1.31 +(def vbm-header
    1.32 +  (byte-array
    1.33 +   (map
    1.34 +    byte
    1.35 +    [86 66 77 26 1 0 0 0 105 74 88 79 89 1 0 0 0 0 0 0 0 1 2 112 0 0 0
    1.36 +     0 0 0 0 0 1 0 0 0 80 79 75 69 77 79 78 32 89 69 76 76 1 -105 124 4
    1.37 +     3 0 0 0 0 0 0 0 0 1 0 0 95 95 95 95 95 95 95 95 95 95 95 95 95 95
    1.38 +     95 95 82 111 98 101 114 116 32 32 77 99 73 110 116 121 114 101 95
    1.39 +     95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95
    1.40 +     95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95
    1.41 +     95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95
    1.42 +     95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95
    1.43 +     95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95
    1.44 +     95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95
    1.45 +     95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95
    1.46 +     95 95 95 95])))
    1.47 +
    1.48 +(def vbm-trailer
    1.49 +  (byte-array
    1.50 +   (map byte [0])))
    1.51 +
    1.52 +(defn buttons->vbm-bytes [buttons]
    1.53 +  (let [bytes-in-ints
    1.54 +        (map button-mask (convert-buttons buttons))
    1.55 +        high-bits (map #(bit-shift-right (bit-and 0xFF00 %) 8)
    1.56 +                       bytes-in-ints)
    1.57 +        low-bits (map #(bit-and 0xFF %) bytes-in-ints)
    1.58 +        convert-byte (fn [i] (byte (if (>= i 128) (- i 256) i)))
    1.59 +        contents
    1.60 +        (byte-array
    1.61 +         (concat
    1.62 +          vbm-header
    1.63 +          (map convert-byte (interleave high-bits low-bits))
    1.64 +          vbm-trailer))]
    1.65 +    contents))
    1.66 +        
    1.67 +(defn write-vbm [buttons #^File out]
    1.68 +  (clojure.java.io/copy (buttons->vbm-bytes buttons) out))
    1.69 +    
    1.70 +  
    1.71           
    1.72      
    1.73    
    1.74 \ No newline at end of file