configuring serial port from kernel space - linux-device-driver

How to configure the serial port in kernel module. I am doing this in init module function. same configuration is working in userpsace. I am using the below code to configure the serial port.
mm_segment_t oldfs;
oldfs = get_fs();
set_fs(KERNEL_DS);
fp = filp_open("/dev/ttyS0",O_RDWR | O_NOCTTY | O_NDELAY);
tty = (struct tty_struct *)fp->private_data;
setting the required configuration(tty->termios)
set_fs(oldfs);

Almost all functions of serial port operations are implemented by drivers/tty/serial/serial_core.c. If you want to do it differently then provide your own functions for uart_ops from include/linux/serial_core.h
struct uart_ops {
unsigned int (*tx_empty)(struct uart_port *);
void (*set_mctrl)(struct uart_port *, unsigned int mctrl);
unsigned int (*get_mctrl)(struct uart_port *);
void (*stop_tx)(struct uart_port *);
void (*start_tx)(struct uart_port *);
void (*send_xchar)(struct uart_port *, char ch);
void (*stop_rx)(struct uart_port *);
void (*enable_ms)(struct uart_port *);
void (*break_ctl)(struct uart_port *, int ctl);
int (*startup)(struct uart_port *);
void (*shutdown)(struct uart_port *);
void (*flush_buffer)(struct uart_port *);
void (*set_termios)(struct uart_port *, struct ktermios *new,
struct ktermios *old);
void (*set_ldisc)(struct uart_port *, int new);
void (*pm)(struct uart_port *, unsigned int state,
unsigned int oldstate);
int (*set_wake)(struct uart_port *, unsigned int state);
const char * (*type)(struct uart_port *);
void (*release_port)(struct uart_port *);
int (*request_port)(struct uart_port *);
void (*config_port)(struct uart_port *, int);
int (*verify_port)(struct uart_port *, struct serial_struct *);
int (*ioctl)(struct uart_port *, unsigned int, unsigned long);
#ifdef CONFIG_CONSOLE_POLL
void (*poll_put_char)(struct uart_port *, unsigned char);
int (*poll_get_char)(struct uart_port *);
#endif
};
In your case, you need to implement set_termios function. Also, look at uart_get_divisor() to know how to set baud rate.

Related

I am struggling to get started with a Stack and Queue and was wondering if anyone could help based on these Classes?

#include <iostream>;
using namespace std;
class Node
{
public:
Node(int value, Node* nextptr = NULL, Node* prevptr = NULL, int currentpriority = 0);
int getVal(void);
Node* getNext(void);
Node* getPrev(void);
void setVal(int value);
void setPrev(Node* prevptr);
void setNext(Node* nextptr);
int getPriority(void);
void setPriority(int priority);
private:
Node* next;
Node* prev;
int priority;
int value;
};
class Stack
{
public:
Stack(void);
~Stack(void);
void Push(int value);
Node* NodePop(void);
int Pop(void);
private:
Node* top;
};
class Queue
{
public:
Queue(void);
~Queue(void);
void Enqueue(int i, int priority = 0);
int Dequeue(void);
protected:
Node* back;
Node* front;
private:
virtual Node* NodeDequeue(void);
};
So these are the classes we have been given I am struggling to just get the ball rolling in a sense. I have done a simple stack last year with pointers and Templates but I am having trouble figuring out where to start with the added feature of the get and set functions. I am only allowed to use iostream also as a heads up.

UnityKinectDepthExplorer - how can I use this example with Kinect v1?

I'm interested in displaying Depth data in Unity with Kinect for Windows. Unfortunately, I have Kinect v1.8 and I know this has been easily done with Kinect V2 (Kinect Fusion).
I found this example: https://github.com/rickbarraza/UnityKinectDepthExplorer
I installed all the necessary components and now getting DLLNOTFOUNDEXCEPTION:
Failed to load 'Assets/Plugins/x86_64/KinectUnityAddin.dll'
Concerning all the posts and forums I've been reading so far, It's because I'm using SDK 1.8 (instead of SDK 2.0).
Is there any way how I can use this example with Kinect v1.8? I tried to contact the author as well but he haven't responded back.
Thanks a lot!
I had the same Problem in an University Project maby its not to late for you.
This is an Kinect v1.8 Wrapper i made to read the kinect depth image only. I used the Kinect with MS-SDK from the Unity-Assetstore as an orientation, you dont have to download it. All you need is this Code.
Use The Init() Method to start and the GetDepthArray() Function to get the Deapth Frame.
hope it works for you !
You have to install the Kinect 1.8 sdk or have at least the Kinect10.dll from the 1.8 sdk in your Windows/System32 folder
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.InteropServices;
using System;
using System.Runtime.CompilerServices;
public class OwnKinectWrapper : MonoBehaviour {
DepthBuffer db;
#region Nui Variables/Structs/Intefraces
IntPtr streamReferenz;
public struct NuiImageViewArea
{
public int eDigitalZoom;
public int lCenterX;
public int lCenterY;
}
public struct NuiSurfaceDesc
{
uint width;
uint height;
}
public struct DepthBuffer
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 640 * 480, ArraySubType = UnmanagedType.U2)]
public ushort[] pixels;
}
public struct NuiLockedRect
{
public int pitch;
public int size;
public IntPtr pBits;
}
public struct NuiImageFrame
{
public Int64 liTimeStamp;
public uint dwFrameNumber;
public int eImageType;
public int eResolution;
public IntPtr pFrameTexture;
public uint dwFrameFlags_NotUsed;
public NuiImageViewArea ViewArea_NotUsed;
}
[Guid("13ea17f5-ff2e-4670-9ee5-1297a6e880d1")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[ComImport()]
public interface INuiFrameTexture
{
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[PreserveSig]
int BufferLen();
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[PreserveSig]
int Pitch();
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[PreserveSig]
int LockRect(uint Level, ref NuiLockedRect pLockedRect, IntPtr pRect, uint Flags);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[PreserveSig]
int GetLevelDesc(uint Level, ref NuiSurfaceDesc pDesc);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[PreserveSig]
int UnlockRect(uint Level);
}
#endregion
// Use this for initialization
public int Init() {
int init = 0;
try {
init = NuiInitialize(0x00000020);
Debug.Log("init : " + init);
streamReferenz = IntPtr.Zero;
NuiImageStreamOpen(4, 2, 0, 2, IntPtr.Zero, ref streamReferenz);
}
catch (DllNotFoundException e)
{
string message = "Please check the Kinect SDK installation.";
Debug.LogError(message);
Debug.LogError(e.ToString());
return -1;
}
catch (Exception e)
{
Debug.LogError(e.ToString());
return -1;
}
return init;
}
// Update is called once per frame
void Update()
{
IntPtr imageStreamFrameReferenz = IntPtr.Zero;
int test = NuiImageStreamGetNextFrame(streamReferenz, 0, ref imageStreamFrameReferenz);
if (test == 0) {
NuiImageFrame imageFrame = (NuiImageFrame)Marshal.PtrToStructure(imageStreamFrameReferenz, typeof(NuiImageFrame));
INuiFrameTexture frameTexture = (INuiFrameTexture)Marshal.GetObjectForIUnknown(imageFrame.pFrameTexture);
NuiLockedRect lockedRectPtr = new NuiLockedRect();
IntPtr r = IntPtr.Zero;
frameTexture.LockRect(0, ref lockedRectPtr, r, 0);
db = (DepthBuffer)Marshal.PtrToStructure(lockedRectPtr.pBits, typeof(DepthBuffer));
frameTexture.UnlockRect(0);
NuiImageStreamReleaseFrame(streamReferenz, imageStreamFrameReferenz);
}
}
void OnDisable() {
NuiShutdown();
}
public ushort[] GetDepthArray(){
return db.pixels;
}
[DllImportAttribute(#"Kinect10.dll",EntryPoint="NuiInitialize")]
public static extern int NuiInitialize (uint dwFlags);
[DllImportAttribute(#"Kinect10.dll", EntryPoint = "NuiImageStreamOpen")]
public static extern int NuiImageStreamOpen(int enumImageType,int enumImgageResolution, uint image_Flags, uint frameBufferLimit, IntPtr nextFrameEvent, ref IntPtr streamHandle );
[DllImportAttribute(#"Kinect10.dll", EntryPoint = "NuiImageStreamGetNextFrame")]
public static extern int NuiImageStreamGetNextFrame(IntPtr streamReferenz, uint dwMillisecondsToWait, ref IntPtr ImageFrameReferenz);
[DllImportAttribute(#"Kinect10.dll", EntryPoint = "NuiImageStreamReleaseFrame")]
public static extern int NuiImageStreamReleaseFrame(IntPtr phStreamHandle, IntPtr ppcImageFrame);
[DllImportAttribute(#"Kinect10.dll",EntryPoint="NuiDepthPixelToDepth")]
public static extern ushort NuiDepthPixelToDepth (ushort depthPixel);
[DllImportAttribute(#"Kinect10.dll", EntryPoint = "NuiShutdown")]
public static extern void NuiShutdown();
}
if something is not working or you need help feel free to write some lines

How can I save Unity Statistics or Unity Profiler Statistics (stats on CPU, Rendering, Memory...) in a file (text or CSV ...)?

I need to know please if I can save the profiler statistics (http://docs.unity3d.com/Manual/ProfilerWindow.html) and/or Unity Rendering Statistics (the overlay window that shows realtime statistics) - http://docs.unity3d.com/Manual/RenderingStatistics.html - into a file like a CSV or an Excel or even a txt file so I can later study them and do some statistical analysis on them.
Yep, you can.
Saving profiler data:
// write FPS to "profilerLog.txt"
Profiler.logFile = Application.persistentDataPath + "/profilerLog.txt";
// write Profiler Data to "profilerLog.txt.data"
Profiler.enableBinaryLog = true;
Profiler.enabled = true;
Then you can show this data in editor:
Profiler.AddFramesFromFile(Application.dataPath + "/profilerLog.txt");
Saving statistics:
You can use any serialization method you want/like. Just use data from UnityEditor.UnityStats. Remember that it's only available from Editor.
This class looks like this, autocompletion should help:
public sealed class UnityStats {
public static extern int drawCalls
public static extern int batchedDrawCalls
public static extern int batches
public static extern int triangles
public static extern int vertices
public static extern int shadowCasters
public static extern int renderTextureChanges
public static extern float frameTime
public static extern float renderTime
public static extern int renderTextureCount
public static extern int renderTextureBytes
public static extern int usedTextureMemorySize
public static extern int usedTextureCount
public static extern string screenRes
public static extern int screenBytes
public static extern int vboTotal
public static extern int vboTotalBytes
public static extern int vboUploads
public static extern int vboUploadBytes
public static extern int ibUploads
public static extern int ibUploadBytes
public static extern int visibleSkinnedMeshes
public static extern int visibleAnimations
public static extern string GetNetworkStats(int i);
}
With a look into the ProfilerWindow class on the decompiled unity code (which you may find online) you can easily write a script that exports the data you need.
The script might look like this
using UnityEditor;
using UnityEditorInternal;
var firstFrameIndex = ProfilerDriver.firstFrameIndex;
var lastFrameIndex = ProfilerDriver.lastFrameIndex;
var profilerSortColumn = ProfilerColumn.TotalTime;
var viewType = ProfilerViewType.Hierarchy;
var profilerData = new ProfilerData();
for (int frameIndex = firstFrameIndex; frameIndex <= lastFrameIndex; ++frameIndex)
{
var property = new ProfilerProperty();
property.SetRoot(frameIndex, profilerSortColumn, viewType);
property.onlyShowGPUSamples = false;
bool enterChildren = true;
while (property.Next(enterChildren))
{
// get all the desired ProfilerColumn
var name = property.GetColumn(ProfilerColumn.FunctionName);
var totalTime = property.GetColumn(ProfilerColumn.TotalTime);
// store values somewhere
}
property.Cleanup();
}
If you want, you can use this script that allows you to export the data as a JSON file and provides also some useful stats when you are profiling.

lwip_connect: invalid address" failed error?

Am trying to connect to a socket using Xamarin Binding project for RedPark's RedSocket SDK.Am getting the below error
lwip_connect: invalid address" failed at line 495 in
/Users/jeremy/Dev/Folsom/Folsom_570/RecEthernet/tcp/api/sockets.c
But I dont see any user exists with that name in my mac, Can anyone help me in understanding the root cause?
My Binding project's ApiDefinitions.cs code
namespace RedparkEthernetBinding
{
using System.Net;
using System;
using Foundation;
using RedparkEthernetBinding;
// #protocol RedSocketManagerProtocol <NSObject>
[Protocol]
[BaseType (typeof(NSObject))]
interface RedSocketManagerProtocol
{
// #required -(void)configureNetworkInterface:(NSString *)deviceIPAddress gateway:(NSString *)gateway netmask:(NSString *)netmask dns:(NSString *)dns;
[Export ("configureNetworkInterface:gateway:netmask:dns:")]
void ConfigureNetworkInterface (string deviceIPAddress, string gateway, string netmask, string dns);
// #required -(NSString *)ipAddress;
[Export ("ipAddress")]
string IpAddress { get; }
// #required -(NSString *)gatewayAddress;
[Export ("gatewayAddress")]
string GatewayAddress { get; }
// #required -(NSString *)netmask;
[Export ("netmask")]
string Netmask { get; }
// #required -(NSString *)dnsAddress;
[Export ("dnsAddress")]
string DnsAddress { get; }
// #required -(int)socket:(int)domain type:(int)type protocol:(int)protocol;
[Export ("socket:type:protocol:")]
int Socket (int domain, int type, int protocol);
// #required -(int)accept:(int)s addr:(struct sockaddr *)addr addrlen:(socklen_t *)addrlen;
//[Abstract]
[Export ("accept:addr:addrlen:")]
unsafe int Accept (int s, IntPtr addr, uint addrlen);
// #required -(void)acceptAsync:(int)listenSocket addr:(struct sockaddr *)addr addrlen:(socklen_t *)addrlen;
[Export ("acceptAsync:addr:addrlen:")]
unsafe void AcceptAsync (int listenSocket,IntPtr addr, uint addrlen);
// #required -(int)bind:(int)s name:(const struct sockaddr *)name nameline:(socklen_t)namelen;
[Export ("bind:name:nameline:")]
unsafe int Bind (int s,IntPtr name, uint namelen);
// #required -(int)shutdown:(int)s how:(int)how;
[Export ("shutdown:how:")]
int Shutdown (int s, int how);
// #required -(int)getpeername:(int)s name:(struct sockaddr *)name namelen:(socklen_t *)namelen;
[Export ("getpeername:name:namelen:")]
unsafe int Getpeername (int s,IntPtr name, uint namelen);
// #required -(int)getsockname:(int)s name:(struct sockaddr *)name namelen:(socklen_t *)namelen;
[Export ("getsockname:name:namelen:")]
unsafe int Getsockname (int s,IntPtr name, uint namelen);
// #required -(int)getsockopt:(int)s level:(int)level optname:(int)optname optval:(void *)optval optlen:(socklen_t *)optlen;
[Export ("getsockopt:level:optname:optval:optlen:")]
unsafe int Getsockopt (int s, int level, int optname, IntPtr optval, uint optlen);
// #required -(int)setsockopt:(int)s level:(int)level optname:(int)optname optval:(const void *)optval opelen:(socklen_t)optlen;
[Export ("setsockopt:level:optname:optval:opelen:")]
unsafe int Setsockopt (int s, int level, int optname, IntPtr optval, uint optlen);
// #required -(int)close:(int)s;
[Export ("close:")]
int Close (int s);
// #required -(int)connect:(int)s sockaddr:(const struct sockaddr *)name namelen:(socklen_t)namelen;
[Export ("connect:sockaddr:namelen:")]
unsafe int Connect (int s, IntPtr name, uint namelen);
// #required -(int)listen:(int)s backlog:(int)backlog;
[Export ("listen:backlog:")]
int Listen (int s, int backlog);
// #required -(int)recv:(int)s mem:(void *)mem len:(size_t)len flags:(int)flags;
[Export ("recv:mem:len:flags:")]
unsafe int Recv (int s, IntPtr mem, nuint len, int flags);
// #required -(int)read:(int)s mem:(void *)mem len:(size_t)len;
[Export ("read:mem:len:")]
unsafe int Read (int s, IntPtr mem, nuint len);
// #required -(int)recvfrom:(int)s mem:(void *)mem len:(size_t)len flags:(int)flags from:(struct sockaddr *)from fromlen:(socklen_t *)fromlen;
[Export ("recvfrom:mem:len:flags:from:fromlen:")]
unsafe int Recvfrom (int s, IntPtr mem, nuint len, int flags,IntPtr from, uint fromlen);
// #required -(void)recvAsync:(int)sock buffer:(void *)buffer length:(size_t)length;
[Export ("recvAsync:buffer:length:")]
unsafe void RecvAsync (int sock, IntPtr buffer, nuint length);
// #required -(int)send:(int)s dataptr:(const void *)dataptr size:(size_t)size flags:(int)flags;
[Export ("send:dataptr:size:flags:")]
unsafe int Send (int s, IntPtr dataptr, nuint size, int flags);
// #required -(int)sendto:(int)s dataprt:(const void *)dataptr size:(size_t)size flags:(int)flags to:(const struct sockaddr *)to tolen:(socklen_t)tolen;
[Export ("sendto:dataprt:size:flags:to:tolen:")]
unsafe int Sendto (int s, IntPtr dataptr, nuint size, int flags, IntPtr to, uint tolen);
// #required -(int)write:(int)s dataptr:(const void *)dataptr size:(size_t)size;
[Export ("write:dataptr:size:")]
unsafe int Write (int s, IntPtr dataptr, nuint size);
// // #required -(int)select:(int)maxfdp1 readset:(fd_set *)readset writeset:(fd_set *)writeset exceptset:(fd_set *)exceptset timeout:(struct timeval *)timeout;
//
// [Export ("select:readset:writeset:exceptset:timeout:")]
// unsafe int Select (int maxfdp1, fd_set readset, fd_set writeset, fd_set exceptset, timeval timeout);
// #required -(int)ioctl:(int)s cmd:(long)cmd argp:(void *)argp;
[Export ("ioctl:cmd:argp:")]
unsafe int Ioctl (int s, nint cmd, IntPtr argp);
// #required -(int)fcntl:(int)s cmd:(int)cmd val:(int)val;
[Export ("fcntl:cmd:val:")]
int Fcntl (int s, int cmd, int val);
// #required -(int)abort_recv:(int)s;
[Export ("abort_recv:")]
int Abort_recv (int s);
// #required -(int)abort_all:(int)s;
[Export ("abort_all:")]
int Abort_all (int s);
[Export("Delegate"),NullAllowed]
NSObject WeakDelegate { get; set;}
[Wrap("WeakDelegate")]
RedSocketManager Delegate{ get; set;}
// #required -(BOOL)isCableConnected;
[Export ("isCableConnected")]
bool IsCableConnected { get; }
// #required -(NSString *)getAccessoryFirmwareVersion;
[Export ("getAccessoryFirmwareVersion")]
string AccessoryFirmwareVersion { get; }
// #required -(int)getRxCounter;
[Export ("getRxCounter")]
int RxCounter { get; }
// #required -(void)resetRxCounter;
[Export ("resetRxCounter")]
void ResetRxCounter ();
}
// #protocol RedSocketManagerDelegate <NSObject>
[Protocol, Model]
[BaseType (typeof(NSObject))]
interface RedSocketManagerDelegate
{
// #required -(void)cableConnected:(NSString *)protocol;
[Abstract]
[Export ("cableConnected:")]
void CableConnected (string protocol);
[Abstract]
// #required -(void)cableDisconnected;
[Export ("cableDisconnected")]
void CableDisconnected ();
// #optional -(void)didAssignIpAddress:(NSString *)deviceAddress gateway:(NSString *)gateway netmask:(NSString *)netmask;
[Export ("didAssignIpAddress:gateway:netmask:")]
void DidAssignIpAddress (string deviceAddress, string gateway, string netmask);
// #optional -(void)didSocketRecv:(int)socket buffer:(void *)buffer bytesRead:(int)bytesRead;
[Export ("didSocketRecv:buffer:bytesRead:")]
unsafe void DidSocketRecv (int socket, IntPtr buffer, int bytesRead);
// #optional -(void)didSocketAccept:(int)newSocket addr:(struct sockaddr *)addr addrlen:(socklen_t *)addrlen;
[Export ("didSocketAccept:addr:addrlen:")]
unsafe void DidSocketAccept (int newSocket,IntPtr addr, uint addrlen);
}
// [Protocol, Model]
// [BaseType (typeof(NSObject))]
// interface RedSocketManagerProtocol
// {}
//
// #interface RedSocketManager : NSObject
[BaseType (typeof(NSObject))]
interface RedSocketManager
{
[Static]
// +(id<RedSocketManagerProtocol>)sharedInstance;
[Export ("sharedInstance")]
RedSocketManagerProtocol SharedInstance { get; }
}
}
structures & Enums,
public struct hostent
{
}
static class CFunctions
{
// extern struct hostent * redsocket_gethostbyname (const char * name);
[DllImport ("__Internal")]
static extern unsafe hostent* redsocket_gethostbyname (sbyte* name);
// extern UInt32 RedEthernet_calcCRC32 (UInt32 * buffer, unsigned int numWords);
[DllImport ("__Internal")]
static extern unsafe uint RedEthernet_calcCRC32 (uint* buffer, uint numWords);
}
[StructLayoutAttribute(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public struct sockaddr {
/// u_short->unsigned short
public ushort sa_family;
/// char[14]
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst=14)]
public string sa_data;
}
[StructLayoutAttribute(LayoutKind.Sequential)]
public struct fd_set {
/// u_int->unsigned int
public uint fd_count;
/// SOCKET[64]
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst=64, ArraySubType=UnmanagedType.U4)]
public uint[] fd_array;
}
[StructLayoutAttribute(LayoutKind.Sequential)]
public struct timeval {
/// int
public int tv_sec;
/// int
public int tv_usec;
}
[StructLayoutAttribute(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public struct sockaddr_in {
/// short
public short sin_family;
/// u_short->unsigned short
public ushort sin_port;
/// in_addr
public in_addr sin_addr;
/// char[8]
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst=8)]
public string sin_zero;
}
[StructLayoutAttribute(LayoutKind.Sequential)]
public struct in_addr {
public uint s_addr;
}
Thanks,
Ravi
This error is coming because of the sockaddr structure pointer is not holding the ip address details in connect method.

Defining an interface to pass byte[] and byte* between C# and C++?

Given the following test interface (C#):
public interface ITest
{
UInt32 Simple(UInt32 someArg);
byte* Read(UInt32 count);
void Write(byte* buf, UInt32 count);
byte[] ReadArray(UInt32 count);
void WriteArray(byte[] buf);
}
Can I implement this interface in c++/cli? I've tried a million different ways; currently I have this:
typedef unsigned __int32 uint32;
typedef unsigned char byte;
public ref class CTest : public ITest
{
virtual uint32 Simple(uint32 someArg);
virtual byte * Read(uint32 count);
virtual void Write(byte * buf, uint32 count);
virtual System::Array<byte>^ ReadArray(uint32 count);
virtual void WriteArray(System::Array<byte>^ buf);
}
The VC2010 compiler complains bitterly about all of the methods except CTest::Simple, claiming I haven't implemented the interface.
Can someone show me the c++/cli magic to implement an interface that passes either byte* or byte[] (preferably both)? I'm at my wit's end...
The following compiles:
public ref class CTest : public ITest
{
public:
virtual unsigned Simple(unsigned someArg) { return 0u; }
virtual unsigned char* Read(unsigned count) { return nullptr; }
virtual void Write(unsigned char* buf, unsigned count) { }
virtual array<unsigned char>^ ReadArray(unsigned count) { return nullptr; }
virtual void WriteArray(array<unsigned char>^ buf) { }
};
Your main problem is the fact that your CTest member functions are private and thus ineligible to implement the interface. The other problems are mostly related to using System::Array<> rather than array<> (which is short for cli::array<>).