//Handles synchronous commands that need queueing for long running operations. public bool syncCommand( DomeCmds inCmd, double cmdArg ) { bool outputStatus = false; if ( inCmd == DomeCmds.ABORT ) { //clear down the existing queue - leave state at aborting. domeState = DomeStates.ABORTING; this.cmdQueue.Clear(); logger.LogMessage( this.GetType().ToString(), " ABORT coomand detected - clearing CMD queue of: " + cmdQueue.Count + " entries"); //let timer handle the dome and shutter. } else { //NOT IMPLEMENTED: enqueue the new command in case there are existing long-running commands. // this allows the driver to respond rapidly but long commands to take their time in the right order for multiple clients. switch( inCmd ) { case DomeCmds.PARK: outputStatus = rotateDome( parkAzimuth); break; case DomeCmds.SLEW_TO_AZIMUTH: outputStatus = rotateDome( (int) cmdArg ); break; case DomeCmds.SLEW_TO_ALTITUDE: outputStatus = moveShutter( (int) cmdArg ); break; case DomeCmds.SYNC_TO_AZIMUTH: azimuth = (int)cmdArg; outputStatus = true; break; case DomeCmds.SET_SLAVED: azimuth = (int)cmdArg; outputStatus = true; break; case DomeCmds.OPEN_SHUTTER: outputStatus = moveShutter( 110 ); break; case DomeCmds.CLOSE_SHUTTER: outputStatus = moveShutter( 0 ); break; // logger.LogMessage( this.GetType().ToString(), " Setting new CMD tuple: " + inCmd + " with value: " + cmdArg + " to queue"); // cmdQueue.Enqueue( new CmdTuple( inCmd, cmdArg ) ); default: throw new ASCOM.InvalidOperationException("This cmd is not implemented in syncCommand handler, check for direct function calls."); break; } } return true; }
private bool rotateDome( int target ) { bool status = false; bool direction = true; byte[] outData = new byte[5]; String dateString; String stateString; char[] charString; int magnitude = (target - (int) azimuth)/360; //Check current azimuth //Estimate shortest direction and distance to travel if( magnitude > 0 && magnitude <180 ) { direction = true; } else if ( magnitude > 180 && magnitude <360 ) { direction = false; magnitude = magnitude -180; } else if( magnitude < 0 && magnitude > -180 ) { direction = false; } else if( magnitude < -180 && magnitude > -360 ) { direction = true; magnitude = 360 + magnitude; } //Setup slew //LCD //Move to row 4 outData[0] = (byte) 0x01 ;//go to row outData[1] = (byte) 0x03 ;//row if ( obboPort.Write( (byte) 0x55, (byte) config.I2CLCDAddr, outData, 2 ) ) retVal = 0; //Move to first col outData[0] = (byte) 0x02 ;//go to col outData[1] = (byte) 0x00 ;//col if ( obboPort.Write( (byte) 0x55, (byte) config.I2CLCDAddr, outData, outData.Length ) ) retVal = 0; //Write 'slewing' string stateString = "slewing"; outData = new byte[stateString.Length]; charString = stateString.ToCharArray(); for( int i = 0; i< outString.Length; i++) { outData[i] = (byte) charString[i]; } if ( obboPort.Write( (byte) 0x55, (byte) config.I2CLCDAddr, outData, outData.Length ) ) retVal = 0; //Magnetometer - update azimuth outString = domePort.Read( 0x55, config.I2CMagnetometerAddress, outData, outData.Length ); //motor controller //Set motor direction outData[0] = (byte) 0x01 ;//set motor direction outData[1] = (byte) 0x03 ;//motor direction if ( obboPort.Write( (byte) 0x55, (byte) config.I2CLCDAddr, outData, outData.Length ) ) retVal = 0; //Wait for complete while( (target - azimuth) > (int) positioningPrecision ) { if () { } //Set motor speed outData[0] = (byte) 0x01 ;//set motor direction outData[1] = (byte) 0x03 ;//motor direction if ( obboPort.Write( (byte) 0x55, (byte) config.I2CLCDAddr, outData, 2 ) ) retVal = 0; //Magnetometer - update azimuth outString = domePort.Read( 0x55, config.I2CMagnetometerAddress, outData, 2 ); //delay here if poss - maybe a 'sleep(500)' } //Check we have landed. if(( target - azimuth ) < (int) positioningPrecision ) { domeState = DomeStates.STOPPED; status = true; } else { logger.LogMessage(this.GetType().ToString(), "Failed to reach requested dome azimuth: " + target ); } return status; }