LinuxAppleSmc

From CSWiki
Jump to: navigation, search

This patch add support for Apple SMC on linux

diff -ru chuck-1.2.1.1~/src/util_hid.cpp chuck-1.2.1.1/src/util_hid.cpp
--- chuck-1.2.1.1~/src/util_hid.cpp	2008-03-29 23:24:21.000000000 +0100
+++ chuck-1.2.1.1/src/util_hid.cpp	2008-03-29 23:24:54.000000000 +0100
@@ -7175,14 +7175,139 @@
 int WiiRemote_send( const HidMsg * msg ){ return -1; }
 const char * WiiRemote_name( int wr ){ return NULL; }
 
+#define SYSFS_TILTSENSOR_FILE "/sys/devices/platform/applesmc/position"
+#define TILTSENSOR_BUF_LEN 32
+
+static struct t_TiltSensor_data
+{
+	union
+	{
+		struct t_macbook
+		{
+			int x;
+			int y;
+			int z;
+		} macbook;
+	} data;
+	int dataType;
+	int detected;
+	int refcount;
+
+	t_TiltSensor_data()
+	{
+		refcount = 0;
+		dataType = -1;
+		detected = 0;
+	}
+
+} TiltSensor_data;
+enum
+{
+	linuxAppleSMCMacBookDataType
+};
+static int TiltSensor_detect()
+{
+	int fd;
+
+	fd = open(SYSFS_TILTSENSOR_FILE, O_RDONLY);
+
+	if (fd > 0)
+	{
+		TiltSensor_data.dataType = linuxAppleSMCMacBookDataType;
+		TiltSensor_data.detected = 1;
+		close(fd);
+		return 1;
+	}
+
+	TiltSensor_data.detected = -1;
+
+	return 0;
+}
+
+static int TiltSensor_do_read()
+{
+
+	switch(TiltSensor_data.dataType)
+	{
+		case linuxAppleSMCMacBookDataType:
+			char buf[TILTSENSOR_BUF_LEN];
+			int ret, fd;
+			fd = open(SYSFS_TILTSENSOR_FILE, O_RDONLY);
+
+			if (fd < 0) {
+				return -1;
+			}
+			ret = read(fd, buf, TILTSENSOR_BUF_LEN);
+			if (ret < 0) {
+				close(fd);
+				return -1;
+			}
+			if (sscanf(buf, "(%d,%d,%d)\n", &TiltSensor_data.data.macbook.x, &TiltSensor_data.data.macbook.y, &TiltSensor_data.data.macbook.z) != 3) {
+				close(fd);
+				return -1;
+			}
+			close(fd);
+			break;
+		default:
+			return 0;
+	}
+	return 1;
+}
 void TiltSensor_init(){}
 void TiltSensor_quit(){}
 void TiltSensor_probe(){}
-int TiltSensor_count(){ return 0; }
-int TiltSensor_open( int ts ){ return -1; }
-int TiltSensor_close( int ts ){ return -1; }
-int TiltSensor_read( int ts, int type, int num, HidMsg * msg ){ return -1; }
-const char * TiltSensor_name( int ts ){ return NULL; }
+int TiltSensor_count()
+{
+	if(TiltSensor_data.detected == 0)
+		TiltSensor_detect();
+
+	if(TiltSensor_data.detected == -1)
+		return 0;
+	else if(TiltSensor_data.detected == 1)
+		return 1;
+
+	return 0;
+}
+int TiltSensor_open( int ts )
+{
+	if(TiltSensor_data.detected == 0)
+		TiltSensor_detect();
+
+	if(TiltSensor_data.detected == -1)
+		return -1;
+
+	TiltSensor_data.refcount++;
+
+	return 0;
+}
+int TiltSensor_close( int ts )
+{
+	TiltSensor_data.refcount--;
+
+	return 0;
+}
+int TiltSensor_read( int ts, int type, int num, HidMsg * msg )
+{
+
+	if(TiltSensor_data.detected == -1)
+		return -1;
+
+	if(!TiltSensor_do_read())
+		return -1;
+
+	if(TiltSensor_data.dataType == linuxAppleSMCMacBookDataType)
+	{
+		msg->idata[0] = TiltSensor_data.data.macbook.x;
+		msg->idata[1] = TiltSensor_data.data.macbook.y;
+		msg->idata[2] = TiltSensor_data.data.macbook.z;
+	}
+
+	return 0;
+}
+const char * TiltSensor_name( int ts )
+{
+	return "Apple Sudden Motion Sensor";
+}
 
 
 #endif