• Strange! If I use dictionary notation when defining my additional methods, everything seems to work. Does this mean the first way of doing it has a bug?

    // Define global constants
    var LED_OFF = 0;
    var LED_RED = 1;
    var LED_YELLOW = 2;
    var LED_GREEN = 3;
    
    var HT16K33_BLINK_CMD = 0x80;
    var HT16K33_BLINK_DISPLAYON = 0x01;
    var HT16K33_BLINK_OFF = 0;
    var HT16K33_BLINK_2HZ  = 1;
    var HT16K33_BLINK_HALFHZ  = 3;
    var HT16K33_BRIGHTNESS_CMD = 0xE0;
    var HT16K33_ENABLE_OSCILLATOR_CMD = 0x21;
    
    var exports = {};
    exports.connect = function(i2c, address, callback){
    
      // Private methods
      function drawPixel(x,y,col){
          
        // Handle rotation
        switch (rotation) {
        case 1:
          var t1 = x;
          x = 8 - y - 1;
          y = t1;
          break;
        case 2:
          x = 8 - x - 1;
          y = 8 - y - 1;
          break;
        case 3:
          var t2 = x;
          x = y;
          y = 8 - t2 - 1;
          break;
        }
        
        // Handle backwards wiring
        if(x < 4){
          x += 4;
        } else {
          x -= 4;
        }
        
        if(y < 4){
          y += 4;
        } else {
          y -= 4;
        }
        
        // We wamt colours to override
        // so turn the current pixel off by default
        // then set it's colour again
        displaybuffer[y] &= ~(1 << x) & ~(1 << (x+8));
    
        if (col == LED_GREEN) {
          displaybuffer[y] |= (1 << x) & ~(1 << (x+8));
        } else if (col == LED_RED) {
          displaybuffer[y] |= ~(1 << x) & (1 << (x+8));
        } else if (col == LED_YELLOW) {
          displaybuffer[y] |= (1 << x) | (1 << (x+8));
        }
          
      }
      
      function drawRect(x1,y1,x2,y2,col){
        for(var x=x1;x<=x2;x++){
          for(var y=y1;y<=y2;y++){
            drawPixel(x,y,col);
          }
        }
      }
      
      // Create buffer
      var display = Graphics.createCallback(8,8,8,{setPixel:­drawPixel,fillRect:drawRect});
      var displaybuffer = new Uint16Array(8);
      var rotation = 0;
    
      display["setRotation"] = function(rot){
        rotation = rot;
      };
      
      display["getRotation"] = function(){
        return rotation;
      };
      
      display["setBlinkRate"] = function(b) {
        if (b > 3) b = 0; // turn off if not sure
        i2c.writeTo(address, HT16K33_BLINK_CMD | HT16K33_BLINK_DISPLAYON | (b << 1));
      };
        
      display["setBrightness"] = function(b) {
        if (b > 15) b = 15; // Don't go over max
        i2c.writeTo(address, HT16K33_BRIGHTNESS_CMD | b);
      };
    
      display["updateDisplay"] = function(){
        var tmp = new Uint8Array(17);
        tmp[0] = 0x00;
        for (var i=0; i<16; i+=2) {
          tmp[i+1] = displaybuffer[i/2] & 0xFF;
          tmp[i+2] = displaybuffer[i/2] >> 8;
        }
        i2c.writeTo(address, tmp);
      };
    
      display["clearDisplay"] = function(){
        for (var i=0; i<8; i++) {
          displaybuffer[i] = 0;
        }
        display.updateDisplay();
      };
      
      // Turn on oscillator
      i2c.writeTo(address, HT16K33_ENABLE_OSCILLATOR_CMD);
      
      // Set blink rate
      display.setBlinkRate(HT16K33_BLINK_OFF);­
      
      // Set to full brightness
      display.setBrightness(15);
      
      // Trigger callback
      if (callback!==undefined){
        setTimeout(callback, 100);
      }
      
      return display;
    };
    
    
    // Setup I2C
    I2C2.setup({ scl: B10, sda: B11 });
    
    var matrix = exports.connect(I2C2, 0x70, function(){
      
      var counter = 1;
      setInterval(function(){
        
        matrix.clear();
        
        matrix.setRotation(counter - 1);
        matrix.setColor(counter);
        matrix.fillRect(0,0,7,1);
        matrix.fillRect(0,3,7,4);
        matrix.fillRect(0,6,7,7);
        matrix.fillRect(0,0,1,7);
        
        matrix.updateDisplay();
        
        counter = (counter == 3) ? 1 : counter + 1;
        
      }, 2000);
      
    });
    
About