andersmalmgren / freepie Goto Github PK
View Code? Open in Web Editor NEWProgrammable Input Emulator
Programmable Input Emulator
As per 12ba478,
There's a typo 12ba478#diff-6c4ba9e17580510ccb08d7d7b7fb6c5fR172 changing datagram's structure layout.
We frequently get requests to support Wiimote IR
The preparsing of NeedIndexer functions is not solid, see this Stackoverflow question I did for more info
http://stackoverflow.com/questions/24899642/analyze-code-chain-in-ironpython
FreePIE has randomly simply stopped launching on me. I've restarted my computer, reinstalled the program, and nothing's working. The process simply terminates a few seconds after being started.
Hi
I'm looking for making a Hydra to vJoy mapping.
I read that there is Razer Hydra support but it seems, from reading code and testing out the script engine, that only emulation/write is supported? Is it also possible to read values from the hydra?
If reading is supported, are there any special setup or configuration needed?
If not, is anyone working on it or should I get started?
Hi Anders,
This isn't really an issue with your FreePIE package, more regarding this post you made on SO:
http://stackoverflow.com/questions/10352092/prevent-lua-infinite-loop
On that page you referenced your example code for detecting inifinite loops in lua - I would very much like to see this code, but it is no longer posted here. Here was your original link for it:
https://github.com/AndersMalmgren/FreePIE/tree/detect-and-recover-infite-lua-loop
I don't suppose you still have this around somewhere? I would love to take a look at it - I've been searching and you are the only one who ever seems to mention how to deal with this issue.
Currently, FreePIE supports VJoy Interface 2.05. On October 9,2015, VJoy came out with a version 2.1.6 which does not work on the newest version of FreePIE.
The method name continousRotation
should probably be continuousRotation
as it's crying out for being mistyped as it stands.
I recently submitted a pull request to Max Malmgren's Dolphiimote project, wherein I added support for the Wii Classic Controller. I am still waiting for a response, but I was hoping to see Classic Controller support added to FreePIE to make use of my Dolphiimote changes, once they're pulled in. (I know Max is your brother, so if you could accelerate the process of him checking that pull request, it would be great!)
I haven't yet forked the FreePIE source, but I could probably try to add Classic Controller support myself, once the Dolphiimote changes trickle down into FreePIE. Thanks!
I have been using the FreePie Android IMU for head tracking in my colorcross HMD. The mouse cursor moves in response to my phone until I give TriDef ignition focus, the mouse refuses to move despite the values in the watch window seemingly still responding to my phone movements..
This means that any game launched via TriDef for 3D SBS cannot use FreePie for head tracking...
Oddly giving any other program focus restores the mouse moment including launching games directly, outside of TriDef
I believe, with the last firmware of the Yei sensors, the access to the two buttons not function. I you put:
diagnostics.watch(yei[0].button0);
diagnostics.watch(yei[0].button1);
the state always is False and you can't use the buttons in Freepie. I believe that in the old firmwares it runs ok ¿?
When launching a very simple script, like an empty one, or the following one, FreePIE does not find a method, handles the exception (TargetInvocationException) in the handler of ExecuteSafe and crashes afterwards with a MissingMethodException.
Operating System: Windows 7 64 bit
FreePIE version: Latest installer (v1.9.611.0) and also latest master branch commit (72ec5b8), compiled with VS 2013
def update():
pass
if starting:
pass
12.09.2015 11:54:37 - System.Reflection.TargetInvocationException - Failed to load language 'IronPython 2.7.5': Methode nicht gefunden: "System.Collections.Generic.IEnumerable
1<!!0> Microsoft.Scripting.Utils.ReflectionUtils.GetCustomAttributes(System.Reflection.Assembly, Boolean)".: bei Microsoft.Scripting.Runtime.LanguageConfiguration.LoadLanguageContext(ScriptDomainManager domainManager, Boolean& alreadyLoaded) bei Microsoft.Scripting.Runtime.DlrConfiguration.LoadLanguageContext(ScriptDomainManager manager, LanguageConfiguration config) bei Microsoft.Scripting.Runtime.DlrConfiguration.TryLoadLanguage(ScriptDomainManager manager, AssemblyQualifiedTypeName providerName, LanguageContext& language) bei Microsoft.Scripting.Runtime.ScriptDomainManager.GetLanguageByTypeName(String providerAssemblyQualifiedTypeName) bei Microsoft.Scripting.Hosting.ScriptRuntime.GetEngineByTypeName(String assemblyQualifiedTypeName) bei IronPython.Hosting.Python.GetEngine(ScriptRuntime runtime) bei FreePIE.Core.ScriptEngine.Python.PythonScriptEngine.get_Engine() bei FreePIE.Core.ScriptEngine.Python.PythonScriptEngine.<>c__DisplayClass5.<>c__DisplayClass7.<Start>b__2() bei FreePIE.Core.ScriptEngine.Python.PythonScriptEngine.ExecuteSafe(Action action, Boolean logToFile) System.MissingMethodException - Methode nicht gefunden: "System.Collections.Generic.IEnumerable
1<!!0> Microsoft.Scripting.Utils.ReflectionUtils.GetCustomAttributes(System.Reflection.Assembly, Boolean)".:
bei IronPython.Runtime.Binding.PythonBinder.DomainManager_AssemblyLoaded(Object sender, AssemblyLoadedEventArgs e)
bei IronPython.Runtime.Binding.PythonBinder..ctor(PythonContext pythonContext, CodeContext context)
bei IronPython.Runtime.PythonContext..ctor(ScriptDomainManager manager, IDictionary`2 options)12.09.2015 11:54:37 - System.MissingMethodException - Methode nicht gefunden: "System.Object Microsoft.Scripting.Utils.ExceptionUtils.GetData(System.Exception, System.Object)".:
bei IronPython.Runtime.Exceptions.PythonExceptions.GetFrameList(Exception e)
bei IronPython.Runtime.Exceptions.PythonExceptions.GetDynamicStackFrames(Exception e)
bei FreePIE.Core.ScriptEngine.Python.PythonScriptEngine.TriggerErrorEventNotOnPythonThread(Exception e)
bei FreePIE.Core.ScriptEngine.Python.PythonScriptEngine.TriggerErrorEventNotOnPythonThread(Exception e)
bei FreePIE.Core.ScriptEngine.Python.PythonScriptEngine.ExecuteSafe(Action action, Boolean logToFile)
bei FreePIE.Core.ScriptEngine.Python.PythonScriptEngine.<>c__DisplayClass5.b__1(Object obj1)
bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
bei System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ThreadHelper.ThreadStart(Object obj)
You can only get Z rotation input form joysticks, what about X/Y rotation ?
Hello,
First of all, I'm very pleased with this piece of software. Thank you.
However, It would be even better if you could pass path to the script as command-line argument, like this:
c:\Program Files (x86)\FreePIE>FreePIE.exe "d:\Projects\freepie\Dark Souls II.py"
Thanks.
I am finding the autocompletion really frustrating. It's too eager and gets in the way. If you enter a substring of something the autocompletion knows about, it will always complete it unless you press escape first.
Say I have this:
xb = xbox360[0]
foo = xb.leftShoulder
When entering xb
, the autocompletion pops up suggesting xbox360[0], which I don't want. However, as soon as I press the .
it completes it anyway.
Please could the autocompletion be changed to stay out of the way unless the completion is actually wanted, or else add an option to disable autocompletion entirely.
Thanks for such a great project.
It would be awesome to see this work with Vive controllers. There are Oculus projects that use the Razer Hydra that would be awesome on Vive if only Vive controllers could emulate the Hydras. Will be following this project's progress for sure! If you guys get something working, try posting to /r/vive on reddit, it's a big community for the Vive base right now.
I am finding that FreePIE's clock rate changes. I think it may be to do with speedstep (processor throttling).
When I first start FreePIE it's at about 60Hz, but after running it for a while it shifts up to 1000Hz. It appears to coincide with my CPU speed changing from 1000GHz to 3000GHz.
Test script:
import time
def updateTime():
global prevTime
try:
prevTime
except NameError:
prevTime = 0
now = time.clock()
fps = 1 / (now - prevTime)
diagnostics.watch(prevTime)
diagnostics.watch(now)
diagnostics.watch(fps)
prevTime = now
updateTime()
What rate is FreePIE supposed to run at?
Thanks.
Error message while importing the project
FreePIE.Setup
Message
FreePIE.Setup\FreePIE.Setup.vdproj: The application which this project type is based on was not found. Please try this link for further information: http://go.microsoft.com/fwlink/?prd=12395&pver=11&sbp=ProjectTypeDeprecated&plcid=0x409&clcid=0x409&ar=MSDN&sar=ProjectCompatibility&o1=54435603-DBB4-11D2-8724-00A0C9A8B90C
More about VS2012 compatibility: http://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=EN-US&k=k(VS.ReviewProjectAndSolutionChangesDialog.Upgrade)&rd=true
See discussion here: http://www.mtbs3d.com/phpBB/viewtopic.php?f=139&t=15044#p82135
When this is done refactor plugin to support multiple mouse devices. This could possible be done by using GetRawInputData.
Create a new plugin called mice that can be indexed like mice[0].deltaX
Keep the mouse plugin for backward compatibility but let it use the new mice plugin instead
Can win32 emulate multiple devices, if not throw exception if you try to write values to index != 0
More info: http://www.mtbs3d.com/phpBB/viewtopic.php?f=139&t=19848
Is it possible to start a script in background ? Right now it is possible to start a acript with the command line
freepie.exe myscript.py /r
but this open a new windows of freepie. Is it possible to avoid this and start freepie minimized in the notification icon
Android apk goes to sleep on cellphones.
On some devices helps adding persistent true like below:
android:theme="@style/AppTheme" android:persistent="true">
in AndroidManifest.xml file
This helped on Galaxy S3, but not on LG G3.
Definately on every device should help change application from 'activity' to 'service' mode.
Hi, thanks for the awesome work and bringing free software, it seems like Git have sparked new life in open development :), my name is Gabriel, I have been working with Glovepie, various Midi software and finally Freepie for the previous days, I am trying to use a wii drum set that i connected to my pc via midi/usb (for latency)
It seems like the easy part is using it with Ableton or Reason as E-drums however using it to play GH world tour(PC) has turned impossible for me.
I understand python code, but the update syntax and i suppose infinite loops of Freepie, have proven challenging to me, also and most importantly i would appreciate a lot a print function, because i have started being paranoid about all the midi/directinput/xinput compatibility issues.
So the point is, i have a midi device "midi[0]" i know it sends notes through the 10th channel with the 99 hex, (the nine meaning note On) i know the bytes of the notes
note=38 (0x26)
note=48 (0x30)
note=45 (0x2D)
note=49 (0x31)
note=46 (0x2E)
note=36 (0x24)
The velocity that I suppose is the "second data" has no importance at the moment.
I don't know if this is the correct place to post but i couldn't register in the busier forum at MTBS,
So i only need an easy way to use those notes and map them to the keyboard, like WASD.
If you can help me with that, i could suggest some basic info that could be added about midi input to help other people, and maybe do a youtube video adding some nifty things for the people that need Freepie and VJoy rather than the unsupported Glovepie and PPjoy.
So... sorry for my non native english and maybe posting in the wrong place, but I think things could have been so much easier if glovepie have auto detected the MIDI input in the first place...
@AndersMalmgren please add your copyright to Android .apk sources. I don't know how to credit you in a 3rdparty credit notice for the .apk that we bundle.
I'd also like to add my BSD copyright to some files. It's best if we add copyright to each separate source file.
If this is overkill, I'll add a thanks notice.
If you tried something like this:
import time
if (keyboard.getPressed(Key.NumberPad3)):
keyboard.setKeyDown(Key.D1)
keyboard.setKeyUp(Key.D1)
keyboard.setKeyDown(Key.RightShift)
time.sleep(0.2)
keyboard.setKeyDown(Key.D2)
keyboard.setKeyUp(Key.D2)
time.sleep(0.2)
keyboard.setKeyDown(Key.D3)
keyboard.setKeyUp(Key.D3)
time.sleep(0.2)
keyboard.setKeyUp(Key.RightShift)
You would find that, after running the script in notepad and hitting the Numpad 3 key you would get "31@#"
So far so good. However, if you tried pressing any key after that, like A-Z or D1-D0 that key would be treated as if the shift key is still pressed. So capitalized letters and the usual symbols !@#$^&*( would appear in notepad.
What's going on?
I see that I can output the pitch, yaw and roll, and the two buttons of the Yei sensor.
But how can access to the three accelerometer axis (x,y,z) and the magnetic sensor?
I believe that for replicate any real movements is necesary to mix the signal of the gyros and the acelerometers for example for see if any person go crouch or prone.
(I tried to post this on the forum as it's more of a community thing than a bug or tech issue, but there was some kind of server error sending the registration email so I'm stuck with no account and unable to re-register because it thinks I'm already registered...)
FreePIE looks great, but there isn't currently any "first steps" documentation on what to actually do between installing it and getting stuck in writing a script. Sounds like most of your users up to now are veterans of GlovePIE or similar - with FreePIE gaining prominence it'd be nice for something for people (like me and, looking at the forum, a growing number of people) who aren't afraid of writing some code but are new to way things like FreePIE work.
I know it's not always easy to explain the basics when you're so experienced it all seems obvious, so maybe this will help. Here's my extremely patchy idea of the steps I need to take to get FreePIE to listen to Wiimote input (my end goal is to pick up analog gestures in music software and use them to modify pitch, volume, etc etc). I imagine it'd be very easy for you to fill in the gaps (marked [...???]) and correct me whereever I'm going wrong. That could then become some very useful beginner's documentation.
Thanks for any help, I'm happy to help write some as soon as I know enough to be useful...
Hello,
I'm trying to make my hydra work as full motion headtracker.
Is there some easy way to make it via Freepie? I'm not gut in codes and my experiments falls.
Thank you.
When I used GlovePIE in my development I used to copy the program to a usb memory without install and used a bat file to call the program and passed as parameter the name of the file to open , which was self- executing , and then the program directly was minimized in the taskbar , as follows :
START glovepie\glovepie -glovepie\filetoopen.pie /tray
It would be interesting freepie a portable version without installation and can autorun a file as follows :
START freepie\FreePIE.exe -freepie\filetoopen.py /tray
Now in order to do it I need to do the following:
START freepie\FreePIE.exe
TIMEOUT 5
START nircmd sendkeypress ctrl+o
TIMEOUT 1
START nircmd sendkeypress f i l e t o p e n 0x6E p y
TIMEOUT 1
START nircmd sendkeypress enter
TIMEOUT 1
START nircmd sendkeypress F5
TIMEOUT 1
START nircmd win min process FreePIE.exe
EXIT
I have not checked if the C# SDK has the support yet, but here is a demo written in C
http://sourceforge.net/p/vjoystick/code/HEAD/tree/branches/Incompatible/ForceFB/apps/FfbMon/FfbMon.cpp
I want to make a script that moves the cursor in a 200px circle around the starting point, based on the position of the right stick on my controller, for Euro Truck Simulator 2, so that the cursor's in the same position in that circle as the stick is within its holster.
The reason this would be useful is for camera control - quickly flicking the stick back and forth to look both ways and then releasing it to look forward again.
The suggested mouse properties would count in pixels, with x
and y
counting from the top left, relX
and relY
counting from the mouse's position at the start of the script, and startX
and startY
being the point where relX
and relY
are zero (changing them would change relX
and relY
)
Hey,
Are you interested in using opentrack/facetracknoir protocols, filters and trackers?
The code an easily be adapted (by me) to work without any kind of GUI, and with C API in order to get rid of name mangling issues.
@AndersMalmgren what do you think about put Freepie IMU apk on google play?
Something strange happened while using FreePIE recently, and the settings got corrupted. This had the effect of rendering FreePIE silently unable to start.
I suspected that it had happened because of running the program as an administrator, but the idea was overturned because I just now did it after fixing the corrupt settings, and it opened fine. It might be that I turned off my computer without stopping the program first.
Suggested fix of silent opening: Bring up a dialog box saying "The settings are corrupted. Continuing your use of the program will reset it to default settings. Continue anyway?" with a yes or no. Yes will reset the settings file, no will terminate the program.
tobiiEyeX.gazePointNormalizedY is not reading the Y position of the gazepoint. Instead, it's duplicating the X value of the gazePoint.
Hi,
I'm having an issue with FreePIE on Android, the yaw value seems to be going crazy.
Everytime I move y head on the pitch axis (even slightly) the yaw value increases (or decreases) very fast, even if I stop moving my head.
Gyroscope Explorer indicates that the X, Y and Z values are normal and stable, the only abnormal value I noticed was when activating "Fusion", the "FusedGyroscopeCalibratedSensor" seems to drift slowly on the X axis... So, perhaps the app should use the "uncalibrated" data...
By the way, I'm using an HTC One with Custom Sense ROM and latest firmware so it's not a Gyroscope's driver issue.
It would be nice to separate the Plugin-code from the actual application to avoid it crashing when the plugin fails (especially during development)
Hallo, I use FreePie with a 9DOF Sensor (GY-85).
The Free IMU Plug-In supports only yaw,pitch,roll. Works really fast and good.
Is there any way, to add x,y,z support?
Already added
Building the project for the first time requires restarting the build several times. As it's executed in parallel/out of order, first few times, it fails with some more project building, until it finally works.
To fix, express dependencies between modules.
With last pull request I introduced a regression in
private TimerTask debugHandler = new TimerTask() {
Please change
public void run() {
if (udpSenderService != null) {
to
public void run() {
if (chkDebug.isChecked() && udpSenderService != null) {
It allocates a memory constructing these float[]
s several times a second and it shouldn't.
regards,
-sh
See thread http://www.mtbs3d.com/phpBB/viewtopic.php?f=139&t=18792&p=144831
TrackIR emulation works fine with other tested games (Future Pinball). However IRacing and Euro Truck Simulator are not functioning. Freetrack / Opentrack works fine with both games.
I'm trying to use vJoy plugin with a wiimote, but it seems that FreePIE is not working: vJoy is installed and joystick 1 is well configured with 2 axes, 9 buttons and 1 POV (it is confirmed by controllers control panel) but when trying to run the script it crashed saying "Maximum buttons are 0. You need to incrase number of buttons in vJoy config" when using buttons and "Axis HID_USAGE_X not enabled, enable it from VJoy config" when using stick...
Here is my python script
def map_pov(n):
if wiimote[n].buttons.button_down(WiimoteButtons.DPadUp):
vJoy[n].setDigitalPov(0, VJoyPov.Left)
elif wiimote[n].buttons.button_down(WiimoteButtons.DPadDown):
vJoy[n].setDigitalPov(0, VJoyPov.Down)
elif wiimote[n].buttons.button_down(WiimoteButtons.DPadLeft):
vJoy[n].setDigitalPov(0, VJoyPov.Left)
elif wiimote[n].buttons.button_down(WiimoteButtons.DPadRight):
vJoy[n].setDigitalPov(0, VJoyPov.Right)
else:
vJoy[n].setDigitalPov(0, VJoyPov.Nil)
def map_axis(n):
vJoy[n].x = wiimote[n].nunchuck.stick.x
vJoy[n].y = wiimote[n].nunchuck.stick.y
def map_button(n, wiimote_button, vjoy_button):
if wiimote[n].buttons.button_down(wiimote_button):
vJoy[n].setButton(vjoy_button, True)
else:
vJoy[n].setButton(vjoy_button, False)
def map_nunchuck_button(n, nunchuck_button, vjoy_button):
if wiimote[n].nunchuck.buttons.button_down(nunchuck_button):
vJoy[n].setButton(vjoy_button, True)
else:
vJoy[n].setButton(vjoy_button, False)
def map_buttons(n):
map_button(n, WiimoteButtons.A, 0)
map_button(n, WiimoteButtons.B, 1)
# map_button(n, NunchuckButtons.C, 2)
# map_button(n, NunchuckButtons.Z, 3)
map_button(n, WiimoteButtons.One, 4)
map_button(n, WiimoteButtons.Two, 5)
map_button(n, WiimoteButtons.Minus, 6)
map_button(n, WiimoteButtons.Plus, 7)
map_button(n, WiimoteButtons.Home, 8)
def map_nunchuck_buttons(n):
map_button(n, NunchuckButtons.C, 2)
map_button(n, NunchuckButtons.Z, 3)
def updateWiimote1():
# Wiimote 1
map_buttons(0)
map_pov(0)
def updateNunchuck1():
map_nunchuck_buttons(0)
def updateWiimote2():
# Wiimote 2
map_buttons(1)
map_pov(1)
def updateNunchuck2():
map_nunchuck_buttons(1)
def updateWiimote3():
# Wiimote 3
map_buttons(2)
map_pov(2)
def updateNunchuck3():
map_nunchuck_buttons(2)
def updateWiimote4():
# Wiimote 4
map_buttons(3)
map_pov(3)
def updateNunchuck4():
map_nunchuck_buttons(3)
# If we're starting up, then hook up our update function.
if starting:
map_axis(0)
# map_axis(1)
# map_axis(2)
# map_axis(3)
wiimote[0].buttons.update += updateWiimote1
# wiimote[1].buttons.update += updateWiimote2
# wiimote[2].buttons.update += updateWiimote3
# wiimote[3].buttons.update += updateWiimote4
wiimote[0].nunchuck.update += updateNunchuck1
# wiimote[1].nunchuck.update += updateNunchuck2
# wiimote[2].nunchuck.update += updateNunchuck3
# wiimote[3].nunchuck.update += updateNunchuck4
Also if someone manages to explain me how to use vJoy and wiimote, I will be glad to write a tutorial.
I've seen this script
filters.mapRange(midi[0].data.buffer[1], 0, 127, -17873, 17873)
This grabs the value for any button on the midi input. I'd like to know if I can get a value for a specific slider or dial. I can't seem to find what I'm looking for online.
If possible I'd like to grab 3 different midi inputs and assign them to vJoy[0].x, vJoy[0].y and vJoy[0].slider.
Thank you for you help
I found this - http://cache.freescale.com/files/sensors/doc/app_note/AN4248.pdf and it might be superior to Android framework code for pose estimation without a gyro.
I'm dropping it here not to forget to implement it sometime soon.
I recently added this dll to FreePIE plugin folder and it won't open after that, I downloaded the DLL from this post:
http://www.mtbs3d.com/phpBB/viewtopic.php?f=120&t=18977&view=next
But the github project to it is here:
https://github.com/Baristan6/VireioSMT
But I can't compile it from there, so I used the DLL avaiable from that website.
What is wrong with it?
Currently, PPJoy only supports 64-bit when driver signing is disabled. There is a driver by Headsoft that does Joystick emulation, but also has a signed driver so it easier to setup on a 64-bit Windows system.
The website is here: http://headsoft.com.au/index.php?category=vjoy
I can try writing the driver myself using their C# SDK, but I'm a Java developer. I might be able to have a pull request ready soon, but then again, if a more experienced C# developer can take this into their hands, so be it!
We should fix so that TrackIR emulation works with encrypted titles. Some info here
Links are dead but sthalik could probably shed some light to it
Current xbox360 plugin only allows to map xbox controllers output, but one of the last works in GlovePIE was to support writing XInput output. This would allow to emulate Xbox360 controller using only FreePIE instead of FreePIE + vJoy + x360ce...
Hello
Is it possible to import external python modules into FreePie?
Thanks
Adding the Android .apk to Google Play Store can also increase the visibility of the FreePIE project itself. I recommend.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.