diff --git a/.metadata/.lock b/.metadata/.lock
new file mode 100644
index 0000000..e69de29
diff --git a/.metadata/.log b/.metadata/.log
new file mode 100644
index 0000000..9ef8c35
--- /dev/null
+++ b/.metadata/.log
@@ -0,0 +1,280 @@
+!SESSION 2013-11-24 15:24:42.338 -----------------------------------------------
+eclipse.buildId=M20130204-1200
+java.version=1.6.0_24
+java.vendor=Sun Microsystems Inc.
+BootLoader constants: OS=linux, ARCH=x86, WS=gtk, NL=en_GB
+Framework arguments: -product org.eclipse.epp.package.cpp.product
+Command-line arguments: -os linux -ws gtk -arch x86 -product org.eclipse.epp.package.cpp.product
+
+!ENTRY org.eclipse.jface 4 2 2013-11-24 15:25:45.840
+!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.jface".
+!STACK 0
+java.lang.NullPointerException: element not initialized.
+ at org.eclipse.cdt.ui.newui.AbstractPage.getElement(AbstractPage.java:1272)
+ at org.eclipse.cdt.ui.newui.AbstractPage.getProject(AbstractPage.java:409)
+ at org.eclipse.cdt.ui.newui.AbstractPage.populateConfigurations(AbstractPage.java:745)
+ at org.eclipse.cdt.ui.newui.AbstractPage.setVisible(AbstractPage.java:829)
+ at org.eclipse.jface.preference.PreferenceDialog.showPage(PreferenceDialog.java:1324)
+ at org.eclipse.ui.internal.dialogs.FilteredPreferenceDialog.showPage(FilteredPreferenceDialog.java:675)
+ at org.eclipse.jface.preference.PreferenceDialog$10.run(PreferenceDialog.java:709)
+ at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
+ at org.eclipse.jface.preference.PreferenceDialog$9.selectionChanged(PreferenceDialog.java:705)
+ at org.eclipse.jface.viewers.StructuredViewer$3.run(StructuredViewer.java:888)
+ at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
+ at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:49)
+ at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175)
+ at org.eclipse.jface.viewers.StructuredViewer.firePostSelectionChanged(StructuredViewer.java:886)
+ at org.eclipse.jface.viewers.StructuredViewer.setSelection(StructuredViewer.java:1726)
+ at org.eclipse.jface.viewers.TreeViewer.setSelection(TreeViewer.java:1139)
+ at org.eclipse.jface.preference.PreferenceDialog.selectSavedItem(PreferenceDialog.java:1055)
+ at org.eclipse.ui.internal.dialogs.FilteredPreferenceDialog.selectSavedItem(FilteredPreferenceDialog.java:730)
+ at org.eclipse.jface.preference.PreferenceDialog$4.run(PreferenceDialog.java:376)
+ at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
+ at org.eclipse.jface.preference.PreferenceDialog.createContents(PreferenceDialog.java:372)
+ at org.eclipse.jface.window.Window.create(Window.java:431)
+ at org.eclipse.jface.dialogs.Dialog.create(Dialog.java:1089)
+ at org.eclipse.ui.internal.dialogs.PropertyDialog.createDialogOn(PropertyDialog.java:83)
+ at org.eclipse.ui.dialogs.PropertyDialogAction.createDialog(PropertyDialogAction.java:175)
+ at org.eclipse.ui.dialogs.PropertyDialogAction.run(PropertyDialogAction.java:156)
+ at org.eclipse.jface.action.Action.runWithEvent(Action.java:498)
+ at org.eclipse.jface.commands.ActionHandler.execute(ActionHandler.java:119)
+ at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:76)
+ at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
+ at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.lang.reflect.Method.invoke(Method.java:616)
+ at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:56)
+ at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:231)
+ at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:212)
+ at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:131)
+ at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:171)
+ at org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem.executeItem(HandledContributionItem.java:831)
+ at org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem.handleWidgetSelection(HandledContributionItem.java:724)
+ at org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem.access$7(HandledContributionItem.java:708)
+ at org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem$4.handleEvent(HandledContributionItem.java:647)
+ at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
+ at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1276)
+ at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3562)
+ at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3186)
+ at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1053)
+ at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
+ at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:942)
+ at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:86)
+ at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:588)
+ at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
+ at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:543)
+ at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
+ at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:124)
+ at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
+ at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
+ at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
+ at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:353)
+ at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:180)
+ at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
+ at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.lang.reflect.Method.invoke(Method.java:616)
+ at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:629)
+ at org.eclipse.equinox.launcher.Main.basicRun(Main.java:584)
+ at org.eclipse.equinox.launcher.Main.run(Main.java:1438)
+
+!ENTRY org.eclipse.jface 4 2 2013-11-24 15:26:07.835
+!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.jface".
+!STACK 0
+java.lang.NullPointerException: element not initialized.
+ at org.eclipse.cdt.ui.newui.AbstractPage.getElement(AbstractPage.java:1272)
+ at org.eclipse.cdt.ui.newui.AbstractPage.getProject(AbstractPage.java:409)
+ at org.eclipse.cdt.ui.newui.AbstractPage.populateConfigurations(AbstractPage.java:745)
+ at org.eclipse.cdt.ui.newui.AbstractPage.setVisible(AbstractPage.java:829)
+ at org.eclipse.jface.preference.PreferenceDialog.showPage(PreferenceDialog.java:1324)
+ at org.eclipse.ui.internal.dialogs.FilteredPreferenceDialog.showPage(FilteredPreferenceDialog.java:675)
+ at org.eclipse.jface.preference.PreferenceDialog$10.run(PreferenceDialog.java:709)
+ at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
+ at org.eclipse.jface.preference.PreferenceDialog$9.selectionChanged(PreferenceDialog.java:705)
+ at org.eclipse.jface.viewers.StructuredViewer$3.run(StructuredViewer.java:888)
+ at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
+ at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:49)
+ at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175)
+ at org.eclipse.jface.viewers.StructuredViewer.firePostSelectionChanged(StructuredViewer.java:886)
+ at org.eclipse.jface.viewers.StructuredViewer.setSelection(StructuredViewer.java:1726)
+ at org.eclipse.jface.viewers.TreeViewer.setSelection(TreeViewer.java:1139)
+ at org.eclipse.jface.preference.PreferenceDialog.selectSavedItem(PreferenceDialog.java:1055)
+ at org.eclipse.ui.internal.dialogs.FilteredPreferenceDialog.selectSavedItem(FilteredPreferenceDialog.java:730)
+ at org.eclipse.jface.preference.PreferenceDialog$4.run(PreferenceDialog.java:376)
+ at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
+ at org.eclipse.jface.preference.PreferenceDialog.createContents(PreferenceDialog.java:372)
+ at org.eclipse.jface.window.Window.create(Window.java:431)
+ at org.eclipse.jface.dialogs.Dialog.create(Dialog.java:1089)
+ at org.eclipse.ui.internal.dialogs.PropertyDialog.createDialogOn(PropertyDialog.java:83)
+ at org.eclipse.ui.dialogs.PropertyDialogAction.createDialog(PropertyDialogAction.java:175)
+ at org.eclipse.ui.dialogs.PropertyDialogAction.run(PropertyDialogAction.java:156)
+ at org.eclipse.jface.action.Action.runWithEvent(Action.java:498)
+ at org.eclipse.jface.commands.ActionHandler.execute(ActionHandler.java:119)
+ at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:76)
+ at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
+ at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.lang.reflect.Method.invoke(Method.java:616)
+ at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:56)
+ at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:231)
+ at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:212)
+ at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:131)
+ at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:171)
+ at org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem.executeItem(HandledContributionItem.java:831)
+ at org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem.handleWidgetSelection(HandledContributionItem.java:724)
+ at org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem.access$7(HandledContributionItem.java:708)
+ at org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem$4.handleEvent(HandledContributionItem.java:647)
+ at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
+ at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1276)
+ at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3562)
+ at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3186)
+ at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1053)
+ at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
+ at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:942)
+ at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:86)
+ at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:588)
+ at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
+ at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:543)
+ at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
+ at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:124)
+ at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
+ at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
+ at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
+ at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:353)
+ at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:180)
+ at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
+ at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.lang.reflect.Method.invoke(Method.java:616)
+ at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:629)
+ at org.eclipse.equinox.launcher.Main.basicRun(Main.java:584)
+ at org.eclipse.equinox.launcher.Main.run(Main.java:1438)
+
+!ENTRY org.eclipse.ui 4 0 2013-11-24 15:26:32.753
+!MESSAGE Unhandled event loop exception
+!STACK 0
+java.lang.NullPointerException
+ at it.baeyens.arduino.tools.ArduinoHelpers.searchFiles(ArduinoHelpers.java:324)
+ at it.baeyens.arduino.tools.ArduinoHelpers.getBoardsFiles(ArduinoHelpers.java:805)
+ at it.baeyens.arduino.ui.ArduinoSelectionPage.draw(ArduinoSelectionPage.java:170)
+ at it.baeyens.arduino.ui.ArduinoSettingsPage.createControl(ArduinoSettingsPage.java:46)
+ at org.eclipse.jface.wizard.Wizard.createPageControls(Wizard.java:174)
+ at org.eclipse.jface.wizard.WizardDialog.createPageControls(WizardDialog.java:736)
+ at org.eclipse.jface.wizard.WizardDialog.setWizard(WizardDialog.java:1182)
+ at org.eclipse.jface.wizard.WizardDialog.updateForPage(WizardDialog.java:1241)
+ at org.eclipse.jface.wizard.WizardDialog.access$4(WizardDialog.java:1238)
+ at org.eclipse.jface.wizard.WizardDialog$8.run(WizardDialog.java:1227)
+ at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
+ at org.eclipse.jface.wizard.WizardDialog.showPage(WizardDialog.java:1225)
+ at org.eclipse.jface.wizard.WizardDialog.nextPressed(WizardDialog.java:915)
+ at org.eclipse.jface.wizard.WizardDialog.buttonPressed(WizardDialog.java:428)
+ at org.eclipse.jface.dialogs.Dialog$2.widgetSelected(Dialog.java:624)
+ at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:248)
+ at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
+ at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1276)
+ at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3562)
+ at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3186)
+ at org.eclipse.jface.window.Window.runEventLoop(Window.java:825)
+ at org.eclipse.jface.window.Window.open(Window.java:801)
+ at org.eclipse.ui.actions.NewProjectAction.run(NewProjectAction.java:117)
+ at org.eclipse.jface.action.Action.runWithEvent(Action.java:498)
+ at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:584)
+ at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:501)
+ at org.eclipse.jface.action.ActionContributionItem$5.handleEvent(ActionContributionItem.java:411)
+ at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
+ at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1276)
+ at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3562)
+ at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3186)
+ at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1053)
+ at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
+ at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:942)
+ at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:86)
+ at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:588)
+ at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
+ at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:543)
+ at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
+ at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:124)
+ at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
+ at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
+ at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
+ at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:353)
+ at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:180)
+ at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
+ at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.lang.reflect.Method.invoke(Method.java:616)
+ at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:629)
+ at org.eclipse.equinox.launcher.Main.basicRun(Main.java:584)
+ at org.eclipse.equinox.launcher.Main.run(Main.java:1438)
+
+!ENTRY org.eclipse.jface 4 2 2013-11-24 15:27:00.782
+!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.jface".
+!STACK 0
+java.lang.NullPointerException: element not initialized.
+ at org.eclipse.cdt.ui.newui.AbstractPage.getElement(AbstractPage.java:1272)
+ at org.eclipse.cdt.ui.newui.AbstractPage.getProject(AbstractPage.java:409)
+ at org.eclipse.cdt.ui.newui.AbstractPage.populateConfigurations(AbstractPage.java:745)
+ at org.eclipse.cdt.ui.newui.AbstractPage.setVisible(AbstractPage.java:829)
+ at org.eclipse.jface.preference.PreferenceDialog.showPage(PreferenceDialog.java:1324)
+ at org.eclipse.ui.internal.dialogs.FilteredPreferenceDialog.showPage(FilteredPreferenceDialog.java:675)
+ at org.eclipse.jface.preference.PreferenceDialog$10.run(PreferenceDialog.java:709)
+ at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
+ at org.eclipse.jface.preference.PreferenceDialog$9.selectionChanged(PreferenceDialog.java:705)
+ at org.eclipse.jface.viewers.StructuredViewer$3.run(StructuredViewer.java:888)
+ at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
+ at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:49)
+ at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175)
+ at org.eclipse.jface.viewers.StructuredViewer.firePostSelectionChanged(StructuredViewer.java:886)
+ at org.eclipse.jface.viewers.StructuredViewer.setSelection(StructuredViewer.java:1726)
+ at org.eclipse.jface.viewers.TreeViewer.setSelection(TreeViewer.java:1139)
+ at org.eclipse.jface.preference.PreferenceDialog.selectSavedItem(PreferenceDialog.java:1055)
+ at org.eclipse.ui.internal.dialogs.FilteredPreferenceDialog.selectSavedItem(FilteredPreferenceDialog.java:730)
+ at org.eclipse.jface.preference.PreferenceDialog$4.run(PreferenceDialog.java:376)
+ at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
+ at org.eclipse.jface.preference.PreferenceDialog.createContents(PreferenceDialog.java:372)
+ at org.eclipse.jface.window.Window.create(Window.java:431)
+ at org.eclipse.jface.dialogs.Dialog.create(Dialog.java:1089)
+ at org.eclipse.ui.internal.dialogs.PropertyDialog.createDialogOn(PropertyDialog.java:83)
+ at org.eclipse.ui.dialogs.PropertyDialogAction.createDialog(PropertyDialogAction.java:175)
+ at org.eclipse.ui.dialogs.PropertyDialogAction.run(PropertyDialogAction.java:156)
+ at org.eclipse.jface.action.Action.runWithEvent(Action.java:498)
+ at org.eclipse.jface.commands.ActionHandler.execute(ActionHandler.java:119)
+ at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:76)
+ at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
+ at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.lang.reflect.Method.invoke(Method.java:616)
+ at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:56)
+ at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:231)
+ at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:212)
+ at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:131)
+ at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:171)
+ at org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem.executeItem(HandledContributionItem.java:831)
+ at org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem.handleWidgetSelection(HandledContributionItem.java:724)
+ at org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem.access$7(HandledContributionItem.java:708)
+ at org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem$4.handleEvent(HandledContributionItem.java:647)
+ at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
+ at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1276)
+ at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3562)
+ at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3186)
+ at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1053)
+ at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
+ at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:942)
+ at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:86)
+ at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:588)
+ at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
+ at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:543)
+ at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
+ at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:124)
+ at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
+ at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
+ at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
+ at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:353)
+ at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:180)
+ at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
+ at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.lang.reflect.Method.invoke(Method.java:616)
+ at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:629)
+ at org.eclipse.equinox.launcher.Main.basicRun(Main.java:584)
+ at org.eclipse.equinox.launcher.Main.run(Main.java:1438)
diff --git a/.metadata/.mylyn/repositories.xml.zip b/.metadata/.mylyn/repositories.xml.zip
new file mode 100644
index 0000000..7effce9
Binary files /dev/null and b/.metadata/.mylyn/repositories.xml.zip differ
diff --git a/.metadata/.mylyn/tasks.xml.zip b/.metadata/.mylyn/tasks.xml.zip
new file mode 100644
index 0000000..85e6e4b
Binary files /dev/null and b/.metadata/.mylyn/tasks.xml.zip differ
diff --git a/.metadata/.plugins/org.eclipse.cdt.core/.log b/.metadata/.plugins/org.eclipse.cdt.core/.log
new file mode 100644
index 0000000..11259b5
--- /dev/null
+++ b/.metadata/.plugins/org.eclipse.cdt.core/.log
@@ -0,0 +1 @@
+*** SESSION Nov 24, 2013 15:25:18.96 -------------------------------------------
diff --git a/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c b/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c
@@ -0,0 +1 @@
+
diff --git a/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp b/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp
@@ -0,0 +1 @@
+
diff --git a/.metadata/.plugins/org.eclipse.cdt.make.ui/dialog_settings.xml b/.metadata/.plugins/org.eclipse.cdt.make.ui/dialog_settings.xml
new file mode 100644
index 0000000..1cb58a4
--- /dev/null
+++ b/.metadata/.plugins/org.eclipse.cdt.make.ui/dialog_settings.xml
@@ -0,0 +1,5 @@
+
+
diff --git a/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version b/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version
new file mode 100644
index 0000000..25cb955
--- /dev/null
+++ b/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index b/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index
new file mode 100644
index 0000000..44ad839
Binary files /dev/null and b/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index differ
diff --git a/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version b/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version
new file mode 100644
index 0000000..6b2aaa7
--- /dev/null
+++ b/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/.metadata/.plugins/org.eclipse.core.resources/.root/1.tree b/.metadata/.plugins/org.eclipse.core.resources/.root/1.tree
new file mode 100644
index 0000000..4b89a73
Binary files /dev/null and b/.metadata/.plugins/org.eclipse.core.resources/.root/1.tree differ
diff --git a/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources b/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources
new file mode 100644
index 0000000..f6d0959
Binary files /dev/null and b/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources differ
diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prefs
new file mode 100644
index 0000000..ee2f4f8
--- /dev/null
+++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prefs
@@ -0,0 +1,5 @@
+eclipse.preferences.version=1
+spelling_locale=en_GB
+spelling_locale_initialized=true
+useAnnotationsPrefPage=true
+useQuickDiffPrefPage=true
diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..dffc6b5
--- /dev/null
+++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+version=1
diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.context.core.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.context.core.prefs
new file mode 100644
index 0000000..43e97e4
--- /dev/null
+++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.context.core.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+mylyn.attention.migrated=true
diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.monitor.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.monitor.ui.prefs
new file mode 100644
index 0000000..8d462a6
--- /dev/null
+++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.monitor.ui.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+org.eclipse.mylyn.monitor.activity.tracking.enabled.checked=true
diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.core.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.core.prefs
new file mode 100644
index 0000000..18f80a4
--- /dev/null
+++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.core.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+org.eclipse.rse.systemtype.local.systemType.defaultUserId=ensab
diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.ui.prefs
new file mode 100644
index 0000000..a86a7d8
--- /dev/null
+++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.rse.ui.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+org.eclipse.rse.preferences.order.connections=reprap.Local
diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.team.cvs.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.team.cvs.ui.prefs
new file mode 100644
index 0000000..f9e585b
--- /dev/null
+++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.team.cvs.ui.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+pref_first_startup=false
diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.team.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.team.ui.prefs
new file mode 100644
index 0000000..56cd496
--- /dev/null
+++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.team.ui.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+org.eclipse.team.ui.first_time=false
diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs
new file mode 100644
index 0000000..0bfc5f6
--- /dev/null
+++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs
@@ -0,0 +1,5 @@
+PROBLEMS_FILTERS_MIGRATE=true
+eclipse.preferences.version=1
+platformState=1382915063068
+quickStart=false
+tipsAndTricks=true
diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs
new file mode 100644
index 0000000..08076f2
--- /dev/null
+++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+showIntro=false
diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs
new file mode 100644
index 0000000..00866a4
--- /dev/null
+++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs
@@ -0,0 +1,2 @@
+ENABLED_DECORATORS=org.eclipse.cdt.ui.indexedFiles\:false,org.eclipse.cdt.managedbuilder.ui.excludedFile\:true,org.eclipse.cdt.managedbuilder.ui.includeFolder\:true,org.eclipse.cdt.internal.ui.CustomBuildSettingsDecorator\:true,org.eclipse.egit.ui.internal.decorators.GitLightweightDecorator\:true,org.eclipse.linuxtools.tmf.ui.trace_folder.decorator\:true,org.eclipse.linuxtools.tmf.ui.experiment_folder.decorator\:true,org.eclipse.linuxtools.tmf.ui.linked_trace.decorator\:true,org.eclipse.mylyn.context.ui.decorator.interest\:true,org.eclipse.mylyn.tasks.ui.decorators.task\:true,org.eclipse.mylyn.team.ui.changeset.decorator\:true,org.eclipse.rse.core.virtualobject.decorator\:true,org.eclipse.rse.core.binary.executable.decorator\:true,org.eclipse.rse.core.script.executable.decorator\:true,org.eclipse.rse.core.java.executable.decorator\:true,org.eclipse.rse.core.library.decorator\:true,org.eclipse.rse.core.link.decorator\:true,org.eclipse.rse.subsystems.error.decorator\:true,org.eclipse.team.cvs.ui.decorator\:true,org.eclipse.ui.LinkedResourceDecorator\:true,org.eclipse.ui.VirtualResourceDecorator\:true,org.eclipse.ui.ContentTypeDecorator\:true,org.eclipse.ui.ResourceFilterDecorator\:false,
+eclipse.preferences.version=1
diff --git a/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi b/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi
new file mode 100644
index 0000000..5d8bcd6
--- /dev/null
+++ b/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi
@@ -0,0 +1,1936 @@
+
+
+ activeSchemeId:org.eclipse.ui.defaultAcceleratorConfiguration
+
+ topLevel
+
+
+
+
+ persp.actionSet:org.eclipse.mylyn.context.ui.actionSet
+ persp.actionSet:org.eclipse.mylyn.doc.actionSet
+ persp.actionSet:org.eclipse.mylyn.tasks.ui.navigation
+ persp.actionSet:org.eclipse.ui.cheatsheets.actionSet
+ persp.actionSet:org.eclipse.rse.core.search.searchActionSet
+ persp.actionSet:org.eclipse.search.searchActionSet
+ persp.actionSet:org.eclipse.ui.edit.text.actionSet.annotationNavigation
+ persp.actionSet:org.eclipse.ui.edit.text.actionSet.navigation
+ persp.actionSet:org.eclipse.ui.edit.text.actionSet.convertLineDelimitersTo
+ persp.actionSet:org.eclipse.ui.externaltools.ExternalToolsSet
+ persp.actionSet:org.eclipse.ui.actionSet.keyBindings
+ persp.actionSet:org.eclipse.ui.actionSet.openFiles
+ persp.actionSet:org.eclipse.cdt.ui.SearchActionSet
+ persp.actionSet:org.eclipse.cdt.ui.CElementCreationActionSet
+ persp.actionSet:org.eclipse.ui.NavigateActionSet
+ persp.viewSC:org.eclipse.ui.console.ConsoleView
+ persp.viewSC:org.eclipse.search.ui.views.SearchView
+ persp.viewSC:org.eclipse.ui.views.ContentOutline
+ persp.viewSC:org.eclipse.ui.views.ProblemView
+ persp.viewSC:org.eclipse.cdt.ui.CView
+ persp.viewSC:org.eclipse.ui.views.ResourceNavigator
+ persp.viewSC:org.eclipse.ui.views.PropertySheet
+ persp.viewSC:org.eclipse.ui.views.TaskList
+ persp.newWizSC:org.eclipse.cdt.autotools.ui.wizards.conversionWizard
+ persp.newWizSC:org.eclipse.cdt.ui.wizards.ConvertToMakeWizard
+ persp.newWizSC:org.eclipse.cdt.ui.wizards.NewMakeFromExisting
+ persp.newWizSC:org.eclipse.cdt.ui.wizards.NewCWizard1
+ persp.newWizSC:org.eclipse.cdt.ui.wizards.NewCWizard2
+ persp.newWizSC:org.eclipse.cdt.ui.wizards.NewSourceFolderCreationWizard
+ persp.newWizSC:org.eclipse.cdt.ui.wizards.NewFolderCreationWizard
+ persp.newWizSC:org.eclipse.cdt.ui.wizards.NewSourceFileCreationWizard
+ persp.newWizSC:org.eclipse.cdt.ui.wizards.NewHeaderFileCreationWizard
+ persp.newWizSC:org.eclipse.cdt.ui.wizards.NewFileCreationWizard
+ persp.newWizSC:org.eclipse.cdt.ui.wizards.NewClassCreationWizard
+ persp.showIn:org.eclipse.cdt.codan.internal.ui.views.ProblemDetails
+ persp.viewSC:org.eclipse.cdt.codan.internal.ui.views.ProblemDetails
+ persp.actionSet:org.eclipse.debug.ui.breakpointActionSet
+ persp.viewSC:org.eclipse.cdt.make.ui.views.MakeView
+ persp.actionSet:org.eclipse.cdt.make.ui.makeTargetActionSet
+ persp.perspSC:org.eclipse.debug.ui.DebugPerspective
+ persp.perspSC:org.eclipse.team.ui.TeamSynchronizingPerspective
+ persp.actionSet:org.eclipse.debug.ui.launchActionSet
+ persp.actionSet:org.eclipse.cdt.ui.buildConfigActionSet
+ persp.actionSet:org.eclipse.cdt.ui.NavigationActionSet
+ persp.actionSet:org.eclipse.cdt.ui.OpenActionSet
+ persp.actionSet:org.eclipse.cdt.ui.CodingActionSet
+ persp.actionSet:org.eclipse.ui.edit.text.actionSet.presentation
+ persp.showIn:org.eclipse.cdt.ui.includeBrowser
+ persp.showIn:org.eclipse.cdt.ui.CView
+ persp.showIn:org.eclipse.ui.navigator.ProjectExplorer
+ persp.viewSC:org.eclipse.ui.navigator.ProjectExplorer
+ persp.viewSC:org.eclipse.cdt.ui.includeBrowser
+ persp.actionSet:org.eclipse.debug.ui.profileActionSet
+ persp.viewSC:org.eclipse.mylyn.tasks.ui.views.tasks
+ persp.newWizSC:org.eclipse.mylyn.tasks.ui.wizards.new.repository.task
+
+
+ newtablook
+
+
+
+
+
+
+
+
+
+ newtablook
+
+
+
+
+
+
+ newtablook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ View
+ categoryTag:Help
+
+
+ View
+ categoryTag:General
+
+ ViewMenu
+ menuContribution:menu
+
+
+
+
+ View
+ categoryTag:Help
+
+
+
+ newtablook
+ org.eclipse.e4.primaryDataStack
+ EditorStack
+
+
+
+
+ View
+ categoryTag:General
+ activeOnClose
+
+ ViewMenu
+ menuContribution:menu
+
+
+
+
+ View
+ categoryTag:&C/C++
+
+
+ View
+ categoryTag:General
+
+
+ View
+ categoryTag:General
+
+
+
+ View
+ categoryTag:General
+
+ ViewMenu
+ menuContribution:menu
+
+
+
+
+ View
+ categoryTag:General
+
+
+ View
+ categoryTag:General
+
+
+ View
+ categoryTag:General
+
+
+ View
+ categoryTag:General
+
+ ViewMenu
+ menuContribution:menu
+
+
+
+
+ View
+ categoryTag:Make
+
+ ViewMenu
+ menuContribution:menu
+
+
+
+
+ View
+ categoryTag:&C/C++
+
+
+ View
+ categoryTag:Mylyn
+
+ ViewMenu
+ menuContribution:menu
+
+
+
+
+
+ toolbarSeparator
+
+
+
+ Draggable
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ toolbarSeparator
+
+
+
+ Draggable
+
+
+
+
+
+
+
+ Draggable
+
+
+
+
+
+
+
+ Draggable
+
+
+
+
+
+
+ toolbarSeparator
+
+
+
+ Draggable
+
+
+
+
+
+
+
+
+
+
+
+ toolbarSeparator
+
+
+
+ toolbarSeparator
+
+
+
+ Draggable
+
+
+
+
+ stretch
+
+
+ glue
+
+
+
+ glue
+
+
+ Draggable
+
+
+
+
+ stretch
+
+
+
+ Draggable
+
+
+
+
+ TrimStack
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ platform:gtk
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Editor
+
+
+ View
+ categoryTag:&C/C++
+
+
+ View
+ categoryTag:Debug
+
+
+ View
+ categoryTag:Debug
+
+
+ View
+ categoryTag:Debug
+
+
+ View
+ categoryTag:Debug
+
+
+ View
+ categoryTag:Debug
+
+
+ View
+ categoryTag:Make
+
+
+ View
+ categoryTag:&C/C++
+
+
+ View
+ categoryTag:&C/C++
+
+
+ View
+ categoryTag:&C/C++
+
+
+ View
+ categoryTag:&C/C++
+
+
+ View
+ categoryTag:&C/C++
+
+
+ View
+ categoryTag:General
+
+
+ View
+ categoryTag:Debug
+
+
+ View
+ categoryTag:Debug
+
+
+ View
+ categoryTag:Debug
+
+
+ View
+ categoryTag:Debug
+
+
+ View
+ categoryTag:Debug
+
+
+ View
+ categoryTag:Debug
+
+
+ View
+ categoryTag:Debug
+
+
+ View
+ categoryTag:Git
+
+
+ View
+ categoryTag:Git
+
+
+ View
+ categoryTag:Git
+
+
+ View
+ categoryTag:Git
+
+
+ View
+ categoryTag:Help
+
+
+ View
+ categoryTag:&C/C++
+
+
+ View
+ categoryTag:&C/C++
+
+
+ View
+ categoryTag:Charts
+
+
+ View
+ categoryTag:gcov
+
+
+ View
+ categoryTag:gprof
+
+
+ View
+ categoryTag:LTTng
+
+
+ View
+ categoryTag:LTTng
+
+
+ View
+ categoryTag:LTTng
+
+
+ View
+ categoryTag:C/C++ Profiling
+
+
+ View
+ categoryTag:Profiling
+
+
+ View
+ categoryTag:Profiling
+
+
+ View
+ categoryTag:SystemTap
+
+
+ View
+ categoryTag:SystemTap
+
+
+ View
+ categoryTag:SystemTap
+
+
+ View
+ categoryTag:SystemTap
+
+
+ View
+ categoryTag:SystemTap
+
+
+ View
+ categoryTag:SystemTap
+
+
+ View
+ categoryTag:SystemTap
+
+
+ View
+ categoryTag:SystemTap
+
+
+ View
+ categoryTag:SystemTap
+
+
+ View
+ categoryTag:Tracing
+
+
+ View
+ categoryTag:Tracing
+
+
+ View
+ categoryTag:Tracing
+
+
+ View
+ categoryTag:Tracing
+
+
+ View
+ categoryTag:Tracing
+
+
+ View
+ categoryTag:Tracing
+
+
+ View
+ categoryTag:Tracing
+
+
+ View
+ categoryTag:Tracing
+
+
+ View
+ categoryTag:Profiling
+
+
+ View
+ categoryTag:Mylyn
+
+
+ View
+ categoryTag:Mylyn
+
+
+ View
+ categoryTag:Mylyn
+
+
+ View
+ categoryTag:Remote Systems
+
+
+ View
+ categoryTag:Remote Systems
+
+
+ View
+ categoryTag:Remote Systems
+
+
+ View
+ categoryTag:Remote Systems
+
+
+ View
+ categoryTag:Remote Systems
+
+
+ View
+ categoryTag:Remote Systems
+
+
+ View
+ categoryTag:Remote Systems
+
+
+ View
+ categoryTag:Remote Systems
+
+
+ View
+ categoryTag:General
+
+
+ View
+ categoryTag:General
+
+
+ View
+ categoryTag:CVS
+
+
+ View
+ categoryTag:CVS
+
+
+ View
+ categoryTag:Team
+
+
+ View
+ categoryTag:Team
+
+
+ View
+ categoryTag:General
+
+
+ View
+ categoryTag:General
+
+
+ View
+ categoryTag:Help
+
+
+ View
+ categoryTag:General
+
+
+ View
+ categoryTag:General
+
+
+ View
+ categoryTag:General
+
+
+ View
+ categoryTag:General
+
+
+ View
+ categoryTag:General
+
+
+ View
+ categoryTag:General
+
+
+ View
+ categoryTag:General
+
+
+ View
+ categoryTag:General
+
+
+ View
+ categoryTag:General
+
+
+ View
+ categoryTag:General
+
+
+ View
+ categoryTag:General
+
+
+ View
+ categoryTag:Arduino
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.metadata/.plugins/org.eclipse.rse.core/.log b/.metadata/.plugins/org.eclipse.rse.core/.log
new file mode 100644
index 0000000..e69de29
diff --git a/.metadata/.plugins/org.eclipse.rse.core/initializerMarks/org.eclipse.rse.internal.core.RSELocalConnectionInitializer.mark b/.metadata/.plugins/org.eclipse.rse.core/initializerMarks/org.eclipse.rse.internal.core.RSELocalConnectionInitializer.mark
new file mode 100644
index 0000000..e69de29
diff --git a/.metadata/.plugins/org.eclipse.rse.core/profiles/PRF.reprap_0/FP.local.files_0/node.properties b/.metadata/.plugins/org.eclipse.rse.core/profiles/PRF.reprap_0/FP.local.files_0/node.properties
new file mode 100644
index 0000000..6954bf7
--- /dev/null
+++ b/.metadata/.plugins/org.eclipse.rse.core/profiles/PRF.reprap_0/FP.local.files_0/node.properties
@@ -0,0 +1,57 @@
+# RSE DOM Node
+00-name=reprap\:local.files
+01-type=FilterPool
+03-attr.default=true
+03-attr.deletable=true
+03-attr.id=local.files
+03-attr.nonRenamable=false
+03-attr.owningParentName=null
+03-attr.release=200
+03-attr.singleFilterStringOnly=false
+03-attr.singleFilterStringOnlyESet=false
+03-attr.stringsCaseSensitive=true
+03-attr.supportsDuplicateFilterStrings=false
+03-attr.supportsNestedFilters=true
+03-attr.type=default
+06-child.00000.00-name=My Home
+06-child.00000.01-type=Filter
+06-child.00000.03-attr.default=false
+06-child.00000.03-attr.filterType=default
+06-child.00000.03-attr.id=My Home
+06-child.00000.03-attr.nonChangable=false
+06-child.00000.03-attr.nonDeletable=false
+06-child.00000.03-attr.nonRenamable=false
+06-child.00000.03-attr.promptable=false
+06-child.00000.03-attr.relativeOrder=0
+06-child.00000.03-attr.release=200
+06-child.00000.03-attr.singleFilterStringOnly=false
+06-child.00000.03-attr.stringsCaseSensitive=true
+06-child.00000.03-attr.stringsNonChangable=false
+06-child.00000.03-attr.supportsDuplicateFilterStrings=false
+06-child.00000.03-attr.supportsNestedFilters=true
+06-child.00000.06-child.00000.00-name=/home/ensab/*
+06-child.00000.06-child.00000.01-type=FilterString
+06-child.00000.06-child.00000.03-attr.default=false
+06-child.00000.06-child.00000.03-attr.string=/home/ensab/*
+06-child.00000.06-child.00000.03-attr.type=default
+06-child.00001.00-name=Root
+06-child.00001.01-type=Filter
+06-child.00001.03-attr.default=false
+06-child.00001.03-attr.filterType=default
+06-child.00001.03-attr.id=Root
+06-child.00001.03-attr.nonChangable=false
+06-child.00001.03-attr.nonDeletable=false
+06-child.00001.03-attr.nonRenamable=false
+06-child.00001.03-attr.promptable=false
+06-child.00001.03-attr.relativeOrder=0
+06-child.00001.03-attr.release=200
+06-child.00001.03-attr.singleFilterStringOnly=false
+06-child.00001.03-attr.stringsCaseSensitive=true
+06-child.00001.03-attr.stringsNonChangable=false
+06-child.00001.03-attr.supportsDuplicateFilterStrings=false
+06-child.00001.03-attr.supportsNestedFilters=true
+06-child.00001.06-child.00000.00-name=/*
+06-child.00001.06-child.00000.01-type=FilterString
+06-child.00001.06-child.00000.03-attr.default=false
+06-child.00001.06-child.00000.03-attr.string=/*
+06-child.00001.06-child.00000.03-attr.type=default
diff --git a/.metadata/.plugins/org.eclipse.rse.core/profiles/PRF.reprap_0/H.local_16/node.properties b/.metadata/.plugins/org.eclipse.rse.core/profiles/PRF.reprap_0/H.local_16/node.properties
new file mode 100644
index 0000000..aa1e7a5
--- /dev/null
+++ b/.metadata/.plugins/org.eclipse.rse.core/profiles/PRF.reprap_0/H.local_16/node.properties
@@ -0,0 +1,25 @@
+# RSE DOM Node
+00-name=Local
+01-type=Host
+03-attr.description=
+03-attr.hostname=LOCALHOST
+03-attr.offline=false
+03-attr.promptable=false
+03-attr.systemType=org.eclipse.rse.systemtype.local
+03-attr.type=Local
+06-child.00000.00-name=Local Connector Service
+06-child.00000.01-type=ConnectorService
+06-child.00000.03-attr.group=Local Connector Service
+06-child.00000.03-attr.port=0
+06-child.00000.03-attr.useSSL=false
+06-child.00000.06-child.00000.00-name=Local Files
+06-child.00000.06-child.00000.01-type=SubSystem
+06-child.00000.06-child.00000.03-attr.hidden=false
+06-child.00000.06-child.00000.03-attr.type=local.files
+06-child.00000.06-child.00000.06-child.00000.00-name=reprap___reprap\:local.files
+06-child.00000.06-child.00000.06-child.00000.01-type=FilterPoolReference
+06-child.00000.06-child.00000.06-child.00000.03-attr.refID=local.files
+06-child.00000.06-child.00001.00-name=Local Shells
+06-child.00000.06-child.00001.01-type=SubSystem
+06-child.00000.06-child.00001.03-attr.hidden=false
+06-child.00000.06-child.00001.03-attr.type=local.shells
diff --git a/.metadata/.plugins/org.eclipse.rse.core/profiles/PRF.reprap_0/node.properties b/.metadata/.plugins/org.eclipse.rse.core/profiles/PRF.reprap_0/node.properties
new file mode 100644
index 0000000..556ac46
--- /dev/null
+++ b/.metadata/.plugins/org.eclipse.rse.core/profiles/PRF.reprap_0/node.properties
@@ -0,0 +1,7 @@
+# RSE DOM Node
+00-name=reprap
+01-type=Profile
+03-attr.defaultPrivate=true
+03-attr.isActive=true
+05-ref.00000=FP.local.files_0
+05-ref.00001=H.local_16
diff --git a/.metadata/.plugins/org.eclipse.rse.ui/.log b/.metadata/.plugins/org.eclipse.rse.ui/.log
new file mode 100644
index 0000000..e69de29
diff --git a/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml b/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml
new file mode 100644
index 0000000..36e36c6
--- /dev/null
+++ b/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml
@@ -0,0 +1,5 @@
+
+
diff --git a/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml b/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml
new file mode 100644
index 0000000..870cf36
--- /dev/null
+++ b/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml
@@ -0,0 +1,15 @@
+
+
diff --git a/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml b/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml
new file mode 100644
index 0000000..3f50908
--- /dev/null
+++ b/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.metadata/version.ini b/.metadata/version.ini
new file mode 100644
index 0000000..c51ff74
--- /dev/null
+++ b/.metadata/version.ini
@@ -0,0 +1 @@
+org.eclipse.core.runtime=1
\ No newline at end of file
diff --git a/Configuration.h b/Configuration.h
index 494a01e..7358496 100644
--- a/Configuration.h
+++ b/Configuration.h
@@ -24,9 +24,9 @@ Licence: GPL
#define CONFIGURATION_H
#define NAME "RepRapFirmware"
-#define VERSION "0.58"
-#define DATE "2014-02-08"
-#define LAST_AUTHOR "dc42"
+#define VERSION "0.59"
+#define DATE "2014-02-19"
+#define LAST_AUTHOR "reprappro"
// Other firmware that we might switch to be compatible with.
@@ -61,7 +61,7 @@ enum Compatibility
#define STANDBY_INTERRUPT_RATE 2.0e-4 // Seconds
#define NUMBER_OF_PROBE_POINTS 4
-#define Z_DIVE 5.0 // Height from which to probe the bed (mm)
+#define Z_DIVE 8.0 // Height from which to probe the bed (mm)
#define SILLY_Z_VALUE -9999.0
diff --git a/GCodes.cpp b/GCodes.cpp
index 841ca26..1b744b9 100644
--- a/GCodes.cpp
+++ b/GCodes.cpp
@@ -87,7 +87,7 @@ void GCodes::Init()
axisIsHomed[X_AXIS] = axisIsHomed[Y_AXIS] = axisIsHomed[Z_AXIS] = false;
}
-void GCodes::doFilePrint(GCodeBuffer* gb)
+void GCodes::DoFilePrint(GCodeBuffer* gb)
{
char b;
@@ -212,7 +212,7 @@ void GCodes::Spin()
}
}
- doFilePrint(fileGCode);
+ DoFilePrint(fileGCode);
platform->ClassReport("GCodes", longWait);
}
@@ -456,7 +456,7 @@ bool GCodes::DoFileCannedCycles(const char* fileName)
return false;
}
- doFilePrint(cannedCycleGCode);
+ DoFilePrint(cannedCycleGCode);
return false;
}
diff --git a/GCodes.h b/GCodes.h
index 30507ee..7c4026c 100644
--- a/GCodes.h
+++ b/GCodes.h
@@ -33,30 +33,30 @@ class GCodeBuffer
{
public:
GCodeBuffer(Platform* p, const char* id);
- void Init();
- bool Put(char c);
- bool Seen(char c);
- float GetFValue();
- int GetIValue();
- long GetLValue();
- const char* GetUnprecedentedString();
- const char* GetString();
- const char* Buffer();
- bool Finished() const;
- void SetFinished(bool f);
- const char* WritingFileDirectory() const;
- void SetWritingFileDirectory(const char* wfd);
+ void Init(); // Set it up
+ bool Put(char c); // Add a character to the end
+ bool Seen(char c); // Is a character present?
+ float GetFValue(); // Get a float after a key letter
+ int GetIValue(); // Get an integer after a key letter
+ long GetLValue(); // Get a long integer after a key letter
+ const char* GetUnprecedentedString(); // Get a string with no preceeding key letter
+ const char* GetString(); // Get a string after a key letter
+ const char* Buffer(); // All of the G Code itself
+ bool Finished() const; // Has the G Code been executed?
+ void SetFinished(bool f); // Set the G Code executed (or not)
+ const char* WritingFileDirectory() const; // If we are writing the G Code to a file, where that file is
+ void SetWritingFileDirectory(const char* wfd); // Set the directory for the file to write the GCode in
private:
- int CheckSum();
- Platform* platform;
- char gcodeBuffer[GCODE_LENGTH];
- const char* identity;
- int gcodePointer;
- int readPointer;
- bool inComment;
- bool finished;
- const char* writingFileDirectory;
+ int CheckSum(); // Compute the checksum (if any) at the end of the G Code
+ Platform* platform; // Pointer to the RepRap's controlling class
+ char gcodeBuffer[GCODE_LENGTH]; // The G Code
+ const char* identity; // Where we are from (web, file, serial line etc)
+ int gcodePointer; // Index in the buffer
+ int readPointer; // Where in the buffer to read next
+ bool inComment; // Are we after a ';' character?
+ bool finished; // Has the G Code been executed?
+ const char* writingFileDirectory; // If the G Code is going into a file, where that is
};
//****************************************************************************************************
@@ -68,99 +68,102 @@ class GCodes
public:
GCodes(Platform* p, Webserver* w);
- void Spin();
- void Init();
- void Exit();
- bool RunConfigurationGCodes();
- bool ReadMove(float* m, bool& ce);
- void QueueFileToPrint(const char* fileName);
- void DeleteFile(const char* fileName);
- bool GetProbeCoordinates(int count, float& x, float& y, float& z);
- char* GetCurrentCoordinates();
- bool PrintingAFile() const;
- void Diagnostics();
- bool HaveIncomingData() const;
- bool GetAxisIsHomed(uint8_t axis) const { return axisIsHomed[axis]; }
+ void Spin(); // Called in a tight loop to make this class work
+ void Init(); // Set it up
+ void Exit(); // Shut it down
+ bool RunConfigurationGCodes(); // Run the configuration G Code file on reboot
+ bool ReadMove(float* m, bool& ce); // Called by the Move class to get a movement set by the last G Code
+ void QueueFileToPrint(const char* fileName); // Open a file of G Codes to run
+ void DeleteFile(const char* fileName); // Does what it says
+ bool GetProbeCoordinates(int count, float& x, float& y, float& z); // Get pre-recorded probe coordinates
+ char* GetCurrentCoordinates(); // Get where we are as a string
+ bool PrintingAFile() const; // Are we in the middle of printing a file?
+ void Diagnostics(); // Send helpful information out
+ bool HaveIncomingData() const; // Is there something that we have to do?
+ //bool GetAxisIsHomed(uint8_t axis) const { return axisIsHomed[axis]; } // Not needed on voyage?
private:
- void doFilePrint(GCodeBuffer* gb);
- bool AllMovesAreFinishedAndMoveBufferIsLoaded();
- bool DoCannedCycleMove(bool ce);
- bool DoFileCannedCycles(const char* fileName);
- bool FileCannedCyclesReturn();
- bool ActOnGcode(GCodeBuffer* gb);
- bool SetUpMove(GCodeBuffer* gb);
- bool DoDwell(GCodeBuffer *gb);
- bool DoHome(char *reply, bool& error);
- bool DoSingleZProbeAtPoint();
- bool DoSingleZProbe();
- bool SetSingleZProbeAtAPosition(GCodeBuffer *gb);
- bool DoMultipleZProbe();
- bool SetPrintZProbe(GCodeBuffer *gb, char *reply);
- bool SetOffsets(GCodeBuffer *gb);
- bool SetPositions(GCodeBuffer *gb);
- void LoadMoveBufferFromGCode(GCodeBuffer *gb, bool doingG92, bool applyLimits);
- bool NoHome() const;
- bool Push();
- bool Pop();
- bool DisableDrives();
- bool StandbyHeaters();
- void SetEthernetAddress(GCodeBuffer *gb, int mCode);
- void HandleReply(bool error, bool fromLine, const char* reply, char gMOrT, int code, bool resend);
- void OpenFileToWrite(const char* directory, const char* fileName, GCodeBuffer *gb);
- void WriteGCodeToFile(GCodeBuffer *gb);
- bool SendConfigToLine();
- void WriteHTMLToFile(char b, GCodeBuffer *gb);
- bool OffsetAxes(GCodeBuffer *gb);
+ void DoFilePrint(GCodeBuffer* gb); // Get G Codes from a file and print them
+ bool AllMovesAreFinishedAndMoveBufferIsLoaded(); // Wait for move queue to exhaust and the current position is loaded
+ bool DoCannedCycleMove(bool ce); // Do a move from an internally programmed canned cycle
+ bool DoFileCannedCycles(const char* fileName); // Run a GCode macro in a file
+ bool FileCannedCyclesReturn(); // End a macro
+ bool ActOnGcode(GCodeBuffer* gb); // Do the G Code
+ bool SetUpMove(GCodeBuffer* gb); // Set up a new movement
+ bool DoDwell(GCodeBuffer *gb); // Wait for a bit
+ bool DoHome(char *reply, bool& error); // Home some axes
+ bool DoSingleZProbeAtPoint(); // Probe at a given point
+ bool DoSingleZProbe(); // Probe where we are
+ bool SetSingleZProbeAtAPosition(GCodeBuffer *gb); // Probes at a given position - see the comment at the head of the function itself
+ bool DoMultipleZProbe(); // Probes a series of points and sets the bed equation
+ bool SetPrintZProbe(GCodeBuffer *gb, char *reply); // Either return the probe value, or set its threshold
+ bool SetOffsets(GCodeBuffer *gb); // Deal with a G10
+ bool SetPositions(GCodeBuffer *gb); // Deal with a G92
+ void LoadMoveBufferFromGCode(GCodeBuffer *gb, // Set up a move for the Move class
+ bool doingG92, bool applyLimits);
+ bool NoHome() const; // Are we homing and not finished?
+ bool Push(); // Push feedrate etc on the stack
+ bool Pop(); // Pop feedrate etc
+ bool DisableDrives(); // Turn the motors off
+ bool StandbyHeaters(); // Set all heaters to standby temperatures
+ void SetEthernetAddress(GCodeBuffer *gb, int mCode); // Does what it says
+ void HandleReply(bool error, bool fromLine, const char* reply, // If the GCode is from the serial interface, reply to it
+ char gMOrT, int code, bool resend);
+ void OpenFileToWrite(const char* directory, // Start saving GCodes in a file
+ const char* fileName, GCodeBuffer *gb);
+ void WriteGCodeToFile(GCodeBuffer *gb); // Write this GCode into a file
+ bool SendConfigToLine(); // Deal with M503
+ void WriteHTMLToFile(char b, GCodeBuffer *gb); // Save an HTML file (usually to upload a new web interface)
+ bool OffsetAxes(GCodeBuffer *gb); // Set offsets - deprecated, use G10
+ int8_t Heater(int8_t head) const; // Legacy G codes start heaters at 0, but we use 0 for the bed. This sorts that out.
- int8_t Heater(int8_t head) const;
- Platform* platform;
- bool active;
- Webserver* webserver;
- float dwellTime;
- bool dwellWaiting;
- GCodeBuffer* webGCode;
- GCodeBuffer* fileGCode;
- GCodeBuffer* serialGCode;
- GCodeBuffer* cannedCycleGCode;
- bool moveAvailable;
- float moveBuffer[DRIVES+1]; // Last is feed rate
- bool checkEndStops;
- bool drivesRelative; // All except X, Y and Z
- bool axesRelative; // X, Y and Z
- bool drivesRelativeStack[STACK];
- bool axesRelativeStack[STACK];
- float feedrateStack[STACK];
- FileStore* fileStack[STACK];
- int8_t stackPointer;
- char gCodeLetters[DRIVES + 1]; // Extra is for F
- float lastPos[DRIVES - AXES]; // Just needed for relative moves.
- float record[DRIVES+1];
- float moveToDo[DRIVES+1];
- bool activeDrive[DRIVES+1];
- bool offSetSet;
- float distanceScale;
- FileStore* fileBeingPrinted;
- FileStore* fileToPrint;
- FileStore* fileBeingWritten;
- FileStore* configFile;
- bool doingCannedCycleFile;
- char* eofString;
- uint8_t eofStringCounter;
- uint8_t eofStringLength;
- int8_t selectedHead;
- bool homeX;
- bool homeY;
- bool homeZ;
- int8_t homeAxisMoveCount;
- float gFeedRate;
- int probeCount;
- int8_t cannedCycleMoveCount;
- bool cannedCycleMoveQueued;
- bool zProbesSet;
- float longWait;
- bool axisIsHomed[3]; // these record which of the axes have been homed
+ Platform* platform; // The RepRap machine
+ bool active; // Live and running?
+ Webserver* webserver; // The webserver class
+ float dwellTime; // How long a pause for a dwell (seconds)?
+ bool dwellWaiting; // We are in a dwell
+ GCodeBuffer* webGCode; // The sources...
+ GCodeBuffer* fileGCode; // ...
+ GCodeBuffer* serialGCode; // ...
+ GCodeBuffer* cannedCycleGCode; // ... of G Codes
+ bool moveAvailable; // Have we seen a move G Code and set it up?
+ float moveBuffer[DRIVES+1]; // Move coordinates; last is feed rate
+ bool checkEndStops; // Should we check them on the next move?
+ bool drivesRelative; // Are movements relative - all except X, Y and Z
+ bool axesRelative; // Are movements relative - X, Y and Z
+ bool drivesRelativeStack[STACK]; // For dealing with Push and Pop
+ bool axesRelativeStack[STACK]; // For dealing with Push and Pop
+ float feedrateStack[STACK]; // For dealing with Push and Pop
+ FileStore* fileStack[STACK]; // For dealing with Push and Pop
+ int8_t stackPointer; // Push and Pop stack pointer
+ char gCodeLetters[DRIVES + 1]; // 'X', 'Y' etc. Extra is for F
+ float lastPos[DRIVES - AXES]; // Just needed for relative moves; i.e. not X, Y and Z
+ float record[DRIVES+1]; // Temporary store for move positions
+ float moveToDo[DRIVES+1]; // Where to go set by G1 etc
+ bool activeDrive[DRIVES+1]; // Is this drive involved in a move?
+ bool offSetSet; // Are any axis offsets non-zero?
+ float distanceScale; // MM or inches
+ FileStore* fileBeingPrinted; // The file being printed at the moment (if any)
+ FileStore* fileToPrint; // A file to print in the future, or one that has been paused
+ FileStore* fileBeingWritten; // A file to write G Codes (or sometimes HTML) in
+ FileStore* configFile; // A file containing a macro
+ bool doingCannedCycleFile; // Are we executing a macro file?
+ char* eofString; // What's at the end of an HTML file?
+ uint8_t eofStringCounter; // Check the...
+ uint8_t eofStringLength; // ... EoF string as we read.
+ int8_t selectedHead; // Which extruder is in use
+ bool homeX; // True to home the X axis this move
+ bool homeY; // True to home the Y axis this move
+ bool homeZ; // True to home the Z axis this move
+ //int8_t homeAxisMoveCount; // Not needed on voyage?
+ float gFeedRate; // Store for the current feedrate
+ int probeCount; // Counts multiple probe points
+ int8_t cannedCycleMoveCount; // Counts through internal (i.e. not macro) canned cycle moves
+ bool cannedCycleMoveQueued; // True if a canned cycle move has been set
+ bool zProbesSet; // True if all Z probing is done and we can set the bed equation
+ float longWait; // Timer for things that happen occasionally (seconds)
+ bool axisIsHomed[3]; // These record which of the axes have been homed
};
//*****************************************************************************************************
diff --git a/Heat.cpp b/Heat.cpp
index d45253a..259133f 100644
--- a/Heat.cpp
+++ b/Heat.cpp
@@ -60,7 +60,8 @@ void Heat::Spin()
void Heat::Diagnostics()
{
- platform->Message(HOST_MESSAGE, "Heat Diagnostics:\n");
+ platform->Message(HOST_MESSAGE, "Heat Diagnostics:\n");
+ // TODO - Put something useful in here
}
bool Heat::AllHeatersAtSetTemperatures()
@@ -107,7 +108,7 @@ void PID::Init()
temp_dState = 0.0;
badTemperatureCount = 0;
temperatureFault = false;
- active = false;
+ active = false; // Default to standby temperature
}
@@ -135,8 +136,7 @@ void PID::Spin()
platform->Message(HOST_MESSAGE, ftoa(scratchString, temperature, 1));
platform->Message(HOST_MESSAGE, "\n");
}
- }
- else
+ } else
{
badTemperatureCount = 0;
}
@@ -175,6 +175,9 @@ void PID::Spin()
lastTemperature = temperature;
+ // Legacy - old RepRap PID parameters were set to give values in [0, 255] for 1 byte PWM control
+ // TODO - maybe change them to give [0.0, 1.0]?
+
if (result < 0.0) result = 0.0;
else if (result > 255.0) result = 255.0;
result = result/255.0;
@@ -182,9 +185,8 @@ void PID::Spin()
if(!temperatureFault)
platform->SetHeater(heater, result);
-#if 0 // debug
- char buffer[100];
- snprintf(buffer, ARRAY_SIZE(buffer), "Heat: e=%f, P=%f, I=%f, d=%f, r=%f\n", error, platform->PidKp(heater)*error, temp_iState, temp_dState, result);
- platform->Message(HOST_MESSAGE, buffer);
-#endif
+// char buffer[100];
+// snprintf(buffer, ARRAY_SIZE(buffer), "Heat: e=%f, P=%f, I=%f, d=%f, r=%f\n", error, platform->PidKp(heater)*error, temp_iState, temp_dState, result);
+// platform->Message(HOST_MESSAGE, buffer);
+
}
diff --git a/Heat.h b/Heat.h
index 5b1127e..dd12e51 100644
--- a/Heat.h
+++ b/Heat.h
@@ -21,66 +21,76 @@ Licence: GPL
#ifndef HEAT_H
#define HEAT_H
+/**
+ * This class implements a PID controller for the heaters
+ */
+
class PID
{
- public:
+ friend class Heat;
+ private:
+ //public:
PID(Platform* p, int8_t h);
- void Init();
- void Spin();
- void SetActiveTemperature(const float& t);
- float GetActiveTemperature();
- void SetStandbyTemperature(const float& t);
- float GetStandbyTemperature();
- void Activate();
- void Standby();
- bool Active();
- void ResetFault();
- float GetTemperature();
+ void Init(); // (Re)Set everything to start
+ void Spin(); // Called in a tight loop to keep things running
+ void SetActiveTemperature(const float& t); // Set the temperature required when working (Celsius)
+ float GetActiveTemperature(); // Get the active temperature
+ void SetStandbyTemperature(const float& t); // Set the temperature to use when idle (celsius)
+ float GetStandbyTemperature(); // Get the idle temperature
+ void Activate(); // Switch from idle to active
+ void Standby(); // Switch from active to idle
+ bool Active(); // Are we active?
+ void ResetFault(); // Reset a fault condition - only call this if you know what you are doing
+ float GetTemperature(); // Get the current temperature
- private:
+ // private:
- Platform* platform;
- float activeTemperature;
- float standbyTemperature;
- float temperature;
- float lastTemperature;
- float temp_iState;
- float temp_dState;
- bool active;
- int8_t heater;
- int8_t badTemperatureCount;
- bool temperatureFault;
+ Platform* platform; // The instance of the class that is the RepRap hardware
+ float activeTemperature; // The required active temperature
+ float standbyTemperature; // The required standby temperature
+ float temperature; // The current temperature
+ float lastTemperature; // The previous current temperature
+ float temp_iState; // The integral PID component
+ float temp_dState; // The derivative PID component
+ bool active; // Are we active or standby?
+ int8_t heater; // The index of our heater
+ int8_t badTemperatureCount; // Count of sequential dud readings
+ bool temperatureFault; // Has our heater developed a fault?
};
+/**
+ * The master class that controls all the heaters in the RepRap machine
+ */
+
class Heat
{
public:
Heat(Platform* p, GCodes* g);
- void Spin();
- void Init();
- void Exit();
- void SetActiveTemperature(int8_t heater, const float& t);
- float GetActiveTemperature(int8_t heater);
- void SetStandbyTemperature(int8_t heater, const float& t);
- float GetStandbyTemperature(int8_t heater);
- void Activate(int8_t heater);
- void Standby(int8_t heater);
- float GetTemperature(int8_t heater);
- void ResetFault(int8_t heater);
- bool AllHeatersAtSetTemperatures();
- void Diagnostics();
+ void Spin(); // Called in a tight loop to keep everything going
+ void Init(); // Set everything up
+ void Exit(); // Shut everything down
+ void SetActiveTemperature(int8_t heater, const float& t); // Set a heater's active temperature (celsius)
+ float GetActiveTemperature(int8_t heater); // What is a heater's active temperature?
+ void SetStandbyTemperature(int8_t heater, const float& t); // Set a heater's standby temperature (celsius)
+ float GetStandbyTemperature(int8_t heater); // What is a heater's standby temperature?
+ void Activate(int8_t heater); // Turn on a heater
+ void Standby(int8_t heater); // Set a heater idle
+ float GetTemperature(int8_t heater); // Get the temperature of a heater
+ void ResetFault(int8_t heater); // Reset a heater fault - oly call this if you know what you are doing
+ bool AllHeatersAtSetTemperatures(); // Is everything at temperature within tolerance?
+ void Diagnostics(); // Output useful information
private:
- Platform* platform;
- GCodes* gCodes;
- bool active;
- PID* pids[HEATERS];
- float lastTime;
- float longWait;
+ Platform* platform; // The instance of the RepRap hardware class
+ GCodes* gCodes; // The instance of the G Code interpreter class
+ bool active; // Are we active?
+ PID* pids[HEATERS]; // A PID controller for each heater
+ float lastTime; // The last time our Spin() was called
+ float longWait; // Long time for things that happen occasionally
};
diff --git a/Move.h b/Move.h
index f4126a6..0d09b3a 100644
--- a/Move.h
+++ b/Move.h
@@ -60,7 +60,12 @@ enum PointCoordinateSet
zSet = 4
};
-
+/**
+ * This class implements a look-ahead buffer for moves. It allows colinear
+ * moves not to decelerate between them, sets velocities at ends and beginnings
+ * for angled moves, and so on. Entries are joined in a doubly-linked list
+ * to form a ring buffer.
+ */
class LookAhead
{
public:
@@ -70,42 +75,45 @@ public:
protected:
LookAhead(Move* m, Platform* p, LookAhead* n);
- void Init(long ep[], float feedRate, float vv, bool ce, int8_t mt);
- LookAhead* Next();
- LookAhead* Previous();
- long* MachineEndPoints();
- float MachineToEndPoint(int8_t drive);
- static float MachineToEndPoint(int8_t drive, long coord);
- static long EndPointToMachine(int8_t drive, float coord);
- int8_t GetMovementType();
- float FeedRate();
- float V();
- void SetV(float vv);
- void SetFeedRate(float f);
- int8_t Processed();
- void SetProcessed(MovementState ms);
- void SetDriveCoordinateAndZeroEndSpeed(float a, int8_t drive);
- bool CheckEndStops();
- void Release();
+ void Init(long ep[], float feedRate, float vv, bool ce, int8_t mt); // Set up this move
+ LookAhead* Next(); // Next one in the ring
+ LookAhead* Previous(); // Previous one in the ring
+ long* MachineEndPoints(); // Endpoints of a move in machine coordinates
+ float MachineToEndPoint(int8_t drive); // Convert a move endpoint to real mm coordinates
+ static float MachineToEndPoint(int8_t drive, long coord); // Convert any number to a real coordinate
+ static long EndPointToMachine(int8_t drive, float coord); // Convert real mm to a machine coordinate
+ int8_t GetMovementType(); // What sort of move is this?
+ float FeedRate(); // How fast is the maximum speed for this move
+ float V(); // The speed at the end of the move
+ void SetV(float vv); // Set the end speed
+ void SetFeedRate(float f); // Set the desired feedrate
+ int8_t Processed(); // Where we are in the look-ahead prediction sequence
+ void SetProcessed(MovementState ms); // Set where we are the the look ahead processing
+ void SetDriveCoordinateAndZeroEndSpeed(float a, int8_t drive); // Force an end ppoint and st its speed to stopped
+ bool CheckEndStops(); // Are we checking endstops on this move?
+ void Release(); // This move has been processed and executed
private:
- Move* move;
- Platform* platform;
- LookAhead* next;
- LookAhead* previous;
- long endPoint[DRIVES+1]; // Should never use the +1, but safety first
- int8_t movementType;
- float Cosine();
- bool checkEndStops;
- float cosine;
- float v; // The feedrate we can actually do
- float feedRate; // The requested feedrate
- float instantDv;
- volatile int8_t processed;
+ Move* move; // The main movement control class
+ Platform* platform; // The RepRap machine
+ LookAhead* next; // Next entry in the ring
+ LookAhead* previous; // Previous entry in the ring
+ long endPoint[DRIVES+1]; // Machine coordinates of the endpoint. Should never use the +1, but safety first
+ int8_t movementType; // XY move, Z move, extruder only etc
+ float Cosine(); // The angle between the previous move and this one
+ bool checkEndStops; // Check endstops for this move
+ float cosine; // Store for the cosine value - the function uses lazy evaluation
+ float v; // The feedrate we can actually do
+ float feedRate; // The requested feedrate
+ float instantDv; // The slowest speed we can move at. > 0
+ volatile int8_t processed; // The stage in the look ahead process that this move is at.
};
-
+/**
+ * This implements an integer space machine coordinates Bressenham-style DDA to step the drives.
+ * DDAs are stored in a linked list forming a ring buffer.
+ */
class DDA
{
public:
@@ -115,80 +123,87 @@ public:
protected:
DDA(Move* m, Platform* p, DDA* n);
- MovementProfile Init(LookAhead* lookAhead, float& u, float& v);
- void Start(bool noTest);
- void Step();
- bool Active();
- DDA* Next();
- float InstantDv();
+ MovementProfile Init(LookAhead* lookAhead, float& u, float& v); // Set up the DDA. Also used experimentally in look ahead.
+ void Start(bool noTest); // Start executing the DDA. I.e. move the move.
+ void Step(); // Take one step of the DDA. Called by timed interrupt.
+ bool Active(); // Is the DDA running?
+ DDA* Next(); // Next entry in the ring
+ float InstantDv(); // The lowest speed that may be used
private:
- MovementProfile AccelerationCalculation(float& u, float& v, MovementProfile result);
- void SetXYAcceleration();
- void SetEAcceleration(float eDistance);
- Move* move;
- Platform* platform;
- DDA* next;
- LookAhead* myLookAheadEntry;
- long counter[DRIVES];
- long delta[DRIVES];
- bool directions[DRIVES];
- long totalSteps;
- long stepCount;
- bool checkEndStops;
- float timeStep;
- float velocity;
- long stopAStep;
- long startDStep;
- float distance;
- float acceleration;
- float instantDv;
- volatile bool active;
+ MovementProfile AccelerationCalculation(float& u, float& v, // Compute acceleration profiles
+ MovementProfile result);
+ void SetXYAcceleration(); // Compute an XY acceleration
+ void SetEAcceleration(float eDistance); // Compute an extruder acceleration
+
+ Move* move; // The main movement control class
+ Platform* platform; // The RepRap machine
+ DDA* next; // The next one in the ring
+ LookAhead* myLookAheadEntry; // The look-ahead entry corresponding to this DDA
+ long counter[DRIVES]; // Step counters
+ long delta[DRIVES]; // How far to move each drive
+ bool directions[DRIVES]; // Forwards or backwards?
+ long totalSteps; // Total number of steps for this move
+ long stepCount; // How many steps we have already taken
+ bool checkEndStops; // Are we checking endstops?
+ float timeStep; // The current timestep (seconds)
+ float velocity; // The current velocity
+ long stopAStep; // The stepcount at which we stop accelerating
+ long startDStep; // The stepcount at which we start decelerating
+ float distance; // How long is the move in real distance
+ float acceleration; // The acceleration to use
+ float instantDv; // The lowest possible velocity
+ volatile bool active; // Is the DDA running?
};
-
+/**
+ * This is the master movement class. It controls all movement in the machine.
+ */
class Move
{
public:
Move(Platform* p, GCodes* g);
- void Init();
- void Spin();
- void Exit();
- bool GetCurrentState(float m[]); // takes account of all the rings and delays
- void LiveCoordinates(float m[]); // Just gives the last point at the end of the last DDA
- void Interrupt();
- void InterruptTime();
- bool AllMovesAreFinished();
- void ResumeMoving();
- void DoLookAhead();
- void HitLowStop(int8_t drive, LookAhead* la, DDA* hitDDA);
- void HitHighStop(int8_t drive, LookAhead* la, DDA* hitDDA);
- void SetPositions(float move[]);
- void SetLiveCoordinates(float coords[]);
- void SetXBedProbePoint(int index, float x);
- void SetYBedProbePoint(int index, float y);
- void SetZBedProbePoint(int index, float z);
- float xBedProbePoint(int index);
- float yBedProbePoint(int index);
- float zBedProbePoint(int index);
- int NumberOfProbePoints();
- int NumberOfXYProbePoints();
- bool AllProbeCoordinatesSet(int index);
- bool XYProbeCoordinatesSet(int index);
- void SetZProbing(bool probing);
- void SetProbedBedEquation();
- float SecondDegreeTransformZ(float x, float y);
- float GetLastProbedZ();
- void SetAxisCompensation(int8_t axis, float tangent);
- void SetIdentityTransform();
- void Transform(float move[]);
- void InverseTransform(float move[]);
- void Diagnostics();
- float ComputeCurrentCoordinate(int8_t drive, LookAhead* la, DDA* runningDDA);
- void SetStepHypotenuse();
+ void Init(); // Start me up
+ void Spin(); // Called in a tight loop to keep the class going
+ void Exit(); // Shut down
+ bool GetCurrentState(float m[]); // Return the current position if possible. Send false otherwise
+ void LiveCoordinates(float m[]); // Gives the last point at the end of the last complete DDA
+ void Interrupt(); // The hardware's (i.e. platform's) interrupt should call this.
+ void InterruptTime(); // Test function - not used
+ bool AllMovesAreFinished(); // Is the look-ahead ring empty? Stops more moves being added as well.
+ void ResumeMoving(); // Allow moves to be added after a call to AllMovesAreFinished()
+ void DoLookAhead(); // Run the look-ahead procedure
+ void HitLowStop(int8_t drive, // What to do when a low endstop is hit
+ LookAhead* la, DDA* hitDDA);
+ void HitHighStop(int8_t drive, // What to do when a high endstop is hit
+ LookAhead* la, DDA* hitDDA);
+ void SetPositions(float move[]); // Force the coordinates to be these
+ void SetLiveCoordinates(float coords[]); // Force the live coordinates (see above) to be these
+ void SetXBedProbePoint(int index, float x); // Record the X coordinate of a probe point
+ void SetYBedProbePoint(int index, float y); // Record the Y coordinate of a probe point
+ void SetZBedProbePoint(int index, float z); // Record the Z coordinate of a probe point
+ float xBedProbePoint(int index); // Get the X coordinate of a probe point
+ float yBedProbePoint(int index); // Get the Y coordinate of a probe point
+ float zBedProbePoint(int index); // Get the Z coordinate of a probe point
+ int NumberOfProbePoints(); // How many points to probe have been set? 0 if incomplete
+ int NumberOfXYProbePoints(); // How many XY coordinates of probe points have been set (Zs may not have been probed yet)
+ bool AllProbeCoordinatesSet(int index); // XY, and Z all set for this one?
+ bool XYProbeCoordinatesSet(int index); // Just XY set for this one?
+ void SetZProbing(bool probing); // Set the Z probe live
+ void SetProbedBedEquation(); // When we have a full set of probed points, work out the bed's equation
+ float SecondDegreeTransformZ(float x, float y); // Used for second degree bed equation
+ float GetLastProbedZ(); // What was the Z when the probe last fired?
+ void SetAxisCompensation(int8_t axis, float tangent); // Set an axis-pair compensation angle
+ void SetIdentityTransform(); // Cancel the bed equation; does not reset axis angle compensation
+ void Transform(float move[]); // Take a position and apply the bed and the axis-angle compensations
+ void InverseTransform(float move[]); // Go from a transformed point back to user coordinates
+ void Diagnostics(); // Report useful stuff
+ float ComputeCurrentCoordinate(int8_t drive,// Turn a DDA value back into a real world coordinate
+ LookAhead* la, DDA* runningDDA);
+ void SetStepHypotenuse(); // Set up the hypotenuse lengths for multiple axis steps, like step both X and Y
friend class DDA;
diff --git a/RemoteSystemsTempFiles/.project b/RemoteSystemsTempFiles/.project
new file mode 100644
index 0000000..5447a64
--- /dev/null
+++ b/RemoteSystemsTempFiles/.project
@@ -0,0 +1,12 @@
+
+
+ RemoteSystemsTempFiles
+
+
+
+
+
+
+ org.eclipse.rse.ui.remoteSystemsTempNature
+
+