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 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);
}
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 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);
}