void AddressSpace::Read( UINT32 param0, CLR_RT_TypedArray_UINT8 param1, INT32 param2, INT32 param3, HRESULT &hr )
{
	if( (param2 < 0) || (param3 < 0) || ((param2 + param3) > param1.GetSize()) )
	{
		hr = CLR_E_OUT_OF_RANGE;
		return;
	}

	memcpy(param1.GetBuffer() + param2, (void*)param0, param3);
}
INT8 SoftwareI2CBus::NativeI2CWriteRead(  INT32 clockPin, INT32 dataPin, INT32 clockRateKhz, UINT16 address, CLR_RT_TypedArray_UINT8 writeBuffer, INT32 writeOffset, INT32 writeLength, CLR_RT_TypedArray_UINT8 readBuffer, INT32 readOffset, INT32 readLength, INT32 * numWritten, INT32 * numRead, HRESULT &hr )
{
	if( (writeOffset < 0) || (writeLength < 0) || ((writeOffset + writeLength) > writeBuffer.GetSize()) ||
		(readOffset < 0) || (readLength < 0) || ((readOffset + readLength) > readBuffer.GetSize()) 
		)
	{
		hr = CLR_E_INDEX_OUT_OF_RANGE;
		return FALSE;
	}

	GHI_OSHW_HAL_SoftwareI2C i2c;
	i2c.scl = clockPin;
	i2c.sda = dataPin;
	i2c.clockSpeed = clockRateKhz;
	i2c.address = address;

	return GHI_OSHW_HAL_SoftwareI2C_WriteRead(&i2c, writeBuffer.GetBuffer() + writeOffset, writeLength, readBuffer.GetBuffer() + readOffset, readLength, (UINT32*)numWritten, (UINT32*)numRead);
}
void Stm32F4Random::NativeGetBytes( CLR_RT_TypedArray_UINT8 param0, HRESULT &hr )
{
    unsigned char* arr = param0.GetBuffer();
    unsigned int length = param0.GetSize();
    unsigned int offset = 0;

    UINT32 rand;

    if (length > sizeof(rand))
    {
        for (offset = 0; offset < length-sizeof(rand); offset += sizeof(rand))
        {
            rand = Random_Generate();
            memcpy(arr+offset, &rand, sizeof(rand));
        }
    }
    if (offset < length)
    {
        unsigned int difference = length - offset;
        rand = Random_Generate();
        memcpy(arr+offset, &rand, difference);
    }
    
}
void Util::PlayPCMAudio( UINT8 param0, CLR_RT_TypedArray_UINT8 param1, INT32 param2, INT32 param3, INT32 param4, HRESULT &hr )
{
	int i; 
	UINT32 delay = 1000000 / param4 ;
  INT32 resMax=0;
	BYTE *buffer = param1.GetBuffer() + param2;
	INT32 value;
	DA_CHANNEL channel = (DA_CHANNEL)param0;	 
  //delay = delay+(delay/4);
	//if ((mask_channel & (1<<param0) )==0) // Initialize one time 
	{
		UINT32 size=0;
		INT32  precisions[1];
    
		if (DA_GetAvailablePrecisionsForChannel(channel,precisions,size)== FALSE)
		{
			hr = CLR_E_INVALID_OPERATION;
			return;
		}
		if (DA_Initialize(channel,precisions[0])== FALSE)
		{
			hr = CLR_E_INVALID_OPERATION;
			return;
		}
		for (i=0; i< precisions[0]; i++)
		{
			resMax = (resMax<<1) | 1;
		}   
		//mask_channel |= (1<<param0);
	}

	for(i = 0; i < param3; i++)
	{
		value = (resMax * (buffer[i] - ANALOG_OUT_SCALE_VALUE_MIN)) / (ANALOG_OUT_SCALE_VALUE_MAX - ANALOG_OUT_SCALE_VALUE_MIN);	
		DA_Write( channel, value );			
		HAL_Time_Sleep_MicroSeconds_InterruptEnabled(delay);
	}
}
void PacketRadio::GetPacket( CLR_RT_TypedArray_UINT8 param0, HRESULT &hr )
{
    int len = param0.GetSize();
    memcpy(param0.GetBuffer(), Radio_PacketReceived_RxPacket, len);
}
void PacketRadio::Transmit( CLR_RT_TypedArray_UINT8 param0, HRESULT &hr )
{
  PacketRadio_Send(param0.GetBuffer(), param0.GetSize());
}
void Util::BitmapConvertBPP( CLR_RT_TypedArray_UINT8 bitmap, CLR_RT_TypedArray_UINT8 output, UINT8 bpp, HRESULT &hr )
{
	hr = OSHW_PAL_Bitmap_ConvertBPP(bitmap.GetBuffer(), bitmap.GetSize(), output.GetBuffer(), output.GetSize(), bpp);
}