P-Finance – expense tracker/analyser for iOS

Hi all!

Just a quick post to introduce my new iOS app.

App description:

The deep understanding of your expenses is the first step to a much brighter financial future!

P-Finance is a useful tool to build the habit of expense/income tracking in a easy and intuitive way.

You’ll be able to fully customise both your accounts and income/expense categories and to keep track of one-time, periodic and between-accounts transactions.

This app allows you to better understand and tweak your expenses with its simple but rich reporting section.

Finally, the export function generates a CSV file with all transactions stored at the moment in the device, allowing further data analysis with external tools.

Please use the comments to talk about issues you encountered using the app and to give me suggestions about P-Finance improvement.

Thank you for the attention and
have a nice expense tracking experience! 😉

V-REP for Windows – Integrate Xbox 360 Controller input via plugin

Hi all!

I’ve always wanted to learn some robotics. Finally, in 2014 I spent four months browsing tons of Arduino forums and tutorials, learning lots of things.
However, each time I was about to buy some generic starter kit, I started wondering if it was the right thing to do: in some way I was worried to lose drive and motivation buying something “physical” without having a well defined project to build, so I was kind of stuck.
Fortunatelly, few months ago I discovered V-REP, a really well documented, intuitive and stable robot simulator. These qualities makes it a perfect match for a beginner like me! Without a clear “big” idea to implement and free from every hardware costs, I could begin learning some basic robot programming techniques with a powerful visual feedback.

I started studying the embedded LUA scripting system when I looked at the Xbox 360 Controller sitting on my desktop and…

In this post I’ll share a simple and efficient way to integrate Xbox 360 Controller input in V-REP for Windows.

After reading the fine written Katy’s tutorial “XInput Tutorial Part 1: Adding gamepad support to your Windows game”, I decided to write a V-REP plugin.
Following the official “Plugin tutorial” I implemented a DLL to extend the internal V-REP LUA scripting with the following functions:

boolean isConnected = simExtXbox360Controller_isConnected()

number port = simExtXbox360Controller_getPort()
boolean refreshState = simExtXbox360Controller_refreshState()

boolean isStartPressed = simExtXbox360Controller_isStartPressed()
boolean isBackPressed = simExtXbox360Controller_isBackPressed()

boolean isAPressed = simExtXbox360Controller_isAPressed()
boolean isBPressed = simExtXbox360Controller_isBPressed()
boolean isXPressed = simExtXbox360Controller_isXPressed()
boolean isYPressed = simExtXbox360Controller_isYPressed()

boolean isDPadLeftPressed = simExtXbox360Controller_isDPadLeftPressed()
boolean isDPadRightPressed = simExtXbox360Controller_isDPadRightPressed()
boolean isDPadUpPressed = simExtXbox360Controller_isDPadUpPressed()
boolean isDPadDownPressed = simExtXbox360Controller_isDPadDownPressed()

boolean isLeftShoulderPressed = simExtXbox360Controller_isLeftShoulderPressed()
boolean isRightShoulderPressed = simExtXbox360Controller_isRightShoulderPressed()

boolean isLeftThumbStickPressed = simExtXbox360Controller_isLeftThumbStickPressed()
boolean isRightThumbStickPressed = simExtXbox360Controller_isRightThumbStickPressed()

-- return table_2 (x, y) . x, y in [-1, 1]
table_2 leftThumbStickCoords = simExtXbox360Controller_getLeftThumbStickCoords()
table_2 rightThumbStickCoords = simExtXbox360Controller_getRightThumbStickCoords()

-- returns float x in [0, 1]
float leftTriggerPressure = simExtXbox360Controller_getLeftTriggerPressure()
float rightTriggerPressure = simExtXbox360Controller_getRightTriggerPressure()

The logic behind those functions is to check if the required module was loaded correctly during the script initialization:

while moduleName do
	if (moduleName=='Xbox360Controller') then
if (xbox360ControllerModuleNotFound) then
	simAddStatusbarMessage("ERROR! - Xbox360Controller plugin was not found. (v_repExtXbox360Controller.dll)&&nSimulation will not run properly.")
	simAddStatusbarMessage("OK! - Xbox360Controller plugin FOUND. (v_repExtXbox360Controller.dll)")

During the actuation phase “simExtXbox360Controller_getXXX” functions can be called, after “simExtXbox360Controller_refreshState”, to read the state of each button, trigger and stick of the Xbox 360 controller.

-- reload controller state

-- read last loaded controller state
if (simExtXbox360Controller_isConnected()) then

	if (simExtXbox360Controller_isStartPressed()) then
		simAddStatusbarMessage("Start pressed!")

	if (simExtXbox360Controller_isBackPressed()) then
		simAddStatusbarMessage("Back pressed!")

	if (simExtXbox360Controller_isAPressed()) then
		simAddStatusbarMessage("A pressed!")

	if (simExtXbox360Controller_isBPressed()) then
		simAddStatusbarMessage("B pressed!")

	if (simExtXbox360Controller_isXPressed()) then
		simAddStatusbarMessage("X pressed!")

	if (simExtXbox360Controller_isYPressed()) then
		simAddStatusbarMessage("Y pressed!")

	if (simExtXbox360Controller_isDPadLeftPressed()) then
		simAddStatusbarMessage("DPad Left pressed!")

	if (simExtXbox360Controller_isDPadRightPressed()) then
		simAddStatusbarMessage("DPad Right pressed!")

	if (simExtXbox360Controller_isDPadUpPressed()) then
		simAddStatusbarMessage("DPad Up pressed!")

	if (simExtXbox360Controller_isDPadDownPressed()) then
		simAddStatusbarMessage("DPad Down pressed!")

	if (simExtXbox360Controller_isLeftShoulderPressed()) then
		simAddStatusbarMessage("Left Shoulder pressed!")

	if (simExtXbox360Controller_isRightShoulderPressed()) then
		simAddStatusbarMessage("Right Shoulder pressed!")

	if (simExtXbox360Controller_isLeftThumbStickPressed()) then
		simAddStatusbarMessage("Left Thumb Stick pressed!")

	if (simExtXbox360Controller_isRightThumbStickPressed()) then
		simAddStatusbarMessage("Right Thumb Stick pressed!")

	if (simExtXbox360Controller_isStartPressed()) then

		port = simExtXbox360Controller_getPort() -- return integer x in [1, 4]
		simAddStatusbarMessage(string.format("Port: %d", port))

		leftThumbStickCoords = simExtXbox360Controller_getLeftThumbStickCoords() -- returns table_2 (x, y) . x, y in [-1, 1]
		simAddStatusbarMessage(string.format("Left Thumb Stick Coords: (%f, %f)", leftThumbStickCoords[1], leftThumbStickCoords[2]))

		rightThumbStickCoords = simExtXbox360Controller_getRightThumbStickCoords() -- returns table_2 (x, y) . x, y in [-1, 1]
		simAddStatusbarMessage(string.format("Right Thumb Stick Coords: (%f, %f)", rightThumbStickCoords[1], rightThumbStickCoords[2]))


	if (simExtXbox360Controller_isBackPressed()) then

		leftTriggerPressure = simExtXbox360Controller_getLeftTriggerPressure() -- returns float x in [0, 1]
		simAddStatusbarMessage(string.format("Left Trigger Pressure: %f", leftTriggerPressure))

		rightTriggerPressure = simExtXbox360Controller_getRightTriggerPressure() -- returns float x in [0, 1]
		simAddStatusbarMessage(string.format("Right Trigger Pressure: %f", rightTriggerPressure))


	simAddStatusbarMessage("ERROR! - Xbox 360 Controller not connected!")

In the following video there’s an example of the plugin in action:

Thanks for reading! 😉

UPDATE – July 21, 2016

GitHub repositories:


UPDATE – January 29, 2017

Visual Studio Project with x64 compiled dll: download.