Arcam AVR500/600/888 en RS232/TCPIP besturing

Started by jowi, August 16, 2010, 18:27:47

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

jowi

Klopt, maar het is op z'n minst opvallend dat van alle apparaten die aan de switch hangen, alleen de Arcam er problemen mee lijkt te hebben.

dvlz303

Ik heb eergisteren in ieder geval al een e-mail gestuurd naar dezelfde twee personen waar ik eerder (wel) antwoord van heb gekregen. Tot nu toe blijft het stil..
In de mail heb ik aangegeven wat jowi al zegt: sommige commando's die niks doen (of pas na 10 tot 20 keer sturen), regelmatig vastlopen van de AVR600, etc.

Misschien dat ze niet reageren omdat ik ook wel wat kritiek heb gegeven, namelijk door te zeggen dat ik het wel slecht vind dat het geleverde product meer dan een jaar na de release nog steeds met zulk soort problemen kampt.
- plops
- locking
- communicatie problemen

Eigenlijk kan dat toch niet? Volgens mij moet er meer druk komen anders krijgen we pas een goed werkend apparaat als het tijd is om hem te vervangen?!

jowi

Ja het apparaat heeft nog wel meer kleine, al dan niet terugkerende kuren. Al met al is er in dagelijks gebruik wel goed mee te werken. De plops zorgen er wel regelmatig voor dat je hart in je keel zit maar ja. Ik had net ook weer iets raars, ik zette hem aan, en hij stond gehoormatig erg hard, toen ik hem terugdraaide stond ie al op 10, terwijl ie klonk alsof ie op 30 stond. Even van input wisselen en het was weer normaal. Dat soort dingen, kan er nog wel een paar verzinnen. Maar goed daar is een ander topic voor...

dvlz303

[offtopic reason='cynische opmerking']

Quote from: jowi on November  4, 2010, 09:33:00
De plops zorgen er wel regelmatig voor dat je hart in je keel zit maar ja.
Maar daar moet ik wel bij opmerken dat de plop wel erg goed klinkt uit de arcam! Misschien moeten ze wel een sticker op het ding plakken dat hij niet geschikt is voor mensen met een zwak hart.

[/offtopic]

jowi

Haha jazeker als de plop een keer voor de verandering uit de Velodyne komt :D

bmateijsen

Ik heb overigens voor Pronto gewoon een goed werkende RS232 file voor de AVR500/ 600 / 888.

jowi

Quote from: bmateijsen on November  4, 2010, 11:12:28
Ik heb overigens voor Pronto gewoon een goed werkende RS232 file voor de AVR500/ 600 / 888.
Wat voor functionaliteiten zitten daar in? De simpele zaken als volume up en down die doen het ook wel namelijk... zeker als die gebruik maken van de RC5 emulatie. Het gaat om wat meer complexere commandos, het opvragen van het volume, opvragen van de video-in parameters, dat soort dingen.
Kun je die file hier eens plaatsen of emailen desnoods? Het zal niet meer dan een verzameling codes zijn neem ik aan. Zou toch wel eens willen kijken wat daar in zit, als die commando's het bij mij ook niet of nauwelijks doen is er iets anders aan de hand...

bmateijsen

Het is een XCF file voor PEP2.0, dus daar heb je net zoveel aan, als de rs232 codes. Overigens is de file alleen functioneel ingericht, er worden daar geen complexere commando's gedaan. 

Quote from: jowi on November  4, 2010, 11:30:29
Wat voor functionaliteiten zitten daar in? De simpele zaken als volume up en down die doen het ook wel namelijk... zeker als die gebruik maken van de RC5 emulatie. Het gaat om wat meer complexere commandos, het opvragen van het volume, opvragen van de video-in parameters, dat soort dingen.
Kun je die file hier eens plaatsen of emailen desnoods? Het zal niet meer dan een verzameling codes zijn neem ik aan. Zou toch wel eens willen kijken wat daar in zit, als die commando's het bij mij ook niet of nauwelijks doen is er iets anders aan de hand...

jowi

Een XCF file is een gecomprimeerd filedingetje met daarin een XML bestand (of meer) en een folder met bitmaps ;) alles is gewoon te bekijken.
In de xml staan o.a. een aantal functies etc. in, ben toch wel benieuwd moet ik eerlijk zeggen...

bmateijsen


jowi

Quote from: bmateijsen on November  4, 2010, 11:58:13
Er is een mail naar je onderweg...
Heel fijn :) ik verwacht ook niet veel bijzonders te vinden hoor maar je weet maar nooit.

jowi

Nou toch wel de moeite waard hoor :) heel het script waarmee en hoe ze communiceren met de Arcam staat er in...
Eens kijken wat er anders is als wat ik doe... als het al anders is. De SQLite database die erbij zat klopt qua codes en instellingen in ieder geval 8)


Diagnostics.log("AVR600 CODE STARTUP");
//Serial Extender setup
var extendNum = 0;
var portNum = 0;
var serialPort = null;
//Data management
var POWERSTATE = null;
var commandQueue = new Array();
var CURRENTZONE = 1;
var ZONEHEX = "";
var presetNum = 1;
var CURRENTSOURCE = null;
var CURRENTPRESET = 1;
var CURRENTVOL = 0;
var MUTESTATUS = false;
var CANPOLL = true;
//time management
var SEND_TIMEOUT =  3000;

//TASK MANAGER VARIABLES
var UPDATERADIOINFO = false;

/// - DEFINE SERIAL COMMANDS AS DEFINE VARS - IT MAKES IT EASIER TO MAKE ADJUSTMENTS
/////////   ACTION COMMANDS
var POWON           = "\x08\x02\x10\x7B\x0D";
var POWOFF          = "\x08\x02\x10\x7C\x0D";
var REQPOWER        = "\x00\x01\xF0\x0D";
var REQSOURCE       = "\x1D\x01\xF0\x0D";
var VOLUP           = "\x08\x02\x10\x10\x0D";
var VOLDOWN         = "\x08\x02\x10\x11\x0D";
var VOLMUTE         = "\x08\x02\x10\x0D\x0D";
var PRESETDOWN      = "\x08\x02\x11\x55\x0D";
var PRESETUP        = "\x08\x02\x11\x56\x0D";
var PRESETOK        = "\x08\x02\x11\x57\x0D";
var TUNEUP          = "\x16\x01\x01\x0D";
var TUNEDOWN        = "\x16\x01\x00\x0D";
var DABUP           = "\x08\x02\x10\x50\x0D";
var DABDOWN         = "\x08\x02\x10\x51\x0D";
var DABOK           = "\x08\x02\x10\x57\x0D";
// request commands
var REQSTATEMUTE    = "\x0E\x01\xF0\x0D";
var REQFMRDS        = "\x12\x01\xF0\x0D";
var REQRADIOFREQ    = "\x16\x01\xF0\x0D";
var REQRADIOAM      = "\x08\x02\x11\x35\x0D";
var REQRADIOFM      = "\x08\x02\x11\x7F\x0D";
var REQRADIODAB     = "\x08\x02\x10\x03\x0D";
var REQDABNAME      = "\x18\x01\xF0\x0D";
/////////   WIDGET SETUP    ////////////////
///////////////////////////////////////////
var wARCAM = CF.widget("ARCAMLOGO", "RADIO", "ARCAM_AVR600");

var wZONE1 = CF.widget("ZONE1ON", "RADIO", "ARCAM_AVR600");
var wZONE2 = CF.widget("ZONE2ON", "RADIO", "ARCAM_AVR600");
var wZONE3 = CF.widget("ZONE3ON", "RADIO", "ARCAM_AVR600");

var wNOWPLAYING = CF.widget("NOWPLAYING", "RADIO", "ARCAM_AVR600");
var wGENRE = CF.widget("GENRE", "RADIO", "ARCAM_AVR600");
var wNAME = CF.widget("NAME", "RADIO", "ARCAM_AVR600");
var wSOURCE = CF.widget("SOURCE", "RADIO", "ARCAM_AVR600");
var wPRESET = CF.widget("PRESET", "RADIO", "ARCAM_AVR600");
var wLOADING = CF.widget("LOADING", "RADIO", "ARCAM_AVR600");


// overlay options
var wOVERLAY    = CF.widget("OVERLAY", "RADIO", "ARCAM_AVR600");
var wDIRECTON   = CF.widget("DIRECTON", "RADIO", "ARCAM_AVR600");
var wDIRECTOFF  = CF.widget("DIRECTOFF", "RADIO", "ARCAM_AVR600");
var wPL         = CF.widget("PL", "RADIO", "ARCAM_AVR600");
var wPLGAME     = CF.widget("PLGAME", "RADIO", "ARCAM_AVR600");
var wPLMOVIE    = CF.widget("PLMOVIE", "RADIO", "ARCAM_AVR600");
var wPLMUSIC    = CF.widget("PLMUSIC", "RADIO", "ARCAM_AVR600");
var wDTSCINEMA  = CF.widget("DTSCINEMA", "RADIO", "ARCAM_AVR600");
var wDTSMUSIC   = CF.widget("DTSMUSIC", "RADIO", "ARCAM_AVR600");
var wSTEREO     = CF.widget("STEREO", "RADIO", "ARCAM_AVR600");
var wDOLBYEX    = CF.widget("DOLBYEX", "RADIO", "ARCAM_AVR600");
var wMULTICHANNEL = CF.widget("MULTICHANNEL", "RADIO", "ARCAM_AVR600");


var wVOLBAR = CF.widget("VOLUMEBAR", "RADIO", "ARCAM_AVR600");
var wVOLTEXT = CF.widget("VOLUME", "RADIO", "ARCAM_AVR600");
var wVOLUME = new Array();
for(var i = 0; i<=10; i++)
{
   wVOLUME[i] = CF.widget("VOL" + i, "SETUP", "ARCAM_AVR600");
}
////////    HARD BUTTON SETUP
CF.widget("PS_VOLUME_UP").onHoldInterval = 200;
CF.widget("PS_VOLUME_UP").onHold = function()
{
   AVR600.volumeUp();
   AVR600.reqVol();
}
CF.widget("PS_VOLUME_UP").onRelease = function()
{
   AVR600.reqVol();
}
CF.widget("PS_VOLUME_DOWN").onHoldInterval = 200;
CF.widget("PS_VOLUME_DOWN").onHold = function()
{
   AVR600.volumeDown();
   AVR600.reqVol();
}
CF.widget("PS_VOLUME_DOWN").onRelease = function()
{
   AVR600.reqVol();
}
CF.widget("PS_FIRM1").onHoldInterval = 200;
CF.widget("PS_FIRM1").onHold = function()
{
   AVR600.radioTuneDown();
}
CF.widget("PS_FIRM2").onHoldInterval = 200;
CF.widget("PS_FIRM2").onHold = function()
{
   AVR600.radioTuneUp();
}


/////////   INITIALISE SERIAL COMMUNICATION
function initComms()
{
   Diagnostics.log("INITCOMMS");
   // Extender configuration
   extendNum = parseInt(CF.widget("EXTENDERID", "SETUP", "ARCAM_AVR600").label, 16);
   portNum = parseInt(CF.widget("PORTID", "SETUP", "ARCAM_AVR600").label, 10);

   serialPort = CF.extender[extendNum].serial[portNum-1];
   if(serialPort == null)
   {
       Diagnostics.log("SERIAL EXTENDER: PORT OR ID ERROR");
   }
   serialPort.bitrate=38400;
   serialPort.parity=0;
   serialPort.databits=8;
   serialPort.stopbits=1;
}

/////////   MY SERIAL CLASS FOR AVR600
/////////////////////////////////////////////////
function ArcamAVR600(serPort)
{
   Diagnostics.log("ArcamAVR600 class");
   this.serial = serPort;
   this.command = "";

   this.sendString = function(hexString)
   {  
       switch(CURRENTZONE)
       {
           case 1:
                   ZONEHEX = "\x01";
               break;
           case 2:
                   ZONEHEX = "\x02";
               break;
           case 3:
                   ZONEHEX = "\x03";
               break;
       }
       
       if(commandQueue.length < 5)
       {
           commandQueue.push(hexString);
           System.print("ADDED TO QUEUE");
       }
       else
       {
           System.print("Discard command: " + showHEX(hexString));
       }
       if(commandQueue.length == 1);
       {
           this.serial.match("\x21" + ZONEHEX + hexString, "\x0D", SEND_TIMEOUT);
           System.delay(200);
       }    
   };

   this.serial.onData = function(receivedData)
   {    
       commandQueue.shift();
   
   
       var incData = String(receivedData);      
       var commandCode = incData.substring(2, 3);
       var answerCode = incData.substring(3,4);
       var commandData = incData.substring(5);
       
       //System.print("INC DATA: " + showHEX(receivedData));   //THIS IS FOR DEBUGGING ONLY
       //ANSWER CODE SWITCH - IF A COMMAND COMES BACK WITH AN ERROR, CATCH IT HERE
       switch(answerCode)
       {
           case "\x83":
                       System.print("COMMAND NOT RECOGNISED");
               break;
           case "\x84":
                       System.print("PARAMETER NOT RECOGNISED");
               break;
           case "\x85":
                       System.print("INVALID COMMAND AT THIS TIME");
               break;
           case "\x86":
                       System.print("INVALID DATA LENGTH");
               break;

       }
       //COMMAND CODES SWITCH - THE MAIN PART OF THE MODULE - READ COMMAND CODES AND ACT ON THE DATA
       switch(commandCode)
       {
           case "\x00":    //REQUEST POWER STATE
                       System.print("COMMAND CODE POWER STATE");
                       var tempState = parseInt(commandData.charCodeAt(0).toString(16),16);
                       switch(tempState)
                       {
                           case 0: //POWER OFF
                                   POWERSTATE = false;  
                                   CANPOLL = false;
                                   //Hide all other screen widgets
                                   wARCAM.visible = true;  
                                   AVR600.hideWidgets();                        
                                   wVOLTEXT.label = "OFF";
                                   wVOLBAR.setImage(wVOLUME[0].getImage());
                               break;
                           case 1: //POWER ON
                                   POWERSTATE = true;
                                   //This is the last status call when we start the module, so this is where we hide the
                                   //Arcam logo
                                   wARCAM.visible = false;  
                                   AVR600.showWidgets();
                                   //Turn off Zone indicator
                                   eval('wZONE' + CURRENTZONE).visible = true;                            
                                   AVR600.reqCurSource();
                                   AVR600.reqMute();
                               break;
                       }
               break;
           case "\x0D":    //REQUEST ARCAM VOLUME
                       System.print("COMMAND CODE REQUEST VOLUME");
                       try
                       {
                           if(!MUTESTATUS)
                           {                        
                               var tempVol1 = parseInt(commandData.charCodeAt(0).toString(16),16);
                               var tempVol2 = parseInt(commandData.charCodeAt(1).toString(16),16);
                               
                               if(isNaN(tempVol1))
                               {
                                   wVOLTEXT.label = " ";
                               }
                               else
                               {  
                                   wVOLTEXT.label = tempVol1 + "." + tempVol2;  
                                   CURRENTVOL = tempVol1 + "." + tempVol2;                                                        
                               }
                               //Set the volume bar to the correct image
                               wVOLBAR.setImage(   wVOLUME[volImg(tempVol1)].getImage()    );                        
                           }
                       }
                       catch(error)
                       {
                           System.print("VOLUME BAR ERROR: " + error);
                           wVOLBAR.setImage( wVOLUME[0].getImage());
                       }
               break;
                           //MUTE STATUS
           case "\x0E":
                       switch(commandData.charAt(0))
                       {
                           case "\x00":
                                       System.print("MUTE ON");
                                       MUTESTATUS = true;
                                       wVOLTEXT.label = "MUTE";
                                       wVOLBAR.setImage(   wVOLUME[volImg(0)].getImage()    );
                               break;
                           case "\x01":
                                       System.print("MUTE OFF");
                                       MUTESTATUS = false;
                                       wVOLTEXT.label = CURRENTVOL;  ;
                                       scheduleAfter(2000, wrapGetVolume);                                
                               break;
                       }
               break;                
           case "\x09":    //REQUEST CURRENT SOURCE INFO
                           System.print("COMMAND CODE REQUEST INFO");
               break;
           case "\x1A":    //REQUEST RADIO NOW PLAYING
                           System.print("COMMAND CODE REQUEST NOW PLAYING");
                           wNOWPLAYING.label = commandData.wordWrap(30,"\n", false);
               break;
           case "\x1D":
                           //REQUEST CURRENT SOURCE
                       System.print("COMMAND CODE REQUEST SOURCE");
                       //Set the update flag to false to prevent polling on unnecessary sources
                       //Only set it to true again on the radio sources.
                       UPDATERADIOINFO = false;
                       
                       CF.widget("NAME", "RADIO", "ARCAM_AVR600").label = " ";
                       CF.widget("GENRE", "RADIO", "ARCAM_AVR600").label = " ";
                       CF.widget("NOWPLAYING", "RADIO", "ARCAM_AVR600").label = "Source Info not available";
                       switch(commandData.charAt(0))
                       {
                           case "\x00":
                                       System.print("FOLLOW ZONE 1 SELECTED");
                                       CURRENTSOURCE = "FOLLOW1";
                                       CANPOLL = false;
                               break;
                           case "\x01":
                                       System.print("CD SELECTED");
                                       CURRENTSOURCE = "CD";
                                       CANPOLL = false;
                               break;
                          case "\x02":
                                       System.print("DVD SELECTED");
                                       CURRENTSOURCE = "DVD";
                                       CANPOLL = false;
                               break;
                          case "\x03":
                                       System.print("AV SELECTED");
                                       CURRENTSOURCE = "AV";
                                       CANPOLL = false;
                               break;
                          case "\x04":
                                       System.print("SAT SELECTED");
                                       CURRENTSOURCE = "SAT";
                                       CANPOLL = false;
                               break;
                          case "\x05":
                                       System.print("PVR SELECTED");
                                       CURRENTSOURCE = "PVR";
                                       CANPOLL = false;
                               break;
                          case "\x06":
                                       System.print("VCR SELECTED");
                                       CURRENTSOURCE = "VCR";
                                       CANPOLL = false;
                               break;
                          case "\x07":
                                       System.print("TAPE SELECTED");
                                       CURRENTSOURCE = "TAPE";
                                       wNAME = " NO INFO ";
                                       CANPOLL = false;
                               break;
                          case "\x08":
                                       System.print("AUX SELECTED");

                                       CURRENTSOURCE = "AUX";
                                       CANPOLL = false;
                               break;
                          case "\x09":
                                       System.print("PHONO SELECTED");
                                       CURRENTSOURCE = "PHONO";
                                       CANPOLL = false;
                               break;
                           case "\x0A":
                                       System.print("AM TUNER SELECTED");
                                       CURRENTSOURCE = "AM";
                                       CANPOLL = true;
                                       UPDATERADIOINFO = true;
                               break;
                           case "\x0B":
                                       System.print("FM TUNER SELECTED");
                                       CURRENTSOURCE = "FM";
                                       CANPOLL = true;
                                       UPDATERADIOINFO = true;
                                       scheduleAfter(3000, wrapGetRadioName);
                                       AVR600.getFMInfo();
                               break;
                           case "\x0C":
                                       System.print("DAB TUNER SELECTED");
                                       CURRENTSOURCE = "DAB";
                                       CANPOLL = true;
                                       UPDATERADIOINFO = true;
                                       scheduleAfter(3000, wrapGetRadioName);
                                       AVR600.getDABInfo();
                               break;
                          case "\x0E":
                                       System.print("NET SELECTED");
                                       CURRENTSOURCE = "NET";
                               break;
                          case "\x0F":
                                       System.print("IPOD SELECTED");
                                       CURRENTSOURCE = "IPOD";
                               break;
                       }    
                       
                       CF.widget("SOURCE", "RADIO", "ARCAM_AVR600").label = CURRENTSOURCE;
               break;    
           case "\x12":    //REQUEST RADIO RDS INFO
                       System.print("COMMAND CODE REQUEST RDS INFO");
                       CF.widget("NOWPLAYING", "RADIO", "ARCAM_AVR600").label = "RDS: " + commandData;
               break;            
           case "\x17":    //REQUEST RADIO PRESET NUMBER
                       System.print("COMMAND CODE REQUEST PRESET");
                       wPRESET.label = "Preset: " + commandData.charCodeAt(0).toString(16);
               break;
           case "\x16":    //REQUEST RADIO FREQUENCY
                       System.print("COMMAND CODE REQUEST FREQUENCY");
                       switch(CURRENTSOURCE)
                       {
                           case "AM":
                                   wGENRE.label = "Freq: " + parseInt(commandData.charCodeAt(0).toString(16),16) +
                                                             parseInt(commandData.charCodeAt(1).toString(16),16) + "kHz";
                               break;
                           case "FM":
                                   wGENRE.label = "Freq: " + parseInt(commandData.charCodeAt(0).toString(16),16) + "." +
                                                             parseInt(commandData.charCodeAt(1).toString(16),16) + "MHz";
                               break;
                       }
                     
               break;                      
           case "\x18":    //REQUEST DAB RADIO NAME
                       System.print("COMMAND CODE REQUEST NAME");
                       CF.widget("NAME", "RADIO", "ARCAM_AVR600").label = commandData;
               break;          
           case "\x19":    //REQUEST DAB RADIO GENRE
                       System.print("COMMAND CODE REQUEST GENRE");
                       CF.widget("GENRE", "RADIO", "ARCAM_AVR600").label = commandData;
               break;
       }
       //Once we have received some data, we can then call the next item in the
       //command queue and send it to the AVR600.
       if(commandQueue > 0)
       {
           System.print("ONDATA - NEXT COMMAND SENT");
           var nextCommand = commandQueue[0];
           this.serial.match(nextCommand, "\x0D", SEND_TIMEOUT);
           System.delay(200);
       }
       
   };
////////    ERROR MANAGEMENT
   this.serial.onTimeout = function(myTimeout)
   {    
       System.print("SERIAL TIMEOUT");
       
   }
   this.serial.onError = function(myError)
   {
       System.print("SERIAL ERROR: " + myError);  
       
   };
   //ARCAM DEVICE FUNCTIONS - POWER ON/OFF VOLUME UP/DOWN TUNE UP/DOWN
   this.reqPowerState = function()
   {
       this.sendString(REQPOWER);
   };
   this.powerOn = function()
   {
       this.sendString(POWON);
       wLOADING.visible = true;
       CANPOLL = true;
       //Once the system has fully started up, then get current informaiton
       scheduleAfter(7000, getPowerState);
       
   }
   this.powerOff = function()
   {
       this.sendString(POWOFF);
       CANPOLL = false;
       wVOLTEXT.label = "OFF";
       this.hideWidgets();
       wARCAM.visible = true;
   };
   this.volumeUp = function()
   {
       this.sendString(VOLUP);
   };
   this.volumeDown = function()
   {
       this.sendString(VOLDOWN);
   };
   this.mute = function()
   {
       this.sendString(VOLMUTE);    
   };
   //REQUEST VOLUME
   this.reqVol = function()
   {
       System.print("REQ VOL CUR ZONE: " + CURRENTZONE);
   
       switch(CURRENTZONE)
       {
           case 1:
                   this.serial.receive("\x21\x01\x0D\x01\xF0\x0D", 8, SEND_TIMEOUT);            
               break;
           case 2:
                   this.serial.receive("\x21\x02\x0D\x01\xF0\x0D", 8, SEND_TIMEOUT);  
               break;
           case 3:
                   this.serial.receive("\x21\x03\x0D\x01\xF0\x0D", 8, SEND_TIMEOUT);  
               break;
       }
   };
   this.reqMute = function()
   {
       this.sendString(REQSTATEMUTE);
   };
   this.reqInfo = function()
   {
       this.sendString("\x09\x01\xE0\x0D");
   }
   //TUNER FUNCTIONS - STATION NAME. NOW PLAYING. PRESET NUMBER.
   this.radioPresetUp = function()
   {
       this.sendString(PRESETUP);
       this.sendString(PRESETOK);
       
       scheduleAfter(3000, wrapGetCurSource);
       updateRadioInfo();
   };
   this.radioPresetDown = function()
   {
       this.sendString(PRESETDOWN);
       this.sendString(PRESETOK);
       
       scheduleAfter(3000, wrapGetCurSource);
       updateRadioInfo();
   };
   this.radioTuneUp = function()
   {
       System.print("TUNE UP");
       switch(CURRENTSOURCE)
       {
           case "FM":
                       this.sendString(TUNEUP);            
               break;
           case "DAB":
                       this.DABTuneUp();
               break;
       }
   };
   this.radioTuneDown = function()
   {
       System.print("TUNE DOWN");
       switch(CURRENTSOURCE)
       {
           case "FM":
                       this.sendString(TUNEDOWN);            
               break;
           case "DAB":
                       this.DABTuneDown();            
               break;
       }
   };
   this.DABTuneUp = function()
   {
       this.sendString(DABUP);
       this.sendString(DABOK);
   };
   this.DABTuneDown = function()
   {
       this.sendString(DABDOWN);
       this.sendString(DABOK);
   };
   this.reqRadioPreset = function()
   {
       this.sendString("\x15\x01\xF0\x0D");      
   };  
   this.reqRadioFreq = function()
   {
       this.sendString(REQRADIOFREQ);
   };
   //AM RADIO REQUESTS
   //FM RADIO REQUESTS
   this.reqFMRDS = function()
   {
       this.sendString(REQFMRDS);
   };
   this.getFMInfo = function()
   {   System.print("GET FM INFO");
       this.reqDABName();
       this.reqRadioFreq();
       this.reqFMRDS();
   };
   //DAB RADIO REQUESTS
   this.reqDABName = function()
   {
       this.sendString(REQDABNAME);    
   };
   this.reqDABNP = function()
   {
       this.sendString("\x1A\x01\xF0\x0D");  
   };
   this.reqDABGenre = function()
   {
       this.sendString("\x19\x01\xF0\x0D");
   };    
   this.getDABInfo = function()
   {
       this.reqDABName();
       this.reqDABNP();
       this.reqDABGenre();
   };
   //  SOURCE SELECT FUNCTIONS
   this.reqAM = function()
   {
       this.sendString(REQRADIOAM);
       wSOURCE.label = "AM";
       CURRENTSOURCE = "AM";
   };
   this.reqFM = function()
   {
       this.sendString(REQRADIOFM);
       wSOURCE.label = "FM";
       CURRENTSOURCE = "FM";
   };
   this.reqDAB = function()
   {
       this.sendString(REQRADIOFM);
       this.sendString(REQRADIODAB);
       wSOURCE.label = "DAB";
       CURRENTSOURCE = "DAB";
       scheduleAfter(1500, wrapGetCurSource);
   };
   //  REQUEST CURRENT SOURCE
   this.reqCurSource = function()
   {
       this.sendString(REQSOURCE);
   };
   //  SET THE REQUESTED ZONE
   this.setZone = function(newZone)
   {
       CURRENTZONE = newZone;
       //Change the displayed zone widget depending on what's been pressed
       switch(CURRENTZONE)
       {
           case 1:
                  wZONE1.visible = true;
                  wZONE2.visible = false;
                  wZONE3.visible = false;  
               break;
           case 2:
                  wZONE1.visible = false;
                  wZONE2.visible = true;
                  wZONE3.visible = false;
               break;
           case 3:
                  wZONE1.visible = false;
                  wZONE2.visible = false;
                  wZONE3.visible = true;
               break;
       }
       AVR600.reqPowerState();
       AVR600.reqCurSource();
   };
   //  SHOW OR HIDE OUR DISPLAY WIDGETS
   this.hideWidgets = function()
   {
       System.print("---HIDE WIDGETS---");
       wNOWPLAYING.visible = false;
       wGENRE.visible = false;
       wNAME.visible = false;
       wSOURCE.visible = false;
   };
   this.showWidgets = function()
   {
        wNOWPLAYING.visible = true;
        wGENRE.visible = true;
        wNAME.visible = true;
        wSOURCE.visible = true;    
        //And hide the powering on..label
        wLOADING.visible = false;
   };
};
//////////////////////////////////////////////////////////////////////////////
/////////   END OF ARCAM AVR600 CLASS   //////////////////////////////////////
function updateRadioInfo()
{
   System.print("UPDATE RADIO INFO");

       if(POWERSTATE)
       {          
           if(CANPOLL)     //If I'm allowed to poll the radio stations (don't want to if it's a DVD or SAT..)
           {        
               switch(CURRENTSOURCE)
               {
                   case "AM":
                               AVR600.getFMInfo();
                       break;
                   case "FM":
                               AVR600.getFMInfo();
                       break;
                   case "DAB":
                               AVR600.getDABInfo();
                       break;
               }    
               AVR600.reqVol();
           }
       }    
}

/////////   TASK SCHEDULER - TO MANAGE SCHEDULED REQUESTS AND TO STOP USING UP ALL THE TIMERS
function taskManager()
{
   if(UPDATERADIOINFO)
   {
       updateRadioInfo();
   }

   scheduleAfter(15000, taskManager);
};


/////////   WRAPPER FUNCTIONS - FOR SCHEDULEAFTERS
function getPowerState()
{
   AVR600.reqPowerState();
};
function wrapGetVolume()
{
   AVR600.reqVol();
};
function wrapGetCurSource()
{
   AVR600.reqCurSource();
};
function wrapGetRadioName()
{
   switch(CURRENTSOURCE)
   {
       case "FM":
               AVR600.reqDABName();
           break;
       case "DAB":
               AVR600.reqDABName();
           break;
   }
};
/////////   THIS IS FOR DEBUGGING ONLY
function showHEX(a)
{
var b="";
var i=0;
for(i=0; i < a.length; i++)
{
   b+=" \x" + a.charCodeAt(i).toString(16);
};
return b;
}
// string extensions for wordwrap + trimming
String.prototype.wordWrap = function(m, b, c){
var i, j, s, r = this.split("\n");
if(m > 0) for(i in r){
for(s = r[i], r[i] = ""; s.length > m;
j = c ? m : (j = s.substr(0, m).match(/\S*$/)).input.length - j[0].length
|| m,
r[i] += s.substr(0, j) + ((s = s.substr(j)).length ? b : "")
);
r[i] += s;
}
return r.join("\n");
};

function volImg(thisVol)
{
   var newVol = thisVol;
   newVol = newVol/10;
   newVol = Math.round(newVol);
   return newVol;
};

function audioOptions()
{
   wOVERLAY.visible    = !wOVERLAY.visible;
   wDIRECTON.visible   = !wDIRECTON.visible;
   wDIRECTOFF.visible  = !wDIRECTOFF.visible;
   wPL.visible         = !wPL.visible;
   wPLGAME.visible     = !wPLGAME.visible;
   wPLMOVIE.visible    = !wPLMOVIE.visible;
   wPLMUSIC.visible    = !wPLMUSIC.visible;
   wDTSCINEMA.visible  = !wDTSCINEMA.visible;
   wDTSMUSIC.visible   = !wDTSMUSIC.visible;
   wSTEREO.visible     = !wSTEREO.visible;
   wDOLBYEX.visible    = !wDOLBYEX.visible;
   wMULTICHANNEL.visible   = !wMULTICHANNEL.visible;
   
}


/////////   SETUP THE SOCKET FOR COMMUNICATIONS
initComms();

var AVR600 = new ArcamAVR600(serialPort);
//Start the task manager
taskManager();
               
AVR600.reqPowerState();

dvlz303

is het mogelijk mij ook een kopietje te doen van die code?

jowi

Het meest interessante staat hierboven. De rest is een verzameling xml specifiek voor de pronto aansturing, en een database met de IR commando's en pronto specifieke zaken, en een mapje met bitmaps voor de pronto, allemaal niet spannend verder.

Overigens bevat ook bovenstaande code niets nieuws wat we zelf ook al niet deden... er is geen sprake van bepaalde speciale commando's, protocollen of volgorden, allemaal heel straight-forward code... het is zelfs niet eens async van opzet; ze sturen een commando en wachten dan gewoon op de response. Gevaarlijk, maar goed als de Arcam doet wat ie moet doen, is dat prima... de commando's die hier dus gebruikt worden, doen het dus blijkbaar allemaal continue goed. Nou dat kan ik wel een keer testen :)

jowi

Zat een beetje na te denken over Arcam's reactie op de foute (terug) communicatie met de netwerkkaart, en dat dit de schuld zou zijn van interne software op de netwerkkaart die niet goed zou zijn, en dat Arcam daar niets aan kon doen omdat dit component ingekocht zou zijn. Op zich een heel raar verhaal, want AL het andere netwerkverkeer bijv. voor uPNP en de ingebouwde website, gaan altijd goed... als het zo low-level zou zijn zouden die ook fout moeten gaan... Ik twijfel dus heel erg aan het verhaal van Arcam, om het netjes te zeggen.

maxtrash

Quote from: jowi on November  6, 2010, 16:27:31
Zat een beetje na te denken over Arcam's reactie op de foute (terug) communicatie met de netwerkkaart, en dat dit de schuld zou zijn van interne software op de netwerkkaart die niet goed zou zijn, en dat Arcam daar niets aan kon doen omdat dit component ingekocht zou zijn. Op zich een heel raar verhaal, want AL het andere netwerkverkeer bijv. voor uPNP en de ingebouwde website, gaan altijd goed... als het zo low-level zou zijn zouden die ook fout moeten gaan... Ik twijfel dus heel erg aan het verhaal van Arcam, om het netjes te zeggen.
sowieso is het onzin natuurlijk. Álle componenten van de receiver zijn ingekocht en Arcam is er verantwoordelijk voor dat ze dan de goede componenten inkopen. Maar inderdaad vreemd dat ingewikkelde dingen goed gaan en een simpele telnet-verbinding niet

bmateijsen

Quote from: jowi on November  6, 2010, 16:27:31
Zat een beetje na te denken over Arcam's reactie op de foute (terug) communicatie met de netwerkkaart, en dat dit de schuld zou zijn van interne software op de netwerkkaart die niet goed zou zijn, en dat Arcam daar niets aan kon doen omdat dit component ingekocht zou zijn. Op zich een heel raar verhaal, want AL het andere netwerkverkeer bijv. voor uPNP en de ingebouwde website, gaan altijd goed... als het zo low-level zou zijn zouden die ook fout moeten gaan... Ik twijfel dus heel erg aan het verhaal van Arcam, om het netjes te zeggen.

UPNP is een makkelijk protocol wat daar voor een deel los van staat...

Groet,

Bjorn

bmateijsen

Quote from: maxtrash on November  6, 2010, 16:29:57
sowieso is het onzin natuurlijk. Álle componenten van de receiver zijn ingekocht en Arcam is er verantwoordelijk voor dat ze dan de goede componenten inkopen. Maar inderdaad vreemd dat ingewikkelde dingen goed gaan en een simpele telnet-verbinding niet

Stuur het gewoon RS232 aan over de RS232 verbinding?

jowi

Quote from: bmateijsen on November  6, 2010, 16:30:53
UPNP is een makkelijk protocol wat daar voor een deel los van staat...
Nogmaals, als het waar is wat Arcam beweerd dan zou ALLES wat door de netwerkkaart uitgestuurd wordt, corrupt moeten zijn, zo simpel is het.
Heeft niets met protocol te maken, dat is een laag daarboven. Het bewijst dat de kaart of hardware zelf dus prima werkt, maar dat het specifieke IP commando gedeelte, software van Arcam zelf dus, gewoon niet goed is.

bmateijsen

Quote from: jowi on November  6, 2010, 16:53:32
Nogmaals, als het waar is wat Arcam beweerd dan zou ALLES wat door de netwerkkaart uitgestuurd wordt, corrupt moeten zijn, zo simpel is het.
Heeft niets met protocol te maken, dat is een laag daarboven. Het bewijst dat de kaart of hardware zelf dus prima werkt, maar dat het specifieke IP commando gedeelte, software van Arcam zelf dus, gewoon niet goed is.

Ik heb het apparaat niet ontworpen, maar weet wel wat wel en niet werkt ;).

Groet,

Bjorn

jowi

Quote from: bmateijsen on November  6, 2010, 16:31:25
Stuur het gewoon RS232 aan over de RS232 verbinding?
Dat is op z'n best een tijdelijke workaround en geen oplossing. Hoe ga je een iPAD met de AVR600 laten praten als er een draad tussen moet hangen... sure, er zijn vast wel weer apparaten en controllers die wifi naar RS232 omzetten, maar nogmaals, jaren '60 techniek uit de vorige eeuw is geen oplossing... :D

jowi

Quote from: bmateijsen on November  6, 2010, 16:54:34
Ik heb het apparaat niet ontworpen, maar weet wel wat wel en niet werkt ;).
Ja en? Ik snap je punt niet. Ik heb een B.Sc. titel op het gebied van Computer Architectuur, moet ik je het OSI model even uitleggen?

bmateijsen

Quote from: jowi on November  6, 2010, 16:58:34
Ja en? Ik snap je punt niet. Ik heb een B.Sc. titel op het gebied van Computer Architectuur, moet ik je het OSI model even uitleggen?

Wat ik bedoel is dat ik als normale gebruiker het apparaat bedien en daar geen enkel probleem mee heb ;).

Maar ik ken je nieuwsgierigheid, het gaat alleen ver buiten een normale gebruiker ;)

jowi

Ja ok, maar voor zo'n duur apparaat en de naam die Arcam heeft, valt het me toch wat tegen. Krijg niet echt het idee dat ze erg scheutig zijn met informatie, firmware en het oplossen van problemen... erg jammer.

bmateijsen

Quote from: jowi on November  6, 2010, 17:20:57
Ja ok, maar voor zo'n duur apparaat en de naam die Arcam heeft, valt het me toch wat tegen. Krijg niet echt het idee dat ze erg scheutig zijn met informatie, firmware en het oplossen van problemen... erg jammer.

Ik vind dat de huidige firmware een paar bijschaafpunten heeft, en daar zijn we nog mee bezig. Maar verder vindt ik het goed werken.

Groet,

Bjorn