text: //*****************************************************************************
  //
  // Author		: Konstantin Chizhov
  // Date			: 2013
  // All rights reserved.
  
  // Redistribution and use in source and binary forms, with or without modification, 
  // are permitted provided that the following conditions are met:
  // Redistributions of source code must retain the above copyright notice, 
  // this list of conditions and the following disclaimer.
  
  // Redistributions in binary form must reproduce the above copyright notice, 
  // this list of conditions and the following disclaimer in the documentation and/or 
  // other materials provided with the distribution.
  
  // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
  // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
  // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
  // IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
  // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
  // BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
  // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
  // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
  // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 
  // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  //*****************************************************************************
  
  #pragma once
  
  #if !defined(F_OSC) && !defined(F_CPU)
  #warning F_OSC is not defined. Assuming default value 16000000
  #define F_OSC  16000000
  #endif
  
  #include <__compatibility.h>
  
  namespace Mcucpp
  {
  	typedef uint32_t clock_freq_t;
  
  namespace Clock
  {
  	class SysClock
  	{
  	public:
  		
  		static uint32_t ClockFreq()
  		{
  		#if defined F_CPU
  			return F_CPU;
  		#else
  			uint8_t lowFuse = ReadLowFuse();
  			uint8_t ckSel = 0x0f;
  			uint32_t clock = F_OSC; 
  			
  			switch(ckSel)
  			{
  				case 0x01:
  					clock = 1000000;
  				break;
  				case 0x02:
  					clock =  2000000;
  				break;
  				case 0x03:
  					clock =  4000000;
  				break;
  				case 0x04:
  					clock = 8000000;
  				break;
  			}
  			uint8_t div = CLKPR & 0x0f;
  			return clock >> div;
  		#endif
  		}
  	};
  }
  }