/*
 * Copyright (C) 2013 Thomas M. Alldread
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package va7ta.app.nimblesigsweepgen;

import va7ta.app.nimblesigsweepgen0r1.R;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;

public class SetLevelA extends Activity {

		private static final String TAG = "NimbleSig.SetLevelA";//ID for debug progress error message
	    private static final boolean D = true;
	    
	    
	    private String currentLevelA="0";
	    private String newLevelA="0";
	    private String newLevelA_Value="0";
	    private String newLevelA_mDeg="0";
	    
		private Button mLevelA_SetButton;
		private SeekBar mCourseAdjSeekBar;
		private SeekBar mFineAdjSeekBar;
		private SeekBar mExtraFineAdjSeekBar;
		
		private int start_positionCrs=0; 
		private int dBmInt=0; 
	    private int millidBm;
		private int start_positionFine=0; 

		private float dBm=0; 
	    private float temp=0;
		private float startCrs=0; 
		private float endCrs=0; 
		private float start_posCrs=0; 
		private float startFine=0; 
		private float endFine=0; 
		private float start_posFine=0; 
		private float lastFineCorrection=0;
		private float fineCorrection=0;

		private boolean fineBarAutoCentre=false;
		private boolean courseBarAutoAdj=false;
		
		private byte amModStatusByte=0;
		
		
		@Override
		public void onCreate(Bundle icicle) {
	    super.onCreate(icicle);
	    	if(D) Log.e(TAG, "+++ SET GEN A OUTPUT LEVEL +++");

	        Intent currentValIntent = getIntent();
	        if(currentValIntent.hasExtra("valLevelA")){
	            currentLevelA = currentValIntent.getStringExtra("valLevelA");
	        }
	        if(currentValIntent.hasExtra("statusAM_ModGenA")){
	        	amModStatusByte = currentValIntent.getByteExtra("statusAM_ModGenA",(byte)0);
	        }
	        
	    	setContentView(R.layout.activity_nimble_sig_rfgen_set_level);// Paint the adjust screen

	        TextView levelAValStr =(TextView) findViewById(R.id.newValue);
	        levelAValStr.setText(currentLevelA);            
	    	TextView levelAdjTitle = (TextView) findViewById(R.id.parameterAdjustTitle); 
	    	levelAdjTitle.setText("VFO 'A' Output Level - dBm");	    	
	    	
	    	//Course SeekBar range is 0-100 units
	    	//Initialize Bar settings
	        dBm=(Float.valueOf(currentLevelA)); 
	        float centiBm=10*dBm; //convert to centiBm units
            if(amModStatusByte ==0) start_posCrs =-(-200-centiBm);
            else start_posCrs =-(-260-centiBm);	    	        
	        start_positionCrs=(int) (start_posCrs); 
	        mCourseAdjSeekBar=(SeekBar) findViewById(R.id.courseAdj_Bar); 
	        mCourseAdjSeekBar.setProgress(start_positionCrs); 
	        mFineAdjSeekBar=(SeekBar) findViewById(R.id.fineAdj_Bar); 
	        mFineAdjSeekBar.setProgress(5); 

	        
	        mCourseAdjSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { 

	            @Override 
	            public void onStopTrackingTouch(SeekBar seekBar) { 
	                // TODO Auto-generated method stub 
	/*
	            	if (dBm >= 0){
	            		millidBm *= (int)1000;
	            	}
	            	if (dBm < 0){
	            		millidBm = (int)(360-dBm)*1000;
	            	}
	            	
	                newLevelA_mDeg = String.valueOf(millidBm);
//	            	sendMessage("pa"+newLevelA_mDeg);
	*/
	            	lastFineCorrection = 0;
	                mFineAdjSeekBar.setProgress(5);
	            } 

	            @Override 
	            public void onStartTrackingTouch(SeekBar seekBar) { 
	                // TODO Auto-generated method stub 

	            } 

	            @Override 
	            public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) { 
	                // TODO Auto-generated method stub 
	            	if(!courseBarAutoAdj){
		            	// To convert it as dBm value 
		                float temp=progress; //0.0 to 100 scale for -20.0 to -10.0 dBm range
		                if(amModStatusByte ==0) dBm=(float)(temp-200)/10;
		                else dBm=(float)(temp-260)/10;
		                newLevelA = String.valueOf(dBm);
		                upDateLevelAVal(dBm);
	            	}else courseBarAutoAdj=false;
	            } 
	        }); 
	 
	        mFineAdjSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { 

	            @Override 
	            public void onStopTrackingTouch(SeekBar seekBar) { 
	                // TODO Auto-generated method stub 
	                // To convert it as dBm value 
	                float deg = dBm;
	                courseBarAutoAdj=true;
	                float centiBm = 10*dBm;
	                if(amModStatusByte ==0) start_posCrs =-(-200-centiBm);
	                else start_posCrs =-(-260-centiBm);	    	        
	    	        start_positionCrs=(int) (start_posCrs);	                
	                mCourseAdjSeekBar.setProgress(start_positionCrs);
	                fineBarAutoCentre=true;
	                mFineAdjSeekBar.setProgress(5);
	                lastFineCorrection = 0;	                
	            } 

	            @Override 
	            public void onStartTrackingTouch(SeekBar seekBar) { 
	                // TODO Auto-generated method stub 

	            } 

	            @Override 
	            public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) { 
	                // TODO Auto-generated method stub 
	            	if(!fineBarAutoCentre){
		                temp=progress;
		                fineCorrection=(temp-5);		                
		                fineCorrection/=10;		                
		                dBm += (fineCorrection-lastFineCorrection);            
		                lastFineCorrection = fineCorrection;
		                float test1 = dBm;
		                newLevelA = String.valueOf(dBm);
		                upDateLevelAVal(dBm);
	            	}
	                else fineBarAutoCentre = false;
	            } 
	        }); 
	 
	    }//onCreate 
		
		
	    public void upDateLevelAVal(float val) {
	        TextView LevelA_ValLabel = (TextView) findViewById(R.id.newValue);
	        val*=10;
	        val+=.5;
	        dBmInt = (int)(val);
	        float roundedVal = (float)dBmInt/10;
	        LevelA_ValLabel.setText(String.valueOf(roundedVal));
	    }

	    @Override
	    public synchronized void onResume() {
	        super.onResume();
	    	if(D) Log.e(TAG, "+++ ON RESUME +++");
	       

	        //VFO A Level SET button with a listener that for click events
	        mLevelA_SetButton = (Button) findViewById(R.id.updateLevelBtn);
	        mLevelA_SetButton.setOnClickListener(new OnClickListener() {
	        	public void onClick(View v) {
	                TextView LevelA_Value=(TextView) findViewById(R.id.newValue);
	                newLevelA_Value = LevelA_Value.getText().toString();
	            	Intent newLevelA_Val=new Intent(getApplicationContext(), NimbleSigSweepGenMain.class);
	            	newLevelA_Val.putExtra("valLevelA",newLevelA_Value);
	        		finish ();
	        	}
	        });
	        
	    }//onResume
	    
	    @Override
	    public void finish() {
	      // Prepare data intent 
	      Intent newLevelA_ValIntent = new Intent();
	      newLevelA_ValIntent.putExtra("valLevelA", newLevelA_Value);
	      // Activity finished ok, return the data
	      setResult(RESULT_OK, newLevelA_ValIntent);
	      super.finish();
	    } 
	   
	    @Override
	    public synchronized void onPause() {
	        super.onPause();
//		        if(D) Log.e(TAG, "- ON PAUSE -");
	    }

	    @Override
	    public void onStop() {
	        super.onStop();
//		        if(D) Log.e(TAG, "-- ON STOP --");
	    }

	    @Override
	    public void onDestroy() {
	        super.onDestroy();
//		        if(D) Log.e(TAG, "--- ON DESTROY ---");
	    }


	}
