Abhinav Sinha 7 éve
commit
c3c0b8d2ab
100 módosított fájl, 5577 hozzáadás és 0 törlés
  1. 5 0
      Android App/.gitignore
  2. 1 0
      Android App/.idea/.name
  3. 23 0
      Android App/.idea/compiler.xml
  4. 3 0
      Android App/.idea/copyright/profiles_settings.xml
  5. 5 0
      Android App/.idea/encodings.xml
  6. 18 0
      Android App/.idea/gradle.xml
  7. 7 0
      Android App/.idea/misc.xml
  8. 10 0
      Android App/.idea/modules.xml
  9. 5 0
      Android App/.idea/scopes/scope_settings.xml
  10. 7 0
      Android App/.idea/vcs.xml
  11. 19 0
      Android App/RemoteCameraShutter.iml
  12. 1 0
      Android App/app/.gitignore
  13. 66 0
      Android App/app/app.iml
  14. 24 0
      Android App/app/build.gradle
  15. 17 0
      Android App/app/proguard-rules.pro
  16. 13 0
      Android App/app/src/androidTest/java/com/abhinav/personal/remotecamerashutter/ApplicationTest.java
  17. 21 0
      Android App/app/src/main/AndroidManifest.xml
  18. 36 0
      Android App/app/src/main/java/com/abhinav/personal/remotecamerashutter/Main.java
  19. BIN
      Android App/app/src/main/res/drawable-hdpi/ic_launcher.png
  20. BIN
      Android App/app/src/main/res/drawable-mdpi/ic_launcher.png
  21. BIN
      Android App/app/src/main/res/drawable-xhdpi/ic_launcher.png
  22. BIN
      Android App/app/src/main/res/drawable-xxhdpi/ic_launcher.png
  23. 16 0
      Android App/app/src/main/res/layout/activity_main.xml
  24. 8 0
      Android App/app/src/main/res/menu/main.xml
  25. 6 0
      Android App/app/src/main/res/values-w820dp/dimens.xml
  26. 5 0
      Android App/app/src/main/res/values/dimens.xml
  27. 8 0
      Android App/app/src/main/res/values/strings.xml
  28. 8 0
      Android App/app/src/main/res/values/styles.xml
  29. 19 0
      Android App/build.gradle
  30. 18 0
      Android App/gradle.properties
  31. BIN
      Android App/gradle/wrapper/gradle-wrapper.jar
  32. 6 0
      Android App/gradle/wrapper/gradle-wrapper.properties
  33. 164 0
      Android App/gradlew
  34. 90 0
      Android App/gradlew.bat
  35. 1 0
      Android App/settings.gradle
  36. BIN
      Launchprog_v1.2.zip
  37. BIN
      Mirf.zip
  38. BIN
      NRF24-1.14.zip
  39. 17 0
      NRF24_for_attiny/LICENSE
  40. 16 0
      NRF24_for_attiny/MANIFEST
  41. 25 0
      NRF24_for_attiny/Makefile
  42. 323 0
      NRF24_for_attiny/NRF24.cpp
  43. 193 0
      NRF24_for_attiny/NRF24.h
  44. 49 0
      NRF24_for_attiny/SoftSpi.cpp
  45. 79 0
      NRF24_for_attiny/SoftSpi.h
  46. 240 0
      NRF24_for_attiny/doc/NRF24_8h_source.html
  47. 62 0
      NRF24_for_attiny/doc/annotated.html
  48. BIN
      NRF24_for_attiny/doc/bc_s.png
  49. BIN
      NRF24_for_attiny/doc/bdwn.png
  50. 102 0
      NRF24_for_attiny/doc/classNRF24-members.html
  51. 145 0
      NRF24_for_attiny/doc/classNRF24.html
  52. 66 0
      NRF24_for_attiny/doc/classes.html
  53. BIN
      NRF24_for_attiny/doc/closed.png
  54. 273 0
      NRF24_for_attiny/doc/crazyflie_8ino-example.html
  55. 247 0
      NRF24_for_attiny/doc/crazyflie_client_8ino-example.html
  56. 1357 0
      NRF24_for_attiny/doc/doxygen.css
  57. BIN
      NRF24_for_attiny/doc/doxygen.png
  58. 97 0
      NRF24_for_attiny/doc/dynsections.js
  59. 69 0
      NRF24_for_attiny/doc/examples.html
  60. 61 0
      NRF24_for_attiny/doc/files.html
  61. BIN
      NRF24_for_attiny/doc/ftv2blank.png
  62. BIN
      NRF24_for_attiny/doc/ftv2cl.png
  63. BIN
      NRF24_for_attiny/doc/ftv2doc.png
  64. BIN
      NRF24_for_attiny/doc/ftv2folderclosed.png
  65. BIN
      NRF24_for_attiny/doc/ftv2folderopen.png
  66. BIN
      NRF24_for_attiny/doc/ftv2lastnode.png
  67. BIN
      NRF24_for_attiny/doc/ftv2link.png
  68. BIN
      NRF24_for_attiny/doc/ftv2mlastnode.png
  69. BIN
      NRF24_for_attiny/doc/ftv2mnode.png
  70. BIN
      NRF24_for_attiny/doc/ftv2mo.png
  71. BIN
      NRF24_for_attiny/doc/ftv2node.png
  72. BIN
      NRF24_for_attiny/doc/ftv2ns.png
  73. BIN
      NRF24_for_attiny/doc/ftv2plastnode.png
  74. BIN
      NRF24_for_attiny/doc/ftv2pnode.png
  75. BIN
      NRF24_for_attiny/doc/ftv2splitbar.png
  76. BIN
      NRF24_for_attiny/doc/ftv2vertline.png
  77. 231 0
      NRF24_for_attiny/doc/functions.html
  78. 69 0
      NRF24_for_attiny/doc/functions_enum.html
  79. 84 0
      NRF24_for_attiny/doc/functions_eval.html
  80. 204 0
      NRF24_for_attiny/doc/functions_func.html
  81. 42 0
      NRF24_for_attiny/doc/index.html
  82. 15 0
      NRF24_for_attiny/doc/jquery.js
  83. BIN
      NRF24_for_attiny/doc/nav_f.png
  84. BIN
      NRF24_for_attiny/doc/nav_g.png
  85. BIN
      NRF24_for_attiny/doc/nav_h.png
  86. 42 0
      NRF24_for_attiny/doc/nrf24_audio_rx_8pde-example.html
  87. 117 0
      NRF24_for_attiny/doc/nrf24_audio_tx_8pde-example.html
  88. 131 0
      NRF24_for_attiny/doc/nrf24_ping_client_8pde-example.html
  89. 112 0
      NRF24_for_attiny/doc/nrf24_ping_server_8pde-example.html
  90. 104 0
      NRF24_for_attiny/doc/nrf24_specan_8pde-example.html
  91. 94 0
      NRF24_for_attiny/doc/nrf24_test_8pde-example.html
  92. BIN
      NRF24_for_attiny/doc/open.png
  93. BIN
      NRF24_for_attiny/doc/sync_off.png
  94. BIN
      NRF24_for_attiny/doc/sync_on.png
  95. BIN
      NRF24_for_attiny/doc/tab_a.png
  96. BIN
      NRF24_for_attiny/doc/tab_b.png
  97. BIN
      NRF24_for_attiny/doc/tab_h.png
  98. BIN
      NRF24_for_attiny/doc/tab_s.png
  99. 60 0
      NRF24_for_attiny/doc/tabs.css
  100. 221 0
      NRF24_for_attiny/examples/crazyflie/crazyflie.ino

+ 5 - 0
Android App/.gitignore

@@ -0,0 +1,5 @@
+.gradle
+/local.properties
+/.idea/workspace.xml
+.DS_Store
+/build

+ 1 - 0
Android App/.idea/.name

@@ -0,0 +1 @@
+Remote Camera Shutter

+ 23 - 0
Android App/.idea/compiler.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CompilerConfiguration">
+    <option name="DEFAULT_COMPILER" value="Javac" />
+    <resourceExtensions />
+    <wildcardResourcePatterns>
+      <entry name="!?*.java" />
+      <entry name="!?*.form" />
+      <entry name="!?*.class" />
+      <entry name="!?*.groovy" />
+      <entry name="!?*.scala" />
+      <entry name="!?*.flex" />
+      <entry name="!?*.kt" />
+      <entry name="!?*.clj" />
+    </wildcardResourcePatterns>
+    <annotationProcessing>
+      <profile default="true" name="Default" enabled="false">
+        <processorPath useClasspath="true" />
+      </profile>
+    </annotationProcessing>
+  </component>
+</project>
+

+ 3 - 0
Android App/.idea/copyright/profiles_settings.xml

@@ -0,0 +1,3 @@
+<component name="CopyrightManager">
+  <settings default="" />
+</component>

+ 5 - 0
Android App/.idea/encodings.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding" useUTFGuessing="true" native2AsciiForPropertiesFiles="false" />
+</project>
+

+ 18 - 0
Android App/.idea/gradle.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="GradleSettings">
+    <option name="linkedExternalProjectsSettings">
+      <GradleProjectSettings>
+        <option name="distributionType" value="DEFAULT_WRAPPED" />
+        <option name="externalProjectPath" value="$PROJECT_DIR$" />
+        <option name="modules">
+          <set>
+            <option value="$PROJECT_DIR$" />
+            <option value="$PROJECT_DIR$/app" />
+          </set>
+        </option>
+      </GradleProjectSettings>
+    </option>
+  </component>
+</project>
+

+ 7 - 0
Android App/.idea/misc.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_6" assert-keyword="true" jdk-15="true" project-jdk-name="JDK" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/build/classes" />
+  </component>
+</project>
+

+ 10 - 0
Android App/.idea/modules.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/RemoteCameraShutter.iml" filepath="$PROJECT_DIR$/RemoteCameraShutter.iml" />
+      <module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
+    </modules>
+  </component>
+</project>
+

+ 5 - 0
Android App/.idea/scopes/scope_settings.xml

@@ -0,0 +1,5 @@
+<component name="DependencyValidationManager">
+  <state>
+    <option name="SKIP_IMPORT_STATEMENTS" value="false" />
+  </state>
+</component>

+ 7 - 0
Android App/.idea/vcs.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="" vcs="" />
+  </component>
+</project>
+

+ 19 - 0
Android App/RemoteCameraShutter.iml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" external.system.module.group="" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="java-gradle" name="Java-Gradle">
+      <configuration>
+        <option name="BUILD_FOLDER_PATH" value="$MODULE_DIR$/build" />
+      </configuration>
+    </facet>
+  </component>
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <excludeFolder url="file://$MODULE_DIR$/.gradle" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>
+

+ 1 - 0
Android App/app/.gitignore

@@ -0,0 +1 @@
+/build

+ 66 - 0
Android App/app/app.iml

@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" external.system.module.group="RemoteCameraShutter" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="android-gradle" name="Android-Gradle">
+      <configuration>
+        <option name="GRADLE_PROJECT_PATH" value=":app" />
+      </configuration>
+    </facet>
+    <facet type="android" name="Android">
+      <configuration>
+        <option name="SELECTED_BUILD_VARIANT" value="debug" />
+        <option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
+        <option name="COMPILE_JAVA_TASK_NAME" value="compileDebugJava" />
+        <option name="ASSEMBLE_TEST_TASK_NAME" value="assembleDebugTest" />
+        <option name="SOURCE_GEN_TASK_NAME" value="generateDebugSources" />
+        <option name="ALLOW_USER_CONFIGURATION" value="false" />
+        <option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
+        <option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
+        <option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res" />
+        <option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
+      </configuration>
+    </facet>
+  </component>
+  <component name="NewModuleRootManager" inherit-compiler-output="false">
+    <output url="file://$MODULE_DIR$/build/intermediates/classes/debug" />
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/debug" isTestSource="false" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/debug" isTestSource="false" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/debug" isTestSource="false" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/test/debug" isTestSource="true" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/test/debug" isTestSource="true" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/test/debug" isTestSource="true" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/test/debug" isTestSource="true" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/test/debug" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/debug/assets" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/assets" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates" />
+      <excludeFolder url="file://$MODULE_DIR$/build/outputs" />
+    </content>
+    <orderEntry type="jdk" jdkName="Android API 20 Platform" jdkType="Android SDK" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>
+

+ 24 - 0
Android App/app/build.gradle

@@ -0,0 +1,24 @@
+apply plugin: 'com.android.application'
+
+android {
+    compileSdkVersion 20
+    buildToolsVersion "20.0.0"
+
+    defaultConfig {
+        applicationId "com.abhinav.personal.remotecamerashutter"
+        minSdkVersion 14
+        targetSdkVersion 20
+        versionCode 1
+        versionName "1.0"
+    }
+    buildTypes {
+        release {
+            runProguard false
+            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+        }
+    }
+}
+
+dependencies {
+    compile fileTree(dir: 'libs', include: ['*.jar'])
+}

+ 17 - 0
Android App/app/proguard-rules.pro

@@ -0,0 +1,17 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in C:\Users\Abhinav\AppData\Local\Android\android-studio\sdk/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}

+ 13 - 0
Android App/app/src/androidTest/java/com/abhinav/personal/remotecamerashutter/ApplicationTest.java

@@ -0,0 +1,13 @@
+package com.abhinav.personal.remotecamerashutter;
+
+import android.app.Application;
+import android.test.ApplicationTestCase;
+
+/**
+ * <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
+ */
+public class ApplicationTest extends ApplicationTestCase<Application> {
+    public ApplicationTest() {
+        super(Application.class);
+    }
+}

+ 21 - 0
Android App/app/src/main/AndroidManifest.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.abhinav.personal.remotecamerashutter" >
+
+    <application
+        android:allowBackup="true"
+        android:icon="@drawable/ic_launcher"
+        android:label="@string/app_name"
+        android:theme="@style/AppTheme" >
+        <activity
+            android:name=".Main"
+            android:label="@string/app_name" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+
+</manifest>

+ 36 - 0
Android App/app/src/main/java/com/abhinav/personal/remotecamerashutter/Main.java

@@ -0,0 +1,36 @@
+package com.abhinav.personal.remotecamerashutter;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.Menu;
+import android.view.MenuItem;
+
+
+public class Main extends Activity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_main);
+    }
+
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        // Inflate the menu; this adds items to the action bar if it is present.
+        getMenuInflater().inflate(R.menu.main, menu);
+        return true;
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        // Handle action bar item clicks here. The action bar will
+        // automatically handle clicks on the Home/Up button, so long
+        // as you specify a parent activity in AndroidManifest.xml.
+        int id = item.getItemId();
+        if (id == R.id.action_settings) {
+            return true;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+}

BIN
Android App/app/src/main/res/drawable-hdpi/ic_launcher.png


BIN
Android App/app/src/main/res/drawable-mdpi/ic_launcher.png


BIN
Android App/app/src/main/res/drawable-xhdpi/ic_launcher.png


BIN
Android App/app/src/main/res/drawable-xxhdpi/ic_launcher.png


+ 16 - 0
Android App/app/src/main/res/layout/activity_main.xml

@@ -0,0 +1,16 @@
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:paddingLeft="@dimen/activity_horizontal_margin"
+    android:paddingRight="@dimen/activity_horizontal_margin"
+    android:paddingTop="@dimen/activity_vertical_margin"
+    android:paddingBottom="@dimen/activity_vertical_margin"
+    tools:context=".Main">
+
+    <TextView
+        android:text="@string/hello_world"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
+</RelativeLayout>

+ 8 - 0
Android App/app/src/main/res/menu/main.xml

@@ -0,0 +1,8 @@
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:context=".Main" >
+    <item android:id="@+id/action_settings"
+        android:title="@string/action_settings"
+        android:orderInCategory="100"
+        android:showAsAction="never" />
+</menu>

+ 6 - 0
Android App/app/src/main/res/values-w820dp/dimens.xml

@@ -0,0 +1,6 @@
+<resources>
+    <!-- Example customization of dimensions originally defined in res/values/dimens.xml
+         (such as screen margins) for screens with more than 820dp of available width. This
+         would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
+    <dimen name="activity_horizontal_margin">64dp</dimen>
+</resources>

+ 5 - 0
Android App/app/src/main/res/values/dimens.xml

@@ -0,0 +1,5 @@
+<resources>
+    <!-- Default screen margins, per the Android Design guidelines. -->
+    <dimen name="activity_horizontal_margin">16dp</dimen>
+    <dimen name="activity_vertical_margin">16dp</dimen>
+</resources>

+ 8 - 0
Android App/app/src/main/res/values/strings.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <string name="app_name">Remote Camera Shutter</string>
+    <string name="hello_world">Hello world!</string>
+    <string name="action_settings">Settings</string>
+
+</resources>

+ 8 - 0
Android App/app/src/main/res/values/styles.xml

@@ -0,0 +1,8 @@
+<resources>
+
+    <!-- Base application theme. -->
+    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
+        <!-- Customize your theme here. -->
+    </style>
+
+</resources>

+ 19 - 0
Android App/build.gradle

@@ -0,0 +1,19 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+    repositories {
+        jcenter()
+    }
+    dependencies {
+        classpath 'com.android.tools.build:gradle:0.12.+'
+
+        // NOTE: Do not place your application dependencies here; they belong
+        // in the individual module build.gradle files
+    }
+}
+
+allprojects {
+    repositories {
+        jcenter()
+    }
+}

+ 18 - 0
Android App/gradle.properties

@@ -0,0 +1,18 @@
+# Project-wide Gradle settings.
+
+# IDE (e.g. Android Studio) users:
+# Settings specified in this file will override any Gradle settings
+# configured through the IDE.
+
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+# Default value: -Xmx10248m -XX:MaxPermSize=256m
+# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
+
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true

BIN
Android App/gradle/wrapper/gradle-wrapper.jar


+ 6 - 0
Android App/gradle/wrapper/gradle-wrapper.properties

@@ -0,0 +1,6 @@
+#Wed Apr 10 15:27:10 PDT 2013
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=http\://services.gradle.org/distributions/gradle-1.12-all.zip

+ 164 - 0
Android App/gradlew

@@ -0,0 +1,164 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+    echo "$*"
+}
+
+die ( ) {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+esac
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched.
+if $cygwin ; then
+    [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+fi
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >&-
+APP_HOME="`pwd -P`"
+cd "$SAVED" >&-
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+    JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"

+ 90 - 0
Android App/gradlew.bat

@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega

+ 1 - 0
Android App/settings.gradle

@@ -0,0 +1 @@
+include ':app'

BIN
Launchprog_v1.2.zip


BIN
Mirf.zip


BIN
NRF24-1.14.zip


+ 17 - 0
NRF24_for_attiny/LICENSE

@@ -0,0 +1,17 @@
+This software is Copyright (C) 2008 Mike McCauley. Use is subject to license
+conditions. The main licensing options available are GPL V2 or Commercial:
+
+Open Source Licensing GPL V2
+
+This is the appropriate option if you want to share the source code of your
+application with everyone you distribute it to, and you also want to give them
+the right to share who uses it. If you wish to use this software under Open
+Source Licensing, you must contribute all your source code to the open source
+community in accordance with the GPL Version 2 when your application is
+distributed. See http://www.gnu.org/copyleft/gpl.html
+
+Commercial Licensing
+
+This is the appropriate option if you are creating proprietary applications
+and you are not prepared to distribute and share the source code of your
+application. Contact info@open.com.au for details.

+ 16 - 0
NRF24_for_attiny/MANIFEST

@@ -0,0 +1,16 @@
+NRF24/doc/*
+NRF24/project.cfg
+NRF24/LICENSE
+NRF24/Makefile
+NRF24/NRF24.cpp
+NRF24/NRF24.h
+NRF24/MANIFEST
+NRF24/keywords.txt
+NRF24/examples/nrf24_audio_rx/nrf24_audio_rx.pde
+NRF24/examples/nrf24_ping_client/nrf24_ping_client.pde
+NRF24/examples/nrf24_test/nrf24_test.pde
+NRF24/examples/nrf24_specan/nrf24_specan.pde
+NRF24/examples/nrf24_ping_server/nrf24_ping_server.pde
+NRF24/examples/nrf24_audio_tx/nrf24_audio_tx.pde
+NRF24/examples/crazyflie/crazyflie.ino
+NRF24/examples/crazyflie_client/crazyflie_client.ino

+ 25 - 0
NRF24_for_attiny/Makefile

@@ -0,0 +1,25 @@
+# Makefile
+#
+# Makefile for the Arduino NRF24 project
+#
+# Author: Mike McCauley (mikem@airspayce.com)
+# Copyright (C) 2011 Mike McCauley
+# $Id: Makefile,v 1.1 2012/12/12 11:17:16 mikem Exp mikem $
+
+PROJNAME = NRF24
+# Dont forget to also change the version at the top of NRF24.h:
+DISTFILE = $(PROJNAME)-1.14.zip
+
+all:	doxygen dist upload
+
+doxygen: 
+	doxygen project.cfg
+
+ci:
+	(cd ..;ci -l `cat $(PROJNAME)/MANIFEST`)
+
+dist:	
+	(cd ..; zip $(PROJNAME)/$(DISTFILE) `cat $(PROJNAME)/MANIFEST`)
+
+upload:
+	rsync -avz $(DISTFILE) doc/ www.airspayce.com:public_html/mikem/arduino/$(PROJNAME)

+ 323 - 0
NRF24_for_attiny/NRF24.cpp

@@ -0,0 +1,323 @@
+// NRF24.cpp
+//
+// Copyright (C) 2012 Mike McCauley
+// $Id: NRF24.cpp,v 1.2 2014/05/20 06:00:55 mikem Exp mikem $
+
+#include <NRF24.h>
+#include "SoftSpi.h"
+
+NRF24::NRF24(uint8_t chipEnablePin, uint8_t chipSelectPin)
+{
+    _configuration = NRF24_EN_CRC; // Default: 1 byte CRC enabled
+    _chipEnablePin = chipEnablePin;
+    _chipSelectPin = chipSelectPin;
+}
+
+boolean NRF24::init()
+{
+    // Initialise the slave select pin
+    pinMode(_chipEnablePin, OUTPUT);
+    digitalWrite(_chipEnablePin, LOW);
+    pinMode(_chipSelectPin, OUTPUT);
+    digitalWrite(_chipSelectPin, HIGH);
+  
+    // Added code to initilize the SPI interface and wait 100 ms
+    // to allow NRF24 device to "settle".  100 ms may be overkill.
+    pinMode(SCK, OUTPUT);
+    pinMode(MOSI, OUTPUT);
+    // Wait for NRF24 POR (up to 100msec)
+    delay(100);
+
+    // start the SPI library:
+    // Note the NRF24 wants mode 0, MSB first and default to 1 Mbps
+    SPI.begin();
+    SPI.setDataMode(SPI_MODE0);
+    SPI.setBitOrder(MSBFIRST);
+//    SPI.setClockDivider(SPI_2XCLOCK_MASK); // 1 MHz SPI clock
+    SPI.setClockDivider(SPI_CLOCK_DIV2); // 8MHz SPI clock
+
+    // Clear interrupts
+    if (!spiWriteRegister(NRF24_REG_07_STATUS, NRF24_RX_DR | NRF24_TX_DS | NRF24_MAX_RT))
+	return false; // Could not write to device. Not connected?
+
+    // Make sure we are powered down
+    powerDown();
+
+    // Flush FIFOs
+    flushTx();
+    flushRx();
+
+    return powerUpRx();
+}
+
+// Low level commands for interfacing with the device
+uint8_t NRF24::spiCommand(uint8_t command)
+{
+    digitalWrite(_chipSelectPin, LOW);
+    uint8_t status = SPI.transfer(command);
+    digitalWrite(_chipSelectPin, HIGH);
+    return status;
+}
+
+// Read and write commands
+uint8_t NRF24::spiRead(uint8_t command)
+{
+    digitalWrite(_chipSelectPin, LOW);
+    SPI.transfer(command); // Send the address, discard status
+    uint8_t val = SPI.transfer(0); // The MOSI value is ignored, value is read
+    digitalWrite(_chipSelectPin, HIGH);
+    return val;
+}
+
+uint8_t NRF24::spiWrite(uint8_t command, uint8_t val)
+{
+    digitalWrite(_chipSelectPin, LOW);
+    uint8_t status = SPI.transfer(command);
+    SPI.transfer(val); // New register value follows
+    digitalWrite(_chipSelectPin, HIGH);
+    return status;
+}
+
+void NRF24::spiBurstRead(uint8_t command, uint8_t* dest, uint8_t len)
+{
+    digitalWrite(_chipSelectPin, LOW);
+    SPI.transfer(command); // Send the start address, discard status
+    while (len--)
+	*dest++ = SPI.transfer(0); // The MOSI value is ignored, value is read
+    digitalWrite(_chipSelectPin, HIGH);
+    // 300 microsecs for 32 octet payload
+}
+
+uint8_t NRF24::spiBurstWrite(uint8_t command, uint8_t* src, uint8_t len)
+{
+    digitalWrite(_chipSelectPin, LOW);
+    uint8_t status = SPI.transfer(command);
+    while (len--)
+	SPI.transfer(*src++);
+    digitalWrite(_chipSelectPin, HIGH);
+    return status;
+}
+
+// Use the register commands to read and write the registers
+uint8_t NRF24::spiReadRegister(uint8_t reg)
+{
+    return spiRead((reg & NRF24_REGISTER_MASK) | NRF24_COMMAND_R_REGISTER);
+}
+
+uint8_t NRF24::spiWriteRegister(uint8_t reg, uint8_t val)
+{
+    return spiWrite((reg & NRF24_REGISTER_MASK) | NRF24_COMMAND_W_REGISTER, val);
+}
+
+void NRF24::spiBurstReadRegister(uint8_t reg, uint8_t* dest, uint8_t len)
+{
+    return spiBurstRead((reg & NRF24_REGISTER_MASK) | NRF24_COMMAND_R_REGISTER, dest, len);
+}
+
+uint8_t NRF24::spiBurstWriteRegister(uint8_t reg, uint8_t* src, uint8_t len)
+{
+    return spiBurstWrite((reg & NRF24_REGISTER_MASK) | NRF24_COMMAND_W_REGISTER, src, len);
+}
+
+uint8_t NRF24::statusRead()
+{
+    return spiReadRegister(NRF24_REG_07_STATUS);
+//    return spiCommand(NRF24_COMMAND_NOP); // Side effect is to read status
+}
+
+uint8_t NRF24::flushTx()
+{
+    return spiCommand(NRF24_COMMAND_FLUSH_TX);
+}
+
+uint8_t NRF24::flushRx()
+{
+    return spiCommand(NRF24_COMMAND_FLUSH_RX);
+}
+
+boolean NRF24::setChannel(uint8_t channel)
+{
+    spiWriteRegister(NRF24_REG_05_RF_CH, channel & NRF24_RF_CH);
+    return true;
+}
+boolean NRF24::setConfiguration(uint8_t configuration)
+{
+    _configuration = configuration;
+    return true;
+}
+
+boolean NRF24::setPipeAddress(uint8_t pipe, uint8_t* address, uint8_t len)
+{
+    spiBurstWriteRegister(NRF24_REG_0A_RX_ADDR_P0 + pipe, address, len);
+    return true;
+}
+
+boolean NRF24::setRetry(uint8_t delay, uint8_t count)
+{
+    spiWriteRegister(NRF24_REG_04_SETUP_RETR, ((delay << 4) & NRF24_ARD) | (count & NRF24_ARC));
+    return true;
+}
+
+boolean NRF24::setThisAddress(uint8_t* address, uint8_t len)
+{
+    // Set pipe 1 for this address
+    setPipeAddress(1, address, len); 
+    // RX_ADDR_P2 is set to RX_ADDR_P1 with the LSbyte set to 0xff, for use as a broadcast address
+    return true;
+}
+
+boolean NRF24::setTransmitAddress(uint8_t* address, uint8_t len)
+{
+    // Set both TX_ADDR and RX_ADDR_P0 for auto-ack with Enhanced shockwave
+    spiBurstWriteRegister(NRF24_REG_0A_RX_ADDR_P0, address, len);
+    spiBurstWriteRegister(NRF24_REG_10_TX_ADDR, address, len);
+    return true;
+}
+
+boolean NRF24::setPayloadSize(uint8_t size)
+{
+    spiWriteRegister(NRF24_REG_11_RX_PW_P0, size);
+    spiWriteRegister(NRF24_REG_12_RX_PW_P1, size);
+    return true;
+}
+
+boolean NRF24::setRF(uint8_t data_rate, uint8_t power)
+{    
+    uint8_t value = (power << 1) & NRF24_PWR;
+    // Ugly mapping of data rates to noncontiguous 2 bits:
+    if (data_rate == NRF24DataRate250kbps)
+	value |= NRF24_RF_DR_LOW;
+    else if (data_rate == NRF24DataRate2Mbps)
+	value |= NRF24_RF_DR_HIGH;
+    // else NRF24DataRate1Mbps, 00
+    spiWriteRegister(NRF24_REG_06_RF_SETUP, value);
+
+    if (data_rate == NRF24DataRate250kbps)
+	spiWriteRegister(NRF24_REG_04_SETUP_RETR, 0x43); // 1250usecs, 3 retries
+    else
+	spiWriteRegister(NRF24_REG_04_SETUP_RETR, 0x03); // 250us, 3 retries
+	
+    return true;
+}
+
+boolean NRF24::powerDown()
+{
+    spiWriteRegister(NRF24_REG_00_CONFIG, _configuration);
+    digitalWrite(_chipEnablePin, LOW);
+    return true;
+}
+
+boolean NRF24::powerUpRx()
+{
+    boolean status = spiWriteRegister(NRF24_REG_00_CONFIG, _configuration | NRF24_PWR_UP | NRF24_PRIM_RX);
+    digitalWrite(_chipEnablePin, HIGH);
+    return status;
+}
+
+boolean NRF24::powerUpTx()
+{
+    // Its the pulse high that puts us into TX mode
+    digitalWrite(_chipEnablePin, LOW);
+    boolean status = spiWriteRegister(NRF24_REG_00_CONFIG, _configuration | NRF24_PWR_UP);
+    digitalWrite(_chipEnablePin, HIGH);
+    return status;
+}
+
+boolean NRF24::send(uint8_t* data, uint8_t len, boolean noack)
+{
+    powerUpTx();
+    spiBurstWrite(noack ? NRF24_COMMAND_W_TX_PAYLOAD_NOACK : NRF24_COMMAND_W_TX_PAYLOAD, data, len);
+    // Radio will return to Standby II mode after transmission is complete
+    return true;
+}
+
+boolean NRF24::waitPacketSent()
+{
+    // If we are currently in receive mode, then there is no packet to wait for
+    if (spiReadRegister(NRF24_REG_00_CONFIG) & NRF24_PRIM_RX)
+	return false;
+
+    // Wait for either the Data Sent or Max ReTries flag, signalling the 
+    // end of transmission
+    uint8_t status;
+    while (!((status = statusRead()) & (NRF24_TX_DS | NRF24_MAX_RT)))
+	;
+
+    // Must clear NRF24_MAX_RT if it is set, else no further comm
+    spiWriteRegister(NRF24_REG_07_STATUS, NRF24_TX_DS | NRF24_MAX_RT);
+    if (status & NRF24_MAX_RT)
+	flushTx();
+    // Return true if data sent, false if MAX_RT
+    return status & NRF24_TX_DS;
+}
+
+boolean NRF24::isSending()
+{
+    return !(spiReadRegister(NRF24_REG_00_CONFIG) & NRF24_PRIM_RX) && !(statusRead() & (NRF24_TX_DS | NRF24_MAX_RT));
+}
+
+boolean NRF24::printRegisters()
+{
+    /*uint8_t registers[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0d, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x1c, 0x1d};
+
+    uint8_t i;
+    for (i = 0; i < sizeof(registers); i++)
+    {
+	Serial.print(i, HEX);
+	Serial.print(": ");
+	Serial.println(spiReadRegister(i), HEX);
+    }
+    */
+    return true;
+
+}
+
+boolean NRF24::available()
+{
+    if (spiReadRegister(NRF24_REG_17_FIFO_STATUS) & NRF24_RX_EMPTY)
+	return false;
+    // Manual says that messages > 32 octets should be discarded
+    if (spiRead(NRF24_COMMAND_R_RX_PL_WID) > 32)
+    {
+	flushRx();
+	return false;
+    }
+    return true;
+}
+
+void NRF24::waitAvailable()
+{
+    powerUpRx();
+    while (!available())
+	;
+}
+
+// Blocks until a valid message is received or timeout expires
+// Return true if there is a message available
+// Works correctly even on millis() rollover
+bool NRF24::waitAvailableTimeout(uint16_t timeout)
+{
+    powerUpRx();
+    unsigned long starttime = millis();
+    while ((millis() - starttime) < timeout)
+        if (available())
+           return true;
+    return false;
+}
+
+boolean NRF24::recv(uint8_t* buf, uint8_t* len)
+{
+    // Clear read interrupt
+    spiWriteRegister(NRF24_REG_07_STATUS, NRF24_RX_DR);
+
+    // 0 microsecs @ 8MHz SPI clock
+    if (!available())
+	return false;
+    // 32 microsecs (if immediately available)
+    *len = spiRead(NRF24_COMMAND_R_RX_PL_WID);
+    // 44 microsecs
+    spiBurstRead(NRF24_COMMAND_R_RX_PAYLOAD, buf, *len);
+    // 140 microsecs (32 octet payload)
+
+    return true;
+}

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 193 - 0
NRF24_for_attiny/NRF24.h


+ 49 - 0
NRF24_for_attiny/SoftSpi.cpp

@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2010 by Cristian Maglie <c.maglie@bug.st>
+ * SPI Master library for arduino.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of either the GNU General Public License version 2
+ * or the GNU Lesser General Public License version 2.1, both as
+ * published by the Free Software Foundation.
+ */
+#include <Arduino.h>
+#include "pins_arduino.h"
+#include "SoftSpi.h"
+
+SoftSpi SPI;
+
+void SoftSpi::begin() {
+
+  // Set SS to high so a connected chip will be "deselected" by default
+  digitalWrite(SS, HIGH);
+
+  // When the SS pin is set as OUTPUT, it can be used as
+  // a general purpose output port (it doesn't influence
+  // SPI operations).
+  pinMode(SS, OUTPUT);
+
+  // Set direction register for SCK and MOSI pin.
+  // MISO pin automatically overrides to INPUT.
+  // By doing this AFTER enabling SPI, we avoid accidentally
+  // clocking in a single bit since the lines go directly
+  // from "input" to SPI control.  
+  // http://code.google.com/p/arduino/issues/detail?id=888
+  digitalWrite(SCK, LOW);
+  pinMode(SCK, OUTPUT);
+  pinMode(MOSI, OUTPUT);
+  pinMode(MISO, INPUT);
+}
+
+
+void SoftSpi::end() {
+}
+
+void SoftSpi::setBitOrder(uint8_t bitOrder){
+}
+
+void SoftSpi::setDataMode(uint8_t mode){
+}
+
+void SoftSpi::setClockDivider(uint8_t rate){
+}

+ 79 - 0
NRF24_for_attiny/SoftSpi.h

@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2010 by Cristian Maglie <c.maglie@bug.st>
+ * SPI Master library for arduino.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of either the GNU General Public License version 2
+ * or the GNU Lesser General Public License version 2.1, both as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef _SPI_H_INCLUDED
+#define _SPI_H_INCLUDED
+#define MOSI 0
+#define MISO 1
+#define SCK 2
+#define SS 3
+
+//pointless defines
+#define SPI_CLOCK_DIV4 0x00
+#define SPI_CLOCK_DIV16 0x01
+#define SPI_CLOCK_DIV64 0x02
+#define SPI_CLOCK_DIV128 0x03
+#define SPI_CLOCK_DIV2 0x04
+#define SPI_CLOCK_DIV8 0x05
+#define SPI_CLOCK_DIV32 0x06
+//#define SPI_CLOCK_DIV64 0x07
+
+#define SPI_MODE0 0x00
+#define SPI_MODE1 0x04
+#define SPI_MODE2 0x08
+#define SPI_MODE3 0x0C
+
+#define SPI_MODE_MASK 0x0C  // CPOL = bit 3, CPHA = bit 2 on SPCR
+#define SPI_CLOCK_MASK 0x03  // SPR1 = bit 1, SPR0 = bit 0 on SPCR
+#define SPI_2XCLOCK_MASK 0x01  // SPI2X = bit 0 on SPSR
+
+
+
+class SoftSpi {
+public:
+  inline static byte transfer(byte _data);
+
+  // SPI Configuration methods
+
+  inline static void attachInterrupt();
+  inline static void detachInterrupt(); // Default
+
+  static void begin(); // Default
+  static void end();
+
+  static void setBitOrder(uint8_t);
+  static void setDataMode(uint8_t);
+  static void setClockDivider(uint8_t);
+};
+
+extern SoftSpi SPI;
+
+byte SoftSpi::transfer(byte data) {
+  unsigned char bit = 0;
+  for(bit = 0; bit < 8; bit++)          // Loop through 8 bits
+  {
+    if(data & 0x80) digitalWrite(MOSI,HIGH);   // If bit(7) of "data" is high
+    else digitalWrite(MOSI,LOW);          // if bit(7) of "data" is low
+    digitalWrite(SCK,HIGH);                  // Serial Clock Rising Edge 
+    data <<= 1;                             // Shift "data" to the left by one bit
+    if(digitalRead(MISO)==HIGH) data |= 0x01;    // If bit of slave data is high
+    else data &= ~0x01;                  // if bit of slave data is low
+    digitalWrite(SCK,LOW);              // Serial Clock Falling Edge
+  }
+  return data;                      // Returns shifted data in value
+}
+
+void SoftSpi::attachInterrupt() {
+}
+
+void SoftSpi::detachInterrupt() {
+}
+
+#endif

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 240 - 0
NRF24_for_attiny/doc/NRF24_8h_source.html


+ 62 - 0
NRF24_for_attiny/doc/annotated.html

@@ -0,0 +1,62 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.5"/>
+<title>NRF24: Class List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">NRF24
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.5 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="annotated.html"><span>Class&#160;List</span></a></li>
+      <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+    </ul>
+  </div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">Class List</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here are the classes, structs, unions and interfaces with brief descriptions:</div><div class="directory">
+<table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classNRF24.html" target="_self">NRF24</a></td><td class="desc">Send and receive addressed, reliable, acknowledged datagrams by nRF24L01 </td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.5
+</small></address>
+</body>
+</html>

BIN
NRF24_for_attiny/doc/bc_s.png


BIN
NRF24_for_attiny/doc/bdwn.png


+ 102 - 0
NRF24_for_attiny/doc/classNRF24-members.html

@@ -0,0 +1,102 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.5"/>
+<title>NRF24: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">NRF24
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.5 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+      <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+    </ul>
+  </div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">NRF24 Member List</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classNRF24.html">NRF24</a>, including all inherited members.</p>
+<table class="directory">
+  <tr class="even"><td class="entry"><a class="el" href="classNRF24.html#a84a25d5654902ed6b69d3a0de9422cfd">available</a>()</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="classNRF24.html#a9d3d0d432b09d3403a52aa9a78d3f848">flushRx</a>()</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="classNRF24.html#a644f3b4fd446438fb340b52df4216ba9">flushTx</a>()</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="classNRF24.html#a6e98cf508939240c1805245170a995f6">init</a>()</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="classNRF24.html#aaff7453d951c74e87ca845e708742252">isSending</a>()</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="classNRF24.html#ab0eb09c01f73bee4ff6935c0503a8ace">NRF24</a>(uint8_t chipEnablePin=8, uint8_t chipSelectPin=SS)</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="classNRF24.html#a52d7af9188397d4a6f5dab55d4f04742">NRF24DataRate</a> enum name</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="classNRF24.html#a52d7af9188397d4a6f5dab55d4f04742a774c99f9cf1c98cb883d4a01c1444c52">NRF24DataRate1Mbps</a> enum value</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="classNRF24.html#a52d7af9188397d4a6f5dab55d4f04742ae4523002495ee537f2731b61a220e3af">NRF24DataRate250kbps</a> enum value</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="classNRF24.html#a52d7af9188397d4a6f5dab55d4f04742aca0c89dd1b40bdc57b7026d8da54de9a">NRF24DataRate2Mbps</a> enum value</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="classNRF24.html#a8386e81a9a4b824ab26e785879684c7e">NRF24TransmitPower</a> enum name</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="classNRF24.html#a8386e81a9a4b824ab26e785879684c7eacef1d6c037e276e6dadaff2b6056ec0c">NRF24TransmitPower0dBm</a> enum value</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="classNRF24.html#a8386e81a9a4b824ab26e785879684c7eacce8a36a9753c7c125ad6db450ddfff8">NRF24TransmitPowerm12dBm</a> enum value</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="classNRF24.html#a8386e81a9a4b824ab26e785879684c7ea4790420d436218aa3bf4c23687664853">NRF24TransmitPowerm18dBm</a> enum value</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="classNRF24.html#a8386e81a9a4b824ab26e785879684c7eaf8351d714335d0c24bcbb8d3c983d5c7">NRF24TransmitPowerm6dBm</a> enum value</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="classNRF24.html#a5f40f4c8dcb3b5e097510dc6396c7f9b">powerDown</a>()</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="classNRF24.html#a9e15babbfa487da3425b19c60a93c057">powerUpRx</a>()</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="classNRF24.html#a796cb1901211284a958197d657d6f164">powerUpTx</a>()</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="classNRF24.html#ab6b14a05c78e40f0491793dcb73c8274">printRegisters</a>()</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="classNRF24.html#a12799e0afcb52f2a8cb7418dca9e0eab">recv</a>(uint8_t *buf, uint8_t *len)</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="classNRF24.html#aad280539b80b28e55ab3187714bc7f2f">send</a>(uint8_t *data, uint8_t len, boolean noack=false)</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="classNRF24.html#a3fa90005f98eb2744a533899f9b7e023">setChannel</a>(uint8_t channel)</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="classNRF24.html#a790d69e5cb1039fb2924f9405e30e250">setConfiguration</a>(uint8_t configuration)</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="classNRF24.html#adb2fbd1d1aadaad1e9b268508149b6c8">setPayloadSize</a>(uint8_t size)</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="classNRF24.html#a28b29969592f9f59c267ae7ffa020b2b">setPipeAddress</a>(uint8_t pipe, uint8_t *address, uint8_t len)</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="classNRF24.html#a1ac9bfce3833725b8b66d9875a8bc00e">setRetry</a>(uint8_t delay, uint8_t count=3)</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="classNRF24.html#a3453db8390d5be4aa99d8c7fde3062a4">setRF</a>(uint8_t data_rate, uint8_t power)</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="classNRF24.html#ade21e0bd4f92d0dfa45909bbbb0e4b01">setThisAddress</a>(uint8_t *address, uint8_t len)</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="classNRF24.html#a7b40c4c481bddf343acdac5179fddc75">setTransmitAddress</a>(uint8_t *address, uint8_t len)</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="classNRF24.html#a448aad6cda19f068009106aa5f6a7e6a">spiBurstRead</a>(uint8_t command, uint8_t *dest, uint8_t len)</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="classNRF24.html#abc48bb5a86d0bb498c753dc47cea8daa">spiBurstReadRegister</a>(uint8_t reg, uint8_t *dest, uint8_t len)</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="classNRF24.html#a01161d0ba54c409e62ad670b9eceb73d">spiBurstWrite</a>(uint8_t command, uint8_t *src, uint8_t len)</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="classNRF24.html#a8562055be6ba65ca8fc292be5f8abc5a">spiBurstWriteRegister</a>(uint8_t reg, uint8_t *src, uint8_t len)</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="classNRF24.html#a08ae66610a928a779c0b256e782128b5">spiCommand</a>(uint8_t command)</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="classNRF24.html#ab2f002c33ec719dfdd3ae70d70559254">spiRead</a>(uint8_t command)</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="classNRF24.html#a264f427858362e106705d92152bc634e">spiReadRegister</a>(uint8_t reg)</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="classNRF24.html#a16f168ffe059120ba696936cd6bd76f1">spiWrite</a>(uint8_t command, uint8_t val)</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="classNRF24.html#a81931bc1679b213b1cb1ae65b8357985">spiWriteRegister</a>(uint8_t reg, uint8_t val)</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="classNRF24.html#a9940479d33d554cab35d50b99112a166">statusRead</a>()</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="classNRF24.html#a5260f3e5eeb911e720290e652f628ab5">waitAvailable</a>()</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="classNRF24.html#ae36ca859ea942a6e9480e8747a27921e">waitAvailableTimeout</a>(uint16_t timeout)</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="classNRF24.html#a78a011cddedb14b8764ad5ea760c28ae">waitPacketSent</a>()</td><td class="entry"><a class="el" href="classNRF24.html">NRF24</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.5
+</small></address>
+</body>
+</html>

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 145 - 0
NRF24_for_attiny/doc/classNRF24.html


+ 66 - 0
NRF24_for_attiny/doc/classes.html

@@ -0,0 +1,66 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.5"/>
+<title>NRF24: Class Index</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">NRF24
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.5 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+      <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+    </ul>
+  </div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">Class Index</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="qindex"><a class="qindex" href="#letter_N">N</a></div>
+<table style="margin: 10px; white-space: nowrap;" align="center" width="95%" border="0" cellspacing="0" cellpadding="0">
+<tr><td rowspan="2" valign="bottom"><a name="letter_N"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;N&#160;&#160;</div></td></tr></table>
+</td><td></td></tr>
+<tr><td></td></tr>
+<tr><td valign="top"><a class="el" href="classNRF24.html">NRF24</a>&#160;&#160;&#160;</td><td></td></tr>
+<tr><td></td><td></td></tr>
+</table>
+<div class="qindex"><a class="qindex" href="#letter_N">N</a></div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.5
+</small></address>
+</body>
+</html>

BIN
NRF24_for_attiny/doc/closed.png


+ 273 - 0
NRF24_for_attiny/doc/crazyflie_8ino-example.html

@@ -0,0 +1,273 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.5"/>
+<title>NRF24: crazyflie.ino</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">NRF24
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.5 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">crazyflie.ino</div>  </div>
+</div><!--header-->
+<div class="contents">
+<p>This sketch act like a Crazyflie quadcopter <a href="http://www.bitcraze.se/">http://www.bitcraze.se/</a> using the CRTP radiolink protocol: <a href="http://wiki.bitcraze.se/projects:crazyflie:firmware:comm_protocol">http://wiki.bitcraze.se/projects:crazyflie:firmware:comm_protocol</a></p>
+<div class="fragment"><div class="line"><span class="comment">// crazyflie.pde</span></div>
+<div class="line"><span class="comment">// -*- mode: C++ -*-</span></div>
+<div class="line"><span class="comment">//</span></div>
+<div class="line"><span class="comment">// This sketch act like a Crazyflie quadcopter http://www.bitcraze.se/</span></div>
+<div class="line"><span class="comment">// using the CRTP radiolink protocol:</span></div>
+<div class="line"><span class="comment">// http://wiki.bitcraze.se/projects:crazyflie:firmware:comm_protocol</span></div>
+<div class="line"><span class="comment">//</span></div>
+<div class="line"><span class="comment">// Requires </span></div>
+<div class="line"><span class="comment">// - NRF24 radio module such as the sparkfun WRL-00691 http://www.sparkfun.com/products/691</span></div>
+<div class="line"><span class="comment">// - Arduino such as Uno</span></div>
+<div class="line"><span class="comment">// - A Crazyflie transmitter, such as the Carzyflie PC client+CrazyRadio module</span></div>
+<div class="line"><span class="comment">// or</span></div>
+<div class="line"><span class="comment">// the NRF24 crazyflie client part of the NRF24 library</span></div>
+<div class="line"><span class="comment">//</span></div>
+<div class="line"><span class="comment">// Uses NRF24 library to comunicate with the Crazyflie, </span></div>
+<div class="line"><span class="comment">// http://www.airspayce.com/mikem/arduino/NRF24</span></div>
+<div class="line"><span class="comment">//</span></div>
+<div class="line"><span class="comment">// Receives and decodes varion message types from teh Crazyflie transmitter, although</span></div>
+<div class="line"><span class="comment">// only the link echo and commander messages are fully implemented</span></div>
+<div class="line"><span class="comment">//</span></div>
+<div class="line"><span class="comment">// Author: Mike McCauley</span></div>
+<div class="line"><span class="comment">// Copyright (C) 2012 Mike McCauley</span></div>
+<div class="line"></div>
+<div class="line"><span class="preprocessor">#include &lt;NRF24.h&gt;</span></div>
+<div class="line"><span class="preprocessor">#include &lt;SPI.h&gt;</span></div>
+<div class="line"></div>
+<div class="line"><span class="comment">// Structure of Crazyflie commander messages</span></div>
+<div class="line"><span class="preprocessor">#pragma pack(1);</span></div>
+<div class="line"><span class="preprocessor"></span><span class="keyword">typedef</span> <span class="keyword">struct </span></div>
+<div class="line">{</div>
+<div class="line">  <span class="keywordtype">float</span> roll;</div>
+<div class="line">  <span class="keywordtype">float</span> pitch;</div>
+<div class="line">  <span class="keywordtype">float</span> yaw;</div>
+<div class="line">  uint16_t thrust;</div>
+<div class="line">} CommanderCrtpValues;</div>
+<div class="line"><span class="preprocessor">#pragma pack()</span></div>
+<div class="line"><span class="preprocessor"></span></div>
+<div class="line"><span class="comment">// Useful macros for CRTP message contents and formatting</span></div>
+<div class="line"><span class="preprocessor">#define CRTP_HEADER(port, channel) (((port &amp; 0x0F) &lt;&lt; 4) | (channel &amp; 0x0F))</span></div>
+<div class="line"><span class="preprocessor"></span><span class="preprocessor">#define CRTP_HEADER_PORT(h) ((h &gt;&gt; 4) &amp; 0xf)</span></div>
+<div class="line"><span class="preprocessor"></span><span class="preprocessor">#define CRTP_HEADER_CHANNEL(h) (h &amp; 0x3)</span></div>
+<div class="line"><span class="preprocessor"></span></div>
+<div class="line"><span class="comment">// Param channels</span></div>
+<div class="line"><span class="preprocessor">#define PARAM_TOC_CH 0</span></div>
+<div class="line"><span class="preprocessor"></span><span class="preprocessor">#define PARAM_READ_CH 1</span></div>
+<div class="line"><span class="preprocessor"></span><span class="preprocessor">#define PARAM_WRITE_CH 2</span></div>
+<div class="line"><span class="preprocessor"></span></div>
+<div class="line"><span class="comment">// Log channels</span></div>
+<div class="line"><span class="preprocessor">#define LOG_TOC_CH 0</span></div>
+<div class="line"><span class="preprocessor"></span><span class="preprocessor">#define LOG_CONTROL_CH 1</span></div>
+<div class="line"><span class="preprocessor"></span><span class="preprocessor">#define LOG_LOG_CH 2</span></div>
+<div class="line"><span class="preprocessor"></span><span class="comment">// Log packet parameters storage</span></div>
+<div class="line"><span class="preprocessor">#define LOG_MAX_OPS 64</span></div>
+<div class="line"><span class="preprocessor"></span><span class="preprocessor">#define LOG_MAX_BLOCKS 8</span></div>
+<div class="line"><span class="preprocessor"></span></div>
+<div class="line"><span class="comment">// Port definitions</span></div>
+<div class="line"><span class="keyword">typedef</span> <span class="keyword">enum</span> {</div>
+<div class="line">  CRTP_PORT_CONSOLE     = 0x00,</div>
+<div class="line">  CRTP_PORT_PARAM       = 0x02,</div>
+<div class="line">  CRTP_PORT_COMMANDER   = 0x03,</div>
+<div class="line">  CRTP_PORT_LOG         = 0x05,</div>
+<div class="line">  CRTP_PORT_LINK        = 0x0F,</div>
+<div class="line">} CRTPPort;</div>
+<div class="line"></div>
+<div class="line"><span class="comment">// Common command numbers</span></div>
+<div class="line"><span class="preprocessor">#define CMD_GET_ITEM 0</span></div>
+<div class="line"><span class="preprocessor"></span><span class="preprocessor">#define CMD_GET_INFO 1</span></div>
+<div class="line"><span class="preprocessor"></span></div>
+<div class="line"><span class="comment">// Singleton instance of the radio</span></div>
+<div class="line"><a name="_a0"></a><a class="code" href="classNRF24.html">NRF24</a> nrf24;</div>
+<div class="line"><span class="comment">// NRF24 nrf24(8, 7); // use this to be electrically compatible with Mirf</span></div>
+<div class="line"><span class="comment">// NRF24 nrf24(8, 10);// For Leonardo, need explicit SS pin</span></div>
+<div class="line"></div>
+<div class="line"><span class="comment">// The address to use for this Crazyflie</span></div>
+<div class="line">uint8_t address[] = { 0xe7, 0xe7, 0xe7, 0xe7, 0xe7 };</div>
+<div class="line"></div>
+<div class="line"><span class="keywordtype">void</span> setup() </div>
+<div class="line">{</div>
+<div class="line">  Serial.begin(115200);</div>
+<div class="line">  <span class="keywordflow">while</span> (!Serial)</div>
+<div class="line">    ; <span class="comment">// Wait for serial port, only required for Leonardo</span></div>
+<div class="line"></div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a1"></a><a class="code" href="classNRF24.html#a6e98cf508939240c1805245170a995f6">init</a>())</div>
+<div class="line">    Serial.println(<span class="stringliteral">&quot;NRF24 init failed&quot;</span>);</div>
+<div class="line"></div>
+<div class="line">  <span class="comment">// Be Crazyflie radiolink compatible</span></div>
+<div class="line">  <span class="comment">// We use the NRF24 library for convenience, but</span></div>
+<div class="line">  <span class="comment">// we use a different configuration to the default NRF24</span></div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a2"></a><a class="code" href="classNRF24.html#a3fa90005f98eb2744a533899f9b7e023">setChannel</a>(13))</div>
+<div class="line">     Serial.println(<span class="stringliteral">&quot;setChannel failed&quot;</span>);</div>
+<div class="line">  <span class="comment">// Set data rate to 250k and low power</span></div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a3"></a><a class="code" href="classNRF24.html#a3453db8390d5be4aa99d8c7fde3062a4">setRF</a>(<a name="a4"></a><a class="code" href="classNRF24.html#a52d7af9188397d4a6f5dab55d4f04742ae4523002495ee537f2731b61a220e3af">NRF24::NRF24DataRate250kbps</a>, <a name="a5"></a><a class="code" href="classNRF24.html#a8386e81a9a4b824ab26e785879684c7eacef1d6c037e276e6dadaff2b6056ec0c">NRF24::NRF24TransmitPower0dBm</a>))</div>
+<div class="line">     Serial.println(<span class="stringliteral">&quot;setRF failed&quot;</span>);  </div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a6"></a><a class="code" href="classNRF24.html#a28b29969592f9f59c267ae7ffa020b2b">setPipeAddress</a>(0, address, <span class="keyword">sizeof</span>(address)))</div>
+<div class="line">     Serial.println(<span class="stringliteral">&quot;setPipeAddress failed&quot;</span>);  </div>
+<div class="line">  <span class="comment">// Be compatible with Crazyflie: No interrupts, 2 bytes CRC</span></div>
+<div class="line">  nrf24.<a name="a7"></a><a class="code" href="classNRF24.html#a790d69e5cb1039fb2924f9405e30e250">setConfiguration</a>(NRF24_MASK_RX_DR | NRF24_MASK_TX_DS | NRF24_MASK_MAX_RT | NRF24_EN_CRC | NRF24_CRCO);</div>
+<div class="line">  nrf24.<a name="a8"></a><a class="code" href="classNRF24.html#a81931bc1679b213b1cb1ae65b8357985">spiWriteRegister</a>(NRF24_REG_1D_FEATURE, NRF24_EN_DPL | NRF24_EN_ACK_PAY);   <span class="comment">// Dynamic size payload + ack</span></div>
+<div class="line">  nrf24.<a class="code" href="classNRF24.html#a81931bc1679b213b1cb1ae65b8357985">spiWriteRegister</a>(NRF24_REG_1C_DYNPD, NRF24_DPL_P0);     <span class="comment">// Dynamic payload on pipe 0</span></div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a9"></a><a class="code" href="classNRF24.html#a1ac9bfce3833725b8b66d9875a8bc00e">setRetry</a>(6, 3)) <span class="comment">// 1500us and 3 retries</span></div>
+<div class="line">     Serial.println(<span class="stringliteral">&quot;setRetry failed&quot;</span>);  </div>
+<div class="line"></div>
+<div class="line">  Serial.println(<span class="stringliteral">&quot;initialised&quot;</span>);</div>
+<div class="line">}</div>
+<div class="line"></div>
+<div class="line"><span class="comment">// Debugging data dumper</span></div>
+<div class="line"><span class="keywordtype">void</span> dump(<span class="keywordtype">char</span>* prompt, uint8_t* data, uint8_t len)</div>
+<div class="line">{</div>
+<div class="line">  Serial.print(prompt);</div>
+<div class="line">  Serial.print(<span class="stringliteral">&quot;: &quot;</span>);   </div>
+<div class="line">  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; len; i++)</div>
+<div class="line">  {</div>
+<div class="line">    Serial.print(data[i], HEX);</div>
+<div class="line">    Serial.print(<span class="stringliteral">&quot; &quot;</span>);</div>
+<div class="line">  }</div>
+<div class="line">  Serial.println(<span class="stringliteral">&quot;&quot;</span>);</div>
+<div class="line">}</div>
+<div class="line"></div>
+<div class="line"><span class="comment">// Send an ACK with a payload on pipe 0</span></div>
+<div class="line"><span class="keywordtype">void</span> sendAckPayload(uint8_t* data, uint8_t len)</div>
+<div class="line">{</div>
+<div class="line">  nrf24.<a name="a10"></a><a class="code" href="classNRF24.html#a01161d0ba54c409e62ad670b9eceb73d">spiBurstWrite</a>(NRF24_COMMAND_W_ACK_PAYLOAD(0), data, len);</div>
+<div class="line">  nrf24.<a name="a11"></a><a class="code" href="classNRF24.html#a78a011cddedb14b8764ad5ea760c28ae">waitPacketSent</a>();</div>
+<div class="line">}</div>
+<div class="line"></div>
+<div class="line"><span class="comment">// ACK with no payload on pipe 0</span></div>
+<div class="line"><span class="keywordtype">void</span> sendAck()</div>
+<div class="line">{</div>
+<div class="line">  sendAckPayload(0, 0);</div>
+<div class="line">}</div>
+<div class="line"></div>
+<div class="line"><span class="keywordtype">void</span> loop()</div>
+<div class="line">{</div>
+<div class="line">  uint8_t buf[100];</div>
+<div class="line">  uint8_t buflen = <span class="keyword">sizeof</span>(buf);</div>
+<div class="line">  <span class="keyword">static</span> uint32_t last_second = 0;</div>
+<div class="line">  </div>
+<div class="line">  <span class="comment">// enable receiver again, after transmit and wait for a message</span></div>
+<div class="line">  nrf24.<a name="a12"></a><a class="code" href="classNRF24.html#a5260f3e5eeb911e720290e652f628ab5">waitAvailable</a>();</div>
+<div class="line">  <span class="keywordflow">if</span> (nrf24.<a name="a13"></a><a class="code" href="classNRF24.html#a12799e0afcb52f2a8cb7418dca9e0eab">recv</a>(buf, &amp;buflen))</div>
+<div class="line">  {</div>
+<div class="line">    <span class="comment">// Decode incoming messages from client based on port number in the header byte</span></div>
+<div class="line"> <span class="comment">//   dump(&quot;msg&quot;, buf, buflen);</span></div>
+<div class="line">    <span class="keywordflow">if</span> (CRTP_HEADER_PORT(buf[0]) == CRTP_PORT_LINK) <span class="comment">// Link Echo</span></div>
+<div class="line">    {</div>
+<div class="line">      sendAck(); <span class="comment">// Just ack, no payload</span></div>
+<div class="line">    }</div>
+<div class="line">    <span class="keywordflow">else</span> <span class="keywordflow">if</span> (CRTP_HEADER_PORT(buf[0]) == CRTP_PORT_COMMANDER) <span class="comment">// Commander</span></div>
+<div class="line">    {</div>
+<div class="line">      <span class="comment">// Commander message to set control positions</span></div>
+<div class="line">      CommanderCrtpValues *p = (CommanderCrtpValues*)(buf+1);</div>
+<div class="line">      Serial.println(p-&gt;roll); <span class="comment">// -30.0 to 30.0</span></div>
+<div class="line">      Serial.println(p-&gt;pitch); <span class="comment">// -28.0 to 32.0</span></div>
+<div class="line">      Serial.println(p-&gt;yaw); <span class="comment">// -200.0 to 200.0</span></div>
+<div class="line">      Serial.println(p-&gt;thrust); <span class="comment">// 0 to 45755</span></div>
+<div class="line">      sendAck(); <span class="comment">// Just ack, no payload</span></div>
+<div class="line"><span class="comment">//      dump(&quot;commander&quot;, buf, buflen);</span></div>
+<div class="line">    }</div>
+<div class="line">    <span class="keywordflow">else</span> <span class="keywordflow">if</span> (CRTP_HEADER_PORT(buf[0]) == CRTP_PORT_PARAM) <span class="comment">// Parameter</span></div>
+<div class="line">    {</div>
+<div class="line">      <span class="keywordflow">if</span> (buf[1] == CMD_GET_INFO) <span class="comment">// Param GET_INFO</span></div>
+<div class="line">      {</div>
+<div class="line">        <span class="comment">// pc client only fetches item data if the CRC changes</span></div>
+<div class="line">        <span class="comment">// If you change the contents of your TOC, you must change the CRC</span></div>
+<div class="line">        <span class="comment">// Crazyflie PC client doesnt relaly believe it if you say there are no TOC entries</span></div>
+<div class="line">        uint8_t reply[] = { CRTP_HEADER(CRTP_PORT_PARAM, PARAM_TOC_CH), CMD_GET_INFO, 1, 0, 0, 2, 0}; <span class="comment">// 1 params in toc</span></div>
+<div class="line">        sendAckPayload(reply, <span class="keyword">sizeof</span>(reply));</div>
+<div class="line">      }</div>
+<div class="line">      <span class="keywordflow">else</span> <span class="keywordflow">if</span> (buf[1] == CMD_GET_ITEM) <span class="comment">// Param GET_ITEM</span></div>
+<div class="line">      { </div>
+<div class="line">        <span class="comment">// Set up a fax param as item 0</span></div>
+<div class="line">        uint8_t reply[] = { CRTP_HEADER(CRTP_PORT_PARAM, PARAM_TOC_CH), CMD_GET_ITEM, 0, 1, <span class="charliteral">&#39;x&#39;</span>, 0, <span class="charliteral">&#39;y&#39;</span>, 0}; <span class="comment">// bogus item 0 uint8_t param</span></div>
+<div class="line">        sendAckPayload(reply, <span class="keyword">sizeof</span>(reply));</div>
+<div class="line">      }</div>
+<div class="line">      <span class="keywordflow">else</span></div>
+<div class="line">      {</div>
+<div class="line">        Serial.print(<span class="stringliteral">&quot;unknown param type &quot;</span>);</div>
+<div class="line">        Serial.println(buf[1]);</div>
+<div class="line">      }</div>
+<div class="line"> <span class="comment">//     dump(&quot;param&quot;, buf, buflen);</span></div>
+<div class="line">    }</div>
+<div class="line">    <span class="keywordflow">else</span> <span class="keywordflow">if</span> (buf[0] == CRTP_HEADER_PORT(buf[0]) == CRTP_PORT_PARAM) <span class="comment">// Log</span></div>
+<div class="line">    {</div>
+<div class="line">      <span class="comment">// http://wiki.bitcraze.se/projects:crazyflie:crtp:log</span></div>
+<div class="line">      <span class="keywordflow">if</span> (buf[1] == CMD_GET_INFO) <span class="comment">// Log GET_INFO</span></div>
+<div class="line">      {</div>
+<div class="line">        <span class="comment">// pc client only fetches item data if the CRC changes</span></div>
+<div class="line">        <span class="comment">// If you change the contents of your TOC, you must change the CRC</span></div>
+<div class="line">        <span class="comment">// Crazyflie PC client doesnt relaly believe it if you say there are no TOC entries</span></div>
+<div class="line">       uint8_t reply[] = { CRTP_HEADER(CRTP_PORT_LOG, LOG_TOC_CH), CMD_GET_INFO, 1, 0, 0, 2, 1, 8, 64}; <span class="comment">// 1 log item in toc</span></div>
+<div class="line">        sendAckPayload(reply, <span class="keyword">sizeof</span>(reply));</div>
+<div class="line">      }   </div>
+<div class="line">      <span class="keywordflow">else</span> <span class="keywordflow">if</span> (buf[1] == CMD_GET_ITEM) <span class="comment">// Log GET_ITEM</span></div>
+<div class="line">      {</div>
+<div class="line">        <span class="comment">// Set up a fake battery voltage as item 0</span></div>
+<div class="line">        uint8_t reply[] = { CRTP_HEADER(CRTP_PORT_LOG, LOG_TOC_CH), CMD_GET_ITEM, 0, 7, <span class="charliteral">&#39;p&#39;</span>, <span class="charliteral">&#39;m&#39;</span>, 0, <span class="charliteral">&#39;v&#39;</span>, <span class="charliteral">&#39;b&#39;</span>, <span class="charliteral">&#39;a&#39;</span>, <span class="charliteral">&#39;t&#39;</span>, 0}; <span class="comment">// item 0 float pm.vbat</span></div>
+<div class="line">        sendAckPayload(reply, <span class="keyword">sizeof</span>(reply));</div>
+<div class="line">      }</div>
+<div class="line"><span class="comment">//      dump(&quot;log&quot;, buf, buflen);</span></div>
+<div class="line">    }</div>
+<div class="line">    <span class="keywordflow">else</span></div>
+<div class="line">    {</div>
+<div class="line">      <span class="comment">// Sometimes get bogus type 0x93</span></div>
+<div class="line"> <span class="comment">//     dump(&quot;unknown&quot;, buf, buflen);</span></div>
+<div class="line">    }</div>
+<div class="line">  }</div>
+<div class="line">  </div>
+<div class="line">  <span class="comment">// Do once per second tasks</span></div>
+<div class="line">  uint32_t this_second = millis() / 1000;</div>
+<div class="line">  <span class="keywordflow">if</span> (this_second != last_second)</div>
+<div class="line">  {</div>
+<div class="line">    <span class="comment">// This is how you would send value data for a log block</span></div>
+<div class="line">    <span class="comment">// with current real-time data</span></div>
+<div class="line">    <span class="comment">// if a log block has ben set up by the client</span></div>
+<div class="line"><span class="comment">//    uint8_t msg[] = {CRTP_HEADER(CRTP_PORT_LOG, LOG_LOG_CH), 0, 0, 0, 0, 11, 11, 11, 11};</span></div>
+<div class="line"><span class="comment">//    sendAckPayload(msg, sizeof(msg));</span></div>
+<div class="line"></div>
+<div class="line">    last_second = this_second;</div>
+<div class="line">  }</div>
+<div class="line">}</div>
+<div class="line"></div>
+</div><!-- fragment --> </div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.5
+</small></address>
+</body>
+</html>

+ 247 - 0
NRF24_for_attiny/doc/crazyflie_client_8ino-example.html

@@ -0,0 +1,247 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.5"/>
+<title>NRF24: crazyflie_client.ino</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">NRF24
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.5 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">crazyflie_client.ino</div>  </div>
+</div><!--header-->
+<div class="contents">
+<p>This sketch act like a Crazyflie client (ie the transmitter) using the CRTP radiolink protocol: <a href="http://wiki.bitcraze.se/projects:crazyflie:firmware:comm_protocol">http://wiki.bitcraze.se/projects:crazyflie:firmware:comm_protocol</a> to control a Crazyflie quadcopter <a href="http://www.bitcraze.se/">http://www.bitcraze.se/</a> using a RC transmitter in trainer mode, such as the Spektrum DX6i and others.</p>
+<div class="fragment"><div class="line"><span class="comment">// crazyflie_client.pde</span></div>
+<div class="line"><span class="comment">// -*- mode: C++ -*-</span></div>
+<div class="line"><span class="comment">//</span></div>
+<div class="line"><span class="comment">// This sketch act like a Crazyflie client (ie the transmitter) using the CRTP radiolink protocol:</span></div>
+<div class="line"><span class="comment">// http://wiki.bitcraze.se/projects:crazyflie:firmware:comm_protocol</span></div>
+<div class="line"><span class="comment">// to control a Crazyflie quadcopter http://www.bitcraze.se/</span></div>
+<div class="line"><span class="comment">//</span></div>
+<div class="line"><span class="comment">// Requires </span></div>
+<div class="line"><span class="comment">// - RC Transmitter that can act in trainer mode (eg Spektrum DX6i and others)</span></div>
+<div class="line"><span class="comment">// - NRF24 radio module such as the sparkfun WRL-00691 http://www.sparkfun.com/products/691</span></div>
+<div class="line"><span class="comment">// - Arduino such as Uno</span></div>
+<div class="line"><span class="comment">//</span></div>
+<div class="line"><span class="comment">// Uses NRF24 library to comunicate withthe Crazyflie, </span></div>
+<div class="line"><span class="comment">// http://www.airspayce.com/mikem/arduino/NRF24</span></div>
+<div class="line"><span class="comment">// and uses</span></div>
+<div class="line"><span class="comment">// the  RcTrainer library to get servo positions from an RC transmitter running as a trainer</span></div>
+<div class="line"><span class="comment">// see http://www.airspayce.com/mikem/arduino/RcTrainer</span></div>
+<div class="line"><span class="comment">// Transmits the servo posiiotns to the Crazyflie, therefore allowing you to control the Crazyflie from </span></div>
+<div class="line"><span class="comment">// a conventional RC transmitter (ie no PC and no CrazyRadio module required).</span></div>
+<div class="line"><span class="comment">//</span></div>
+<div class="line"><span class="comment">// Only uses the Link ECHO and commander messages. No Log or Param messages are used </span></div>
+<div class="line"><span class="comment">// Author: Mike McCauley</span></div>
+<div class="line"><span class="comment">// Copyright (C) 2012 Mike McCauley</span></div>
+<div class="line"></div>
+<div class="line"><span class="preprocessor">#include &lt;NRF24.h&gt;</span></div>
+<div class="line"><span class="preprocessor">#include &lt;SPI.h&gt;</span></div>
+<div class="line"><span class="preprocessor">#include &lt;RcTrainer.h&gt;</span></div>
+<div class="line"></div>
+<div class="line"><span class="comment">// Structure of Crazyflie commander messages</span></div>
+<div class="line"><span class="preprocessor">#pragma pack(1);</span></div>
+<div class="line"><span class="preprocessor"></span><span class="keyword">typedef</span> <span class="keyword">struct </span></div>
+<div class="line">{</div>
+<div class="line">  <span class="keywordtype">float</span> roll;</div>
+<div class="line">  <span class="keywordtype">float</span> pitch;</div>
+<div class="line">  <span class="keywordtype">float</span> yaw;</div>
+<div class="line">  uint16_t thrust;</div>
+<div class="line">} CommanderCrtpValues;</div>
+<div class="line"><span class="preprocessor">#pragma pack()</span></div>
+<div class="line"><span class="preprocessor"></span></div>
+<div class="line"><span class="comment">// Useful macros for CRTP message contents and formatting</span></div>
+<div class="line"><span class="preprocessor">#define CRTP_HEADER(port, channel) (((port &amp; 0x0F) &lt;&lt; 4) | (channel &amp; 0x0F))</span></div>
+<div class="line"><span class="preprocessor"></span><span class="preprocessor">#define CRTP_HEADER_PORT(h) ((h &gt;&gt; 4) &amp; 0xf)</span></div>
+<div class="line"><span class="preprocessor"></span><span class="preprocessor">#define CRTP_HEADER_CHANNEL(h) (h &amp; 0x3)</span></div>
+<div class="line"><span class="preprocessor"></span></div>
+<div class="line"><span class="comment">// Param channels</span></div>
+<div class="line"><span class="preprocessor">#define PARAM_TOC_CH 0</span></div>
+<div class="line"><span class="preprocessor"></span><span class="preprocessor">#define PARAM_READ_CH 1</span></div>
+<div class="line"><span class="preprocessor"></span><span class="preprocessor">#define PARAM_WRITE_CH 2</span></div>
+<div class="line"><span class="preprocessor"></span></div>
+<div class="line"><span class="comment">// Log channels</span></div>
+<div class="line"><span class="preprocessor">#define LOG_TOC_CH 0</span></div>
+<div class="line"><span class="preprocessor"></span><span class="preprocessor">#define LOG_CONTROL_CH 1</span></div>
+<div class="line"><span class="preprocessor"></span><span class="preprocessor">#define LOG_LOG_CH 2</span></div>
+<div class="line"><span class="preprocessor"></span><span class="comment">// Log packet parameters storage</span></div>
+<div class="line"><span class="preprocessor">#define LOG_MAX_OPS 64</span></div>
+<div class="line"><span class="preprocessor"></span><span class="preprocessor">#define LOG_MAX_BLOCKS 8</span></div>
+<div class="line"><span class="preprocessor"></span></div>
+<div class="line"><span class="comment">// Port definitions</span></div>
+<div class="line"><span class="keyword">typedef</span> <span class="keyword">enum</span> {</div>
+<div class="line">  CRTP_PORT_CONSOLE     = 0x00,</div>
+<div class="line">  CRTP_PORT_PARAM       = 0x02,</div>
+<div class="line">  CRTP_PORT_COMMANDER   = 0x03,</div>
+<div class="line">  CRTP_PORT_LOG         = 0x05,</div>
+<div class="line">  CRTP_PORT_LINK        = 0x0F,</div>
+<div class="line">} CRTPPort;</div>
+<div class="line"></div>
+<div class="line"><span class="comment">// Common command numbers</span></div>
+<div class="line"><span class="preprocessor">#define CMD_GET_ITEM 0</span></div>
+<div class="line"><span class="preprocessor"></span><span class="preprocessor">#define CMD_GET_INFO 1</span></div>
+<div class="line"><span class="preprocessor"></span></div>
+<div class="line"><span class="comment">// Singleton instance of the radio</span></div>
+<div class="line"><a name="_a0"></a><a class="code" href="classNRF24.html">NRF24</a> nrf24;</div>
+<div class="line"><span class="comment">// NRF24 nrf24(8, 7); // use this to be electrically compatible with Mirf</span></div>
+<div class="line"><span class="comment">// NRF24 nrf24(8, 10);// For Leonardo, need explicit SS pin</span></div>
+<div class="line"></div>
+<div class="line"><span class="comment">// The currently used radio channel</span></div>
+<div class="line">uint8_t channel;</div>
+<div class="line"></div>
+<div class="line"><span class="comment">// The expected address of the Crazyflie server (copter)</span></div>
+<div class="line"><span class="comment">// This is in fact also the default address of the NRF24</span></div>
+<div class="line">uint8_t address[] = { 0xe7, 0xe7, 0xe7, 0xe7, 0xe7 };</div>
+<div class="line">uint32_t failed_packet_count = 0;</div>
+<div class="line"></div>
+<div class="line"><span class="comment">// Object to get servo positions from RC trainer on pin D2</span></div>
+<div class="line">RcTrainer rc;</div>
+<div class="line"></div>
+<div class="line"><span class="keywordtype">void</span> setup() </div>
+<div class="line">{</div>
+<div class="line">  Serial.begin(115200);</div>
+<div class="line">  <span class="keywordflow">while</span> (!Serial)</div>
+<div class="line">    ; <span class="comment">// Wait for serial port, only required for Leonardo</span></div>
+<div class="line"></div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a1"></a><a class="code" href="classNRF24.html#a6e98cf508939240c1805245170a995f6">init</a>())</div>
+<div class="line">    Serial.println(<span class="stringliteral">&quot;NRF24 init failed&quot;</span>);</div>
+<div class="line">  </div>
+<div class="line">  <span class="comment">// Be Crazyflie radiolink compatible</span></div>
+<div class="line">  <span class="comment">// We use the NRF24 library for convenience, but</span></div>
+<div class="line">  <span class="comment">// we use a different configuration to the default NRF24</span></div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a2"></a><a class="code" href="classNRF24.html#a3fa90005f98eb2744a533899f9b7e023">setChannel</a>(13))</div>
+<div class="line">     Serial.println(<span class="stringliteral">&quot;setChannel failed&quot;</span>);</div>
+<div class="line">  <span class="comment">// Set data rate to 250k and low power</span></div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a3"></a><a class="code" href="classNRF24.html#a3453db8390d5be4aa99d8c7fde3062a4">setRF</a>(<a name="a4"></a><a class="code" href="classNRF24.html#a52d7af9188397d4a6f5dab55d4f04742ae4523002495ee537f2731b61a220e3af">NRF24::NRF24DataRate250kbps</a>, <a name="a5"></a><a class="code" href="classNRF24.html#a8386e81a9a4b824ab26e785879684c7eacef1d6c037e276e6dadaff2b6056ec0c">NRF24::NRF24TransmitPower0dBm</a>))</div>
+<div class="line">     Serial.println(<span class="stringliteral">&quot;setRF failed&quot;</span>);  </div>
+<div class="line">  <span class="comment">// Be compatible with Crazyflie: No interrupts, 2 bytes CRC</span></div>
+<div class="line">  nrf24.<a name="a6"></a><a class="code" href="classNRF24.html#a790d69e5cb1039fb2924f9405e30e250">setConfiguration</a>(NRF24_MASK_RX_DR | NRF24_MASK_TX_DS | NRF24_MASK_MAX_RT | NRF24_EN_CRC | NRF24_CRCO);</div>
+<div class="line">  nrf24.<a name="a7"></a><a class="code" href="classNRF24.html#a81931bc1679b213b1cb1ae65b8357985">spiWriteRegister</a>(NRF24_REG_1D_FEATURE, NRF24_EN_DPL | NRF24_EN_ACK_PAY);   <span class="comment">// Dynamic size payload + ack</span></div>
+<div class="line">  nrf24.<a class="code" href="classNRF24.html#a81931bc1679b213b1cb1ae65b8357985">spiWriteRegister</a>(NRF24_REG_1C_DYNPD, NRF24_DPL_P0);     <span class="comment">// Dynamic payload on pipe 0</span></div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a8"></a><a class="code" href="classNRF24.html#a1ac9bfce3833725b8b66d9875a8bc00e">setRetry</a>(6, 3)) <span class="comment">// 1500us and 3 retries</span></div>
+<div class="line">     Serial.println(<span class="stringliteral">&quot;setRetry failed&quot;</span>);  </div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a9"></a><a class="code" href="classNRF24.html#a7b40c4c481bddf343acdac5179fddc75">setTransmitAddress</a>(address, <span class="keyword">sizeof</span>(address)))</div>
+<div class="line">     Serial.println(<span class="stringliteral">&quot;setTransmitAddress failed&quot;</span>);  </div>
+<div class="line"></div>
+<div class="line">  Serial.println(<span class="stringliteral">&quot;initialised&quot;</span>);</div>
+<div class="line">}</div>
+<div class="line"></div>
+<div class="line"><span class="comment">// Debugging data dumper</span></div>
+<div class="line"><span class="keywordtype">void</span> dump(<span class="keywordtype">char</span>* prompt, uint8_t* data, uint8_t len)</div>
+<div class="line">{</div>
+<div class="line">  Serial.print(prompt);</div>
+<div class="line">  Serial.print(<span class="stringliteral">&quot;: &quot;</span>);   </div>
+<div class="line">  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; len; i++)</div>
+<div class="line">  {</div>
+<div class="line">    Serial.print(data[i], HEX);</div>
+<div class="line">    Serial.print(<span class="stringliteral">&quot; &quot;</span>);</div>
+<div class="line">  }</div>
+<div class="line">  Serial.println(<span class="stringliteral">&quot;&quot;</span>);</div>
+<div class="line">}</div>
+<div class="line"></div>
+<div class="line"><span class="comment">// Scan for a Crazyflie server (ie a copter) that responds</span></div>
+<div class="line"><span class="comment">// If one is found, set the channel and return true</span></div>
+<div class="line"><span class="keywordtype">boolean</span> scan()</div>
+<div class="line">{</div>
+<div class="line">  <span class="comment">// Standard LINK echo message</span></div>
+<div class="line">  <span class="comment">// If there is a Crazyflie present on a channel it will reply with an ACK and no payload</span></div>
+<div class="line">  uint8_t msg[] = { CRTP_HEADER(CRTP_PORT_LINK, 3) };</div>
+<div class="line">  <span class="keywordflow">for</span> (channel = 0; channel &lt; 125; channel++)</div>
+<div class="line">  {</div>
+<div class="line">    nrf24.<a class="code" href="classNRF24.html#a3fa90005f98eb2744a533899f9b7e023">setChannel</a>(channel);</div>
+<div class="line">   <span class="keywordflow">if</span> (!nrf24.<a name="a10"></a><a class="code" href="classNRF24.html#aad280539b80b28e55ab3187714bc7f2f">send</a>(msg, <span class="keyword">sizeof</span>(msg)))</div>
+<div class="line">      Serial.println(<span class="stringliteral">&quot;scan send failed&quot;</span>);</div>
+<div class="line">    <span class="keywordflow">if</span> (nrf24.<a name="a11"></a><a class="code" href="classNRF24.html#a78a011cddedb14b8764ad5ea760c28ae">waitPacketSent</a>())</div>
+<div class="line">      <span class="keywordflow">return</span> <span class="keyword">true</span>; <span class="comment">// Got an ACK, expect no payload. This channel works, use it</span></div>
+<div class="line">  }</div>
+<div class="line">  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line">}</div>
+<div class="line"></div>
+<div class="line"><span class="comment">// Send a message to the copter and detect failures</span></div>
+<div class="line"><span class="keywordtype">void</span> send(uint8_t* data, uint8_t len)</div>
+<div class="line">{</div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a class="code" href="classNRF24.html#aad280539b80b28e55ab3187714bc7f2f">send</a>(data, len))</div>
+<div class="line">    Serial.println(<span class="stringliteral">&quot;send failed&quot;</span>);</div>
+<div class="line">    </div>
+<div class="line">  <span class="keywordflow">if</span> (nrf24.<a class="code" href="classNRF24.html#a78a011cddedb14b8764ad5ea760c28ae">waitPacketSent</a>())</div>
+<div class="line">  {</div>
+<div class="line">    <span class="comment">// Analyze payload?</span></div>
+<div class="line">  }</div>
+<div class="line">  <span class="keywordflow">else</span></div>
+<div class="line">  {</div>
+<div class="line">    failed_packet_count++;</div>
+<div class="line">  } </div>
+<div class="line">}</div>
+<div class="line"></div>
+<div class="line"><span class="keywordtype">void</span> loop()</div>
+<div class="line">{</div>
+<div class="line">  <span class="comment">// Poll until we have a positive response from a Crazyflie</span></div>
+<div class="line">  <span class="comment">// and then use its channel</span></div>
+<div class="line">  <span class="keywordflow">while</span> (!scan())</div>
+<div class="line">    ;</div>
+<div class="line">    </div>
+<div class="line">  <span class="comment">// Now run a session with the one we found...</span></div>
+<div class="line">  failed_packet_count = 0;</div>
+<div class="line">  Serial.print(<span class="stringliteral">&quot;found a crazyflie on channel: &quot;</span>);</div>
+<div class="line">  Serial.println(channel);</div>
+<div class="line">  </div>
+<div class="line">  <span class="comment">// ...until we get too many comms failures</span></div>
+<div class="line">  <span class="keywordflow">while</span> (failed_packet_count &lt; 50)</div>
+<div class="line">  {</div>
+<div class="line">      <span class="comment">// Send a commander message</span></div>
+<div class="line">      uint8_t buf[32];</div>
+<div class="line">      buf[0] = CRTP_HEADER(CRTP_PORT_COMMANDER, 0);</div>
+<div class="line">      CommanderCrtpValues* msg = (CommanderCrtpValues*)(buf+1);</div>
+<div class="line">      <span class="comment">// Mode 2 stick layout, map standard stick values to suitable Crazyflie commander ranges</span></div>
+<div class="line">      msg-&gt;roll   = map(rc.getChannel(1), 0, 1023, 30.0, -30.0);</div>
+<div class="line">      msg-&gt;pitch  = map(rc.getChannel(2), 0, 1023, 30.0, -30.0);</div>
+<div class="line">      msg-&gt;yaw    = map(rc.getChannel(3), 0, 1023, 200.0, -200.0);</div>
+<div class="line">      msg-&gt;thrust = map(rc.getChannel(0), 0, 1023, 0, 65000);</div>
+<div class="line">      send(buf, <span class="keyword">sizeof</span>(CommanderCrtpValues) + 1);</div>
+<div class="line">      delay(20); <span class="comment">// 50 per sec</span></div>
+<div class="line">  } </div>
+<div class="line">  Serial.println(<span class="stringliteral">&quot;connection failed&quot;</span>);</div>
+<div class="line">  </div>
+<div class="line">  <span class="comment">// Too many failed messages, fall out here and rescan for a new Crazyflie</span></div>
+<div class="line">}</div>
+<div class="line"></div>
+<div class="line"></div>
+</div><!-- fragment --> </div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.5
+</small></address>
+</body>
+</html>

+ 1357 - 0
NRF24_for_attiny/doc/doxygen.css

@@ -0,0 +1,1357 @@
+/* The standard CSS for doxygen 1.8.5 */
+
+body, table, div, p, dl {
+	font: 400 14px/22px Roboto,sans-serif;
+}
+
+/* @group Heading Levels */
+
+h1.groupheader {
+	font-size: 150%;
+}
+
+.title {
+	font: 400 14px/28px Roboto,sans-serif;
+	font-size: 150%;
+	font-weight: bold;
+	margin: 10px 2px;
+}
+
+h2.groupheader {
+	border-bottom: 1px solid #879ECB;
+	color: #354C7B;
+	font-size: 150%;
+	font-weight: normal;
+	margin-top: 1.75em;
+	padding-top: 8px;
+	padding-bottom: 4px;
+	width: 100%;
+}
+
+h3.groupheader {
+	font-size: 100%;
+}
+
+h1, h2, h3, h4, h5, h6 {
+	-webkit-transition: text-shadow 0.5s linear;
+	-moz-transition: text-shadow 0.5s linear;
+	-ms-transition: text-shadow 0.5s linear;
+	-o-transition: text-shadow 0.5s linear;
+	transition: text-shadow 0.5s linear;
+	margin-right: 15px;
+}
+
+h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow {
+	text-shadow: 0 0 15px cyan;
+}
+
+dt {
+	font-weight: bold;
+}
+
+div.multicol {
+	-moz-column-gap: 1em;
+	-webkit-column-gap: 1em;
+	-moz-column-count: 3;
+	-webkit-column-count: 3;
+}
+
+p.startli, p.startdd, p.starttd {
+	margin-top: 2px;
+}
+
+p.endli {
+	margin-bottom: 0px;
+}
+
+p.enddd {
+	margin-bottom: 4px;
+}
+
+p.endtd {
+	margin-bottom: 2px;
+}
+
+/* @end */
+
+caption {
+	font-weight: bold;
+}
+
+span.legend {
+        font-size: 70%;
+        text-align: center;
+}
+
+h3.version {
+        font-size: 90%;
+        text-align: center;
+}
+
+div.qindex, div.navtab{
+	background-color: #EBEFF6;
+	border: 1px solid #A3B4D7;
+	text-align: center;
+}
+
+div.qindex, div.navpath {
+	width: 100%;
+	line-height: 140%;
+}
+
+div.navtab {
+	margin-right: 15px;
+}
+
+/* @group Link Styling */
+
+a {
+	color: #3D578C;
+	font-weight: normal;
+	text-decoration: none;
+}
+
+.contents a:visited {
+	color: #4665A2;
+}
+
+a:hover {
+	text-decoration: underline;
+}
+
+a.qindex {
+	font-weight: bold;
+}
+
+a.qindexHL {
+	font-weight: bold;
+	background-color: #9CAFD4;
+	color: #ffffff;
+	border: 1px double #869DCA;
+}
+
+.contents a.qindexHL:visited {
+        color: #ffffff;
+}
+
+a.el {
+	font-weight: bold;
+}
+
+a.elRef {
+}
+
+a.code, a.code:visited, a.line, a.line:visited {
+	color: #4665A2; 
+}
+
+a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited {
+	color: #4665A2; 
+}
+
+/* @end */
+
+dl.el {
+	margin-left: -1cm;
+}
+
+pre.fragment {
+        border: 1px solid #C4CFE5;
+        background-color: #FBFCFD;
+        padding: 4px 6px;
+        margin: 4px 8px 4px 2px;
+        overflow: auto;
+        word-wrap: break-word;
+        font-size:  9pt;
+        line-height: 125%;
+        font-family: monospace, fixed;
+        font-size: 105%;
+}
+
+div.fragment {
+        padding: 0px;
+        margin: 0px;
+	background-color: #FBFCFD;
+	border: 1px solid #C4CFE5;
+}
+
+div.line {
+	font-family: monospace, fixed;
+        font-size: 13px;
+	min-height: 13px;
+	line-height: 1.0;
+	text-wrap: unrestricted;
+	white-space: -moz-pre-wrap; /* Moz */
+	white-space: -pre-wrap;     /* Opera 4-6 */
+	white-space: -o-pre-wrap;   /* Opera 7 */
+	white-space: pre-wrap;      /* CSS3  */
+	word-wrap: break-word;      /* IE 5.5+ */
+	text-indent: -53px;
+	padding-left: 53px;
+	padding-bottom: 0px;
+	margin: 0px;
+	-webkit-transition-property: background-color, box-shadow;
+	-webkit-transition-duration: 0.5s;
+	-moz-transition-property: background-color, box-shadow;
+	-moz-transition-duration: 0.5s;
+	-ms-transition-property: background-color, box-shadow;
+	-ms-transition-duration: 0.5s;
+	-o-transition-property: background-color, box-shadow;
+	-o-transition-duration: 0.5s;
+	transition-property: background-color, box-shadow;
+	transition-duration: 0.5s;
+}
+
+div.line.glow {
+	background-color: cyan;
+	box-shadow: 0 0 10px cyan;
+}
+
+
+span.lineno {
+	padding-right: 4px;
+	text-align: right;
+	border-right: 2px solid #0F0;
+	background-color: #E8E8E8;
+        white-space: pre;
+}
+span.lineno a {
+	background-color: #D8D8D8;
+}
+
+span.lineno a:hover {
+	background-color: #C8C8C8;
+}
+
+div.ah {
+	background-color: black;
+	font-weight: bold;
+	color: #ffffff;
+	margin-bottom: 3px;
+	margin-top: 3px;
+	padding: 0.2em;
+	border: solid thin #333;
+	border-radius: 0.5em;
+	-webkit-border-radius: .5em;
+	-moz-border-radius: .5em;
+	box-shadow: 2px 2px 3px #999;
+	-webkit-box-shadow: 2px 2px 3px #999;
+	-moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+	background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
+	background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000);
+}
+
+div.groupHeader {
+	margin-left: 16px;
+	margin-top: 12px;
+	font-weight: bold;
+}
+
+div.groupText {
+	margin-left: 16px;
+	font-style: italic;
+}
+
+body {
+	background-color: white;
+	color: black;
+        margin: 0;
+}
+
+div.contents {
+	margin-top: 10px;
+	margin-left: 12px;
+	margin-right: 8px;
+}
+
+td.indexkey {
+	background-color: #EBEFF6;
+	font-weight: bold;
+	border: 1px solid #C4CFE5;
+	margin: 2px 0px 2px 0;
+	padding: 2px 10px;
+        white-space: nowrap;
+        vertical-align: top;
+}
+
+td.indexvalue {
+	background-color: #EBEFF6;
+	border: 1px solid #C4CFE5;
+	padding: 2px 10px;
+	margin: 2px 0px;
+}
+
+tr.memlist {
+	background-color: #EEF1F7;
+}
+
+p.formulaDsp {
+	text-align: center;
+}
+
+img.formulaDsp {
+	
+}
+
+img.formulaInl {
+	vertical-align: middle;
+}
+
+div.center {
+	text-align: center;
+        margin-top: 0px;
+        margin-bottom: 0px;
+        padding: 0px;
+}
+
+div.center img {
+	border: 0px;
+}
+
+address.footer {
+	text-align: right;
+	padding-right: 12px;
+}
+
+img.footer {
+	border: 0px;
+	vertical-align: middle;
+}
+
+/* @group Code Colorization */
+
+span.keyword {
+	color: #008000
+}
+
+span.keywordtype {
+	color: #604020
+}
+
+span.keywordflow {
+	color: #e08000
+}
+
+span.comment {
+	color: #800000
+}
+
+span.preprocessor {
+	color: #806020
+}
+
+span.stringliteral {
+	color: #002080
+}
+
+span.charliteral {
+	color: #008080
+}
+
+span.vhdldigit { 
+	color: #ff00ff 
+}
+
+span.vhdlchar { 
+	color: #000000 
+}
+
+span.vhdlkeyword { 
+	color: #700070 
+}
+
+span.vhdllogic { 
+	color: #ff0000 
+}
+
+blockquote {
+        background-color: #F7F8FB;
+        border-left: 2px solid #9CAFD4;
+        margin: 0 24px 0 4px;
+        padding: 0 12px 0 16px;
+}
+
+/* @end */
+
+/*
+.search {
+	color: #003399;
+	font-weight: bold;
+}
+
+form.search {
+	margin-bottom: 0px;
+	margin-top: 0px;
+}
+
+input.search {
+	font-size: 75%;
+	color: #000080;
+	font-weight: normal;
+	background-color: #e8eef2;
+}
+*/
+
+td.tiny {
+	font-size: 75%;
+}
+
+.dirtab {
+	padding: 4px;
+	border-collapse: collapse;
+	border: 1px solid #A3B4D7;
+}
+
+th.dirtab {
+	background: #EBEFF6;
+	font-weight: bold;
+}
+
+hr {
+	height: 0px;
+	border: none;
+	border-top: 1px solid #4A6AAA;
+}
+
+hr.footer {
+	height: 1px;
+}
+
+/* @group Member Descriptions */
+
+table.memberdecls {
+	border-spacing: 0px;
+	padding: 0px;
+}
+
+.memberdecls td, .fieldtable tr {
+	-webkit-transition-property: background-color, box-shadow;
+	-webkit-transition-duration: 0.5s;
+	-moz-transition-property: background-color, box-shadow;
+	-moz-transition-duration: 0.5s;
+	-ms-transition-property: background-color, box-shadow;
+	-ms-transition-duration: 0.5s;
+	-o-transition-property: background-color, box-shadow;
+	-o-transition-duration: 0.5s;
+	transition-property: background-color, box-shadow;
+	transition-duration: 0.5s;
+}
+
+.memberdecls td.glow, .fieldtable tr.glow {
+	background-color: cyan;
+	box-shadow: 0 0 15px cyan;
+}
+
+.mdescLeft, .mdescRight,
+.memItemLeft, .memItemRight,
+.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
+	background-color: #F9FAFC;
+	border: none;
+	margin: 4px;
+	padding: 1px 0 0 8px;
+}
+
+.mdescLeft, .mdescRight {
+	padding: 0px 8px 4px 8px;
+	color: #555;
+}
+
+.memSeparator {
+        border-bottom: 1px solid #DEE4F0;
+        line-height: 1px;
+        margin: 0px;
+        padding: 0px;
+}
+
+.memItemLeft, .memTemplItemLeft {
+        white-space: nowrap;
+}
+
+.memItemRight {
+	width: 100%;
+}
+
+.memTemplParams {
+	color: #4665A2;
+        white-space: nowrap;
+	font-size: 80%;
+}
+
+/* @end */
+
+/* @group Member Details */
+
+/* Styles for detailed member documentation */
+
+.memtemplate {
+	font-size: 80%;
+	color: #4665A2;
+	font-weight: normal;
+	margin-left: 9px;
+}
+
+.memnav {
+	background-color: #EBEFF6;
+	border: 1px solid #A3B4D7;
+	text-align: center;
+	margin: 2px;
+	margin-right: 15px;
+	padding: 2px;
+}
+
+.mempage {
+	width: 100%;
+}
+
+.memitem {
+	padding: 0;
+	margin-bottom: 10px;
+	margin-right: 5px;
+        -webkit-transition: box-shadow 0.5s linear;
+        -moz-transition: box-shadow 0.5s linear;
+        -ms-transition: box-shadow 0.5s linear;
+        -o-transition: box-shadow 0.5s linear;
+        transition: box-shadow 0.5s linear;
+        display: table !important;
+        width: 100%;
+}
+
+.memitem.glow {
+         box-shadow: 0 0 15px cyan;
+}
+
+.memname {
+        font-weight: bold;
+        margin-left: 6px;
+}
+
+.memname td {
+	vertical-align: bottom;
+}
+
+.memproto, dl.reflist dt {
+        border-top: 1px solid #A8B8D9;
+        border-left: 1px solid #A8B8D9;
+        border-right: 1px solid #A8B8D9;
+        padding: 6px 0px 6px 0px;
+        color: #253555;
+        font-weight: bold;
+        text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+        background-image:url('nav_f.png');
+        background-repeat:repeat-x;
+        background-color: #E2E8F2;
+        /* opera specific markup */
+        box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+        border-top-right-radius: 4px;
+        border-top-left-radius: 4px;
+        /* firefox specific markup */
+        -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+        -moz-border-radius-topright: 4px;
+        -moz-border-radius-topleft: 4px;
+        /* webkit specific markup */
+        -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+        -webkit-border-top-right-radius: 4px;
+        -webkit-border-top-left-radius: 4px;
+
+}
+
+.memdoc, dl.reflist dd {
+        border-bottom: 1px solid #A8B8D9;      
+        border-left: 1px solid #A8B8D9;      
+        border-right: 1px solid #A8B8D9; 
+        padding: 6px 10px 2px 10px;
+        background-color: #FBFCFD;
+        border-top-width: 0;
+        background-image:url('nav_g.png');
+        background-repeat:repeat-x;
+        background-color: #FFFFFF;
+        /* opera specific markup */
+        border-bottom-left-radius: 4px;
+        border-bottom-right-radius: 4px;
+        box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+        /* firefox specific markup */
+        -moz-border-radius-bottomleft: 4px;
+        -moz-border-radius-bottomright: 4px;
+        -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+        /* webkit specific markup */
+        -webkit-border-bottom-left-radius: 4px;
+        -webkit-border-bottom-right-radius: 4px;
+        -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+}
+
+dl.reflist dt {
+        padding: 5px;
+}
+
+dl.reflist dd {
+        margin: 0px 0px 10px 0px;
+        padding: 5px;
+}
+
+.paramkey {
+	text-align: right;
+}
+
+.paramtype {
+	white-space: nowrap;
+}
+
+.paramname {
+	color: #602020;
+	white-space: nowrap;
+}
+.paramname em {
+	font-style: normal;
+}
+.paramname code {
+        line-height: 14px;
+}
+
+.params, .retval, .exception, .tparams {
+        margin-left: 0px;
+        padding-left: 0px;
+}       
+
+.params .paramname, .retval .paramname {
+        font-weight: bold;
+        vertical-align: top;
+}
+        
+.params .paramtype {
+        font-style: italic;
+        vertical-align: top;
+}       
+        
+.params .paramdir {
+        font-family: "courier new",courier,monospace;
+        vertical-align: top;
+}
+
+table.mlabels {
+	border-spacing: 0px;
+}
+
+td.mlabels-left {
+	width: 100%;
+	padding: 0px;
+}
+
+td.mlabels-right {
+	vertical-align: bottom;
+	padding: 0px;
+	white-space: nowrap;
+}
+
+span.mlabels {
+        margin-left: 8px;
+}
+
+span.mlabel {
+        background-color: #728DC1;
+        border-top:1px solid #5373B4;
+        border-left:1px solid #5373B4;
+        border-right:1px solid #C4CFE5;
+        border-bottom:1px solid #C4CFE5;
+	text-shadow: none;
+	color: white;
+	margin-right: 4px;
+	padding: 2px 3px;
+	border-radius: 3px;
+	font-size: 7pt;
+	white-space: nowrap;
+	vertical-align: middle;
+}
+
+
+
+/* @end */
+
+/* these are for tree view when not used as main index */
+
+div.directory {
+        margin: 10px 0px;
+        border-top: 1px solid #A8B8D9;
+        border-bottom: 1px solid #A8B8D9;
+        width: 100%;
+}
+
+.directory table {
+        border-collapse:collapse;
+}
+
+.directory td {
+        margin: 0px;
+        padding: 0px;
+	vertical-align: top;
+}
+
+.directory td.entry {
+        white-space: nowrap;
+        padding-right: 6px;
+	padding-top: 3px;
+}
+
+.directory td.entry a {
+        outline:none;
+}
+
+.directory td.entry a img {
+        border: none;
+}
+
+.directory td.desc {
+        width: 100%;
+        padding-left: 6px;
+	padding-right: 6px;
+	padding-top: 3px;
+	border-left: 1px solid rgba(0,0,0,0.05);
+}
+
+.directory tr.even {
+	padding-left: 6px;
+	background-color: #F7F8FB;
+}
+
+.directory img {
+	vertical-align: -30%;
+}
+
+.directory .levels {
+        white-space: nowrap;
+        width: 100%;
+        text-align: right;
+        font-size: 9pt;
+}
+
+.directory .levels span {
+        cursor: pointer;
+        padding-left: 2px;
+        padding-right: 2px;
+	color: #3D578C;
+}
+
+div.dynheader {
+        margin-top: 8px;
+	-webkit-touch-callout: none;
+	-webkit-user-select: none;
+	-khtml-user-select: none;
+	-moz-user-select: none;
+	-ms-user-select: none;
+	user-select: none;
+}
+
+address {
+	font-style: normal;
+	color: #2A3D61;
+}
+
+table.doxtable {
+	border-collapse:collapse;
+        margin-top: 4px;
+        margin-bottom: 4px;
+}
+
+table.doxtable td, table.doxtable th {
+	border: 1px solid #2D4068;
+	padding: 3px 7px 2px;
+}
+
+table.doxtable th {
+	background-color: #374F7F;
+	color: #FFFFFF;
+	font-size: 110%;
+	padding-bottom: 4px;
+	padding-top: 5px;
+}
+
+table.fieldtable {
+        /*width: 100%;*/
+        margin-bottom: 10px;
+        border: 1px solid #A8B8D9;
+        border-spacing: 0px;
+        -moz-border-radius: 4px;
+        -webkit-border-radius: 4px;
+        border-radius: 4px;
+        -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+        -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+        box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+}
+
+.fieldtable td, .fieldtable th {
+        padding: 3px 7px 2px;
+}
+
+.fieldtable td.fieldtype, .fieldtable td.fieldname {
+        white-space: nowrap;
+        border-right: 1px solid #A8B8D9;
+        border-bottom: 1px solid #A8B8D9;
+        vertical-align: top;
+}
+
+.fieldtable td.fieldname {
+        padding-top: 3px;
+}
+
+.fieldtable td.fielddoc {
+        border-bottom: 1px solid #A8B8D9;
+        /*width: 100%;*/
+}
+
+.fieldtable td.fielddoc p:first-child {
+        margin-top: 0px;
+}       
+        
+.fieldtable td.fielddoc p:last-child {
+        margin-bottom: 2px;
+}
+
+.fieldtable tr:last-child td {
+        border-bottom: none;
+}
+
+.fieldtable th {
+        background-image:url('nav_f.png');
+        background-repeat:repeat-x;
+        background-color: #E2E8F2;
+        font-size: 90%;
+        color: #253555;
+        padding-bottom: 4px;
+        padding-top: 5px;
+        text-align:left;
+        -moz-border-radius-topleft: 4px;
+        -moz-border-radius-topright: 4px;
+        -webkit-border-top-left-radius: 4px;
+        -webkit-border-top-right-radius: 4px;
+        border-top-left-radius: 4px;
+        border-top-right-radius: 4px;
+        border-bottom: 1px solid #A8B8D9;
+}
+
+
+.tabsearch {
+	top: 0px;
+	left: 10px;
+	height: 36px;
+	background-image: url('tab_b.png');
+	z-index: 101;
+	overflow: hidden;
+	font-size: 13px;
+}
+
+.navpath ul
+{
+	font-size: 11px;
+	background-image:url('tab_b.png');
+	background-repeat:repeat-x;
+	background-position: 0 -5px;
+	height:30px;
+	line-height:30px;
+	color:#8AA0CC;
+	border:solid 1px #C2CDE4;
+	overflow:hidden;
+	margin:0px;
+	padding:0px;
+}
+
+.navpath li
+{
+	list-style-type:none;
+	float:left;
+	padding-left:10px;
+	padding-right:15px;
+	background-image:url('bc_s.png');
+	background-repeat:no-repeat;
+	background-position:right;
+	color:#364D7C;
+}
+
+.navpath li.navelem a
+{
+	height:32px;
+	display:block;
+	text-decoration: none;
+	outline: none;
+	color: #283A5D;
+	font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+	text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+	text-decoration: none;        
+}
+
+.navpath li.navelem a:hover
+{
+	color:#6884BD;
+}
+
+.navpath li.footer
+{
+        list-style-type:none;
+        float:right;
+        padding-left:10px;
+        padding-right:15px;
+        background-image:none;
+        background-repeat:no-repeat;
+        background-position:right;
+        color:#364D7C;
+        font-size: 8pt;
+}
+
+
+div.summary
+{
+	float: right;
+	font-size: 8pt;
+	padding-right: 5px;
+	width: 50%;
+	text-align: right;
+}       
+
+div.summary a
+{
+	white-space: nowrap;
+}
+
+div.ingroups
+{
+	font-size: 8pt;
+	width: 50%;
+	text-align: left;
+}
+
+div.ingroups a
+{
+	white-space: nowrap;
+}
+
+div.header
+{
+        background-image:url('nav_h.png');
+        background-repeat:repeat-x;
+	background-color: #F9FAFC;
+	margin:  0px;
+	border-bottom: 1px solid #C4CFE5;
+}
+
+div.headertitle
+{
+	padding: 5px 5px 5px 10px;
+}
+
+dl
+{
+        padding: 0 0 0 10px;
+}
+
+/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */
+dl.section
+{
+	margin-left: 0px;
+	padding-left: 0px;
+}
+
+dl.note
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #D0C000;
+}
+
+dl.warning, dl.attention
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #FF0000;
+}
+
+dl.pre, dl.post, dl.invariant
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #00D000;
+}
+
+dl.deprecated
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #505050;
+}
+
+dl.todo
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #00C0E0;
+}
+
+dl.test
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #3030E0;
+}
+
+dl.bug
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #C08050;
+}
+
+dl.section dd {
+	margin-bottom: 6px;
+}
+
+
+#projectlogo
+{
+	text-align: center;
+	vertical-align: bottom;
+	border-collapse: separate;
+}
+ 
+#projectlogo img
+{ 
+	border: 0px none;
+}
+ 
+#projectname
+{
+	font: 300% Tahoma, Arial,sans-serif;
+	margin: 0px;
+	padding: 2px 0px;
+}
+    
+#projectbrief
+{
+	font: 120% Tahoma, Arial,sans-serif;
+	margin: 0px;
+	padding: 0px;
+}
+
+#projectnumber
+{
+	font: 50% Tahoma, Arial,sans-serif;
+	margin: 0px;
+	padding: 0px;
+}
+
+#titlearea
+{
+	padding: 0px;
+	margin: 0px;
+	width: 100%;
+	border-bottom: 1px solid #5373B4;
+}
+
+.image
+{
+        text-align: center;
+}
+
+.dotgraph
+{
+        text-align: center;
+}
+
+.mscgraph
+{
+        text-align: center;
+}
+
+.caption
+{
+	font-weight: bold;
+}
+
+div.zoom
+{
+	border: 1px solid #90A5CE;
+}
+
+dl.citelist {
+        margin-bottom:50px;
+}
+
+dl.citelist dt {
+        color:#334975;
+        float:left;
+        font-weight:bold;
+        margin-right:10px;
+        padding:5px;
+}
+
+dl.citelist dd {
+        margin:2px 0;
+        padding:5px 0;
+}
+
+div.toc {
+        padding: 14px 25px;
+        background-color: #F4F6FA;
+        border: 1px solid #D8DFEE;
+        border-radius: 7px 7px 7px 7px;
+        float: right;
+        height: auto;
+        margin: 0 20px 10px 10px;
+        width: 200px;
+}
+
+div.toc li {
+        background: url("bdwn.png") no-repeat scroll 0 5px transparent;
+        font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif;
+        margin-top: 5px;
+        padding-left: 10px;
+        padding-top: 2px;
+}
+
+div.toc h3 {
+        font: bold 12px/1.2 Arial,FreeSans,sans-serif;
+	color: #4665A2;
+        border-bottom: 0 none;
+        margin: 0;
+}
+
+div.toc ul {
+        list-style: none outside none;
+        border: medium none;
+        padding: 0px;
+}       
+
+div.toc li.level1 {
+        margin-left: 0px;
+}
+
+div.toc li.level2 {
+        margin-left: 15px;
+}
+
+div.toc li.level3 {
+        margin-left: 30px;
+}
+
+div.toc li.level4 {
+        margin-left: 45px;
+}
+
+.inherit_header {
+        font-weight: bold;
+        color: gray;
+        cursor: pointer;
+	-webkit-touch-callout: none;
+	-webkit-user-select: none;
+	-khtml-user-select: none;
+	-moz-user-select: none;
+	-ms-user-select: none;
+	user-select: none;
+}
+
+.inherit_header td {
+        padding: 6px 0px 2px 5px;
+}
+
+.inherit {
+        display: none;
+}
+
+tr.heading h2 {
+        margin-top: 12px;
+        margin-bottom: 4px;
+}
+
+/* tooltip related style info */
+
+.ttc {
+        position: absolute;
+        display: none;
+}
+
+#powerTip {
+	cursor: default;
+	white-space: nowrap;
+	background-color: white;
+	border: 1px solid gray;
+	border-radius: 4px 4px 4px 4px;
+	box-shadow: 1px 1px 7px gray;
+	display: none;
+	font-size: smaller;
+	max-width: 80%;
+	opacity: 0.9;
+	padding: 1ex 1em 1em;
+	position: absolute;
+	z-index: 2147483647;
+}
+
+#powerTip div.ttdoc {
+        color: grey;
+	font-style: italic;
+}
+
+#powerTip div.ttname a {
+        font-weight: bold;
+}
+
+#powerTip div.ttname {
+        font-weight: bold;
+}
+
+#powerTip div.ttdeci {
+        color: #006318;
+}
+
+#powerTip div {
+        margin: 0px;
+        padding: 0px;
+        font: 12px/16px Roboto,sans-serif;
+}
+
+#powerTip:before, #powerTip:after {
+	content: "";
+	position: absolute;
+	margin: 0px;
+}
+
+#powerTip.n:after,  #powerTip.n:before,
+#powerTip.s:after,  #powerTip.s:before,
+#powerTip.w:after,  #powerTip.w:before,
+#powerTip.e:after,  #powerTip.e:before,
+#powerTip.ne:after, #powerTip.ne:before,
+#powerTip.se:after, #powerTip.se:before,
+#powerTip.nw:after, #powerTip.nw:before,
+#powerTip.sw:after, #powerTip.sw:before {
+	border: solid transparent;
+	content: " ";
+	height: 0;
+	width: 0;
+	position: absolute;
+}
+
+#powerTip.n:after,  #powerTip.s:after,
+#powerTip.w:after,  #powerTip.e:after,
+#powerTip.nw:after, #powerTip.ne:after,
+#powerTip.sw:after, #powerTip.se:after {
+	border-color: rgba(255, 255, 255, 0);
+}
+
+#powerTip.n:before,  #powerTip.s:before,
+#powerTip.w:before,  #powerTip.e:before,
+#powerTip.nw:before, #powerTip.ne:before,
+#powerTip.sw:before, #powerTip.se:before {
+	border-color: rgba(128, 128, 128, 0);
+}
+
+#powerTip.n:after,  #powerTip.n:before,
+#powerTip.ne:after, #powerTip.ne:before,
+#powerTip.nw:after, #powerTip.nw:before {
+	top: 100%;
+}
+
+#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after {
+	border-top-color: #ffffff;
+	border-width: 10px;
+	margin: 0px -10px;
+}
+#powerTip.n:before {
+	border-top-color: #808080;
+	border-width: 11px;
+	margin: 0px -11px;
+}
+#powerTip.n:after, #powerTip.n:before {
+	left: 50%;
+}
+
+#powerTip.nw:after, #powerTip.nw:before {
+	right: 14px;
+}
+
+#powerTip.ne:after, #powerTip.ne:before {
+	left: 14px;
+}
+
+#powerTip.s:after,  #powerTip.s:before,
+#powerTip.se:after, #powerTip.se:before,
+#powerTip.sw:after, #powerTip.sw:before {
+	bottom: 100%;
+}
+
+#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after {
+	border-bottom-color: #ffffff;
+	border-width: 10px;
+	margin: 0px -10px;
+}
+
+#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before {
+	border-bottom-color: #808080;
+	border-width: 11px;
+	margin: 0px -11px;
+}
+
+#powerTip.s:after, #powerTip.s:before {
+	left: 50%;
+}
+
+#powerTip.sw:after, #powerTip.sw:before {
+	right: 14px;
+}
+
+#powerTip.se:after, #powerTip.se:before {
+	left: 14px;
+}
+
+#powerTip.e:after, #powerTip.e:before {
+	left: 100%;
+}
+#powerTip.e:after {
+	border-left-color: #ffffff;
+	border-width: 10px;
+	top: 50%;
+	margin-top: -10px;
+}
+#powerTip.e:before {
+	border-left-color: #808080;
+	border-width: 11px;
+	top: 50%;
+	margin-top: -11px;
+}
+
+#powerTip.w:after, #powerTip.w:before {
+	right: 100%;
+}
+#powerTip.w:after {
+	border-right-color: #ffffff;
+	border-width: 10px;
+	top: 50%;
+	margin-top: -10px;
+}
+#powerTip.w:before {
+	border-right-color: #808080;
+	border-width: 11px;
+	top: 50%;
+	margin-top: -11px;
+}
+
+@media print
+{
+  #top { display: none; }
+  #side-nav { display: none; }
+  #nav-path { display: none; }
+  body { overflow:visible; }
+  h1, h2, h3, h4, h5, h6 { page-break-after: avoid; }
+  .summary { display: none; }
+  .memitem { page-break-inside: avoid; }
+  #doc-content
+  {
+    margin-left:0 !important;
+    height:auto !important;
+    width:auto !important;
+    overflow:inherit;
+    display:inline;
+  }
+}
+

BIN
NRF24_for_attiny/doc/doxygen.png


+ 97 - 0
NRF24_for_attiny/doc/dynsections.js

@@ -0,0 +1,97 @@
+function toggleVisibility(linkObj)
+{
+ var base = $(linkObj).attr('id');
+ var summary = $('#'+base+'-summary');
+ var content = $('#'+base+'-content');
+ var trigger = $('#'+base+'-trigger');
+ var src=$(trigger).attr('src');
+ if (content.is(':visible')===true) {
+   content.hide();
+   summary.show();
+   $(linkObj).addClass('closed').removeClass('opened');
+   $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png');
+ } else {
+   content.show();
+   summary.hide();
+   $(linkObj).removeClass('closed').addClass('opened');
+   $(trigger).attr('src',src.substring(0,src.length-10)+'open.png');
+ } 
+ return false;
+}
+
+function updateStripes()
+{
+  $('table.directory tr').
+       removeClass('even').filter(':visible:even').addClass('even');
+}
+function toggleLevel(level)
+{
+  $('table.directory tr').each(function(){ 
+    var l = this.id.split('_').length-1;
+    var i = $('#img'+this.id.substring(3));
+    var a = $('#arr'+this.id.substring(3));
+    if (l<level+1) {
+      i.attr('src','ftv2folderopen.png');
+      a.attr('src','ftv2mnode.png');
+      $(this).show();
+    } else if (l==level+1) {
+      i.attr('src','ftv2folderclosed.png');
+      a.attr('src','ftv2pnode.png');
+      $(this).show();
+    } else {
+      $(this).hide();
+    }
+  });
+  updateStripes();
+}
+
+function toggleFolder(id)
+{
+  //The clicked row
+  var currentRow = $('#row_'+id);
+  var currentRowImages = currentRow.find("img");
+
+  //All rows after the clicked row
+  var rows = currentRow.nextAll("tr");
+
+  //Only match elements AFTER this one (can't hide elements before)
+  var childRows = rows.filter(function() {
+    var re = new RegExp('^row_'+id+'\\d+_$', "i"); //only one sub
+    return this.id.match(re);
+  });
+
+  //First row is visible we are HIDING
+  if (childRows.filter(':first').is(':visible')===true) {
+    currentRowImages.filter("[id^=arr]").attr('src', 'ftv2pnode.png');
+    currentRowImages.filter("[id^=img]").attr('src', 'ftv2folderclosed.png');
+    rows.filter("[id^=row_"+id+"]").hide();
+  } else { //We are SHOWING
+    //All sub images
+    var childImages = childRows.find("img");
+    var childImg = childImages.filter("[id^=img]");
+    var childArr = childImages.filter("[id^=arr]");
+
+    currentRow.find("[id^=arr]").attr('src', 'ftv2mnode.png'); //open row
+    currentRow.find("[id^=img]").attr('src', 'ftv2folderopen.png'); //open row
+    childImg.attr('src','ftv2folderclosed.png'); //children closed
+    childArr.attr('src','ftv2pnode.png'); //children closed
+    childRows.show(); //show all children
+  }
+  updateStripes();
+}
+
+
+function toggleInherit(id)
+{
+  var rows = $('tr.inherit.'+id);
+  var img = $('tr.inherit_header.'+id+' img');
+  var src = $(img).attr('src');
+  if (rows.filter(':first').is(':visible')===true) {
+    rows.css('display','none');
+    $(img).attr('src',src.substring(0,src.length-8)+'closed.png');
+  } else {
+    rows.css('display','table-row'); // using show() causes jump in firefox
+    $(img).attr('src',src.substring(0,src.length-10)+'open.png');
+  }
+}
+

+ 69 - 0
NRF24_for_attiny/doc/examples.html

@@ -0,0 +1,69 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.5"/>
+<title>NRF24: Examples</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">NRF24
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.5 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li class="current"><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">Examples</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here is a list of all examples:</div><ul>
+<li><a class="el" href="crazyflie_8ino-example.html">crazyflie.ino</a></li>
+
+<li><a class="el" href="crazyflie_client_8ino-example.html">crazyflie_client.ino</a></li>
+
+<li><a class="el" href="nrf24_audio_rx_8pde-example.html">nrf24_audio_rx.pde</a></li>
+
+<li><a class="el" href="nrf24_audio_tx_8pde-example.html">nrf24_audio_tx.pde</a></li>
+
+<li><a class="el" href="nrf24_ping_client_8pde-example.html">nrf24_ping_client.pde</a></li>
+
+<li><a class="el" href="nrf24_ping_server_8pde-example.html">nrf24_ping_server.pde</a></li>
+
+<li><a class="el" href="nrf24_specan_8pde-example.html">nrf24_specan.pde</a></li>
+
+<li><a class="el" href="nrf24_test_8pde-example.html">nrf24_test.pde</a></li>
+
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.5
+</small></address>
+</body>
+</html>

+ 61 - 0
NRF24_for_attiny/doc/files.html

@@ -0,0 +1,61 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.5"/>
+<title>NRF24: File List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">NRF24
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.5 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="files.html"><span>File&#160;List</span></a></li>
+    </ul>
+  </div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">File List</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here is a list of all documented files with brief descriptions:</div><div class="directory">
+<table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="NRF24_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>NRF24.h</b></td><td class="desc"></td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.5
+</small></address>
+</body>
+</html>

BIN
NRF24_for_attiny/doc/ftv2blank.png


BIN
NRF24_for_attiny/doc/ftv2cl.png


BIN
NRF24_for_attiny/doc/ftv2doc.png


BIN
NRF24_for_attiny/doc/ftv2folderclosed.png


BIN
NRF24_for_attiny/doc/ftv2folderopen.png


BIN
NRF24_for_attiny/doc/ftv2lastnode.png


BIN
NRF24_for_attiny/doc/ftv2link.png


BIN
NRF24_for_attiny/doc/ftv2mlastnode.png


BIN
NRF24_for_attiny/doc/ftv2mnode.png


BIN
NRF24_for_attiny/doc/ftv2mo.png


BIN
NRF24_for_attiny/doc/ftv2node.png


BIN
NRF24_for_attiny/doc/ftv2ns.png


BIN
NRF24_for_attiny/doc/ftv2plastnode.png


BIN
NRF24_for_attiny/doc/ftv2pnode.png


BIN
NRF24_for_attiny/doc/ftv2splitbar.png


BIN
NRF24_for_attiny/doc/ftv2vertline.png


+ 231 - 0
NRF24_for_attiny/doc/functions.html

@@ -0,0 +1,231 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.5"/>
+<title>NRF24: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">NRF24
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.5 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow3" class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_enum.html"><span>Enumerations</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow4" class="tabs3">
+    <ul class="tablist">
+      <li><a href="#index_a"><span>a</span></a></li>
+      <li><a href="#index_f"><span>f</span></a></li>
+      <li><a href="#index_i"><span>i</span></a></li>
+      <li><a href="#index_n"><span>n</span></a></li>
+      <li><a href="#index_p"><span>p</span></a></li>
+      <li><a href="#index_r"><span>r</span></a></li>
+      <li><a href="#index_s"><span>s</span></a></li>
+      <li><a href="#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div><!-- top -->
+<div class="contents">
+<div class="textblock">Here is a list of all documented class members with links to the class documentation for each member:</div>
+
+<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
+<li>available()
+: <a class="el" href="classNRF24.html#a84a25d5654902ed6b69d3a0de9422cfd">NRF24</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_f"></a>- f -</h3><ul>
+<li>flushRx()
+: <a class="el" href="classNRF24.html#a9d3d0d432b09d3403a52aa9a78d3f848">NRF24</a>
+</li>
+<li>flushTx()
+: <a class="el" href="classNRF24.html#a644f3b4fd446438fb340b52df4216ba9">NRF24</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_i"></a>- i -</h3><ul>
+<li>init()
+: <a class="el" href="classNRF24.html#a6e98cf508939240c1805245170a995f6">NRF24</a>
+</li>
+<li>isSending()
+: <a class="el" href="classNRF24.html#aaff7453d951c74e87ca845e708742252">NRF24</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_n"></a>- n -</h3><ul>
+<li>NRF24()
+: <a class="el" href="classNRF24.html#ab0eb09c01f73bee4ff6935c0503a8ace">NRF24</a>
+</li>
+<li>NRF24DataRate
+: <a class="el" href="classNRF24.html#a52d7af9188397d4a6f5dab55d4f04742">NRF24</a>
+</li>
+<li>NRF24DataRate1Mbps
+: <a class="el" href="classNRF24.html#a52d7af9188397d4a6f5dab55d4f04742a774c99f9cf1c98cb883d4a01c1444c52">NRF24</a>
+</li>
+<li>NRF24DataRate250kbps
+: <a class="el" href="classNRF24.html#a52d7af9188397d4a6f5dab55d4f04742ae4523002495ee537f2731b61a220e3af">NRF24</a>
+</li>
+<li>NRF24DataRate2Mbps
+: <a class="el" href="classNRF24.html#a52d7af9188397d4a6f5dab55d4f04742aca0c89dd1b40bdc57b7026d8da54de9a">NRF24</a>
+</li>
+<li>NRF24TransmitPower
+: <a class="el" href="classNRF24.html#a8386e81a9a4b824ab26e785879684c7e">NRF24</a>
+</li>
+<li>NRF24TransmitPower0dBm
+: <a class="el" href="classNRF24.html#a8386e81a9a4b824ab26e785879684c7eacef1d6c037e276e6dadaff2b6056ec0c">NRF24</a>
+</li>
+<li>NRF24TransmitPowerm12dBm
+: <a class="el" href="classNRF24.html#a8386e81a9a4b824ab26e785879684c7eacce8a36a9753c7c125ad6db450ddfff8">NRF24</a>
+</li>
+<li>NRF24TransmitPowerm18dBm
+: <a class="el" href="classNRF24.html#a8386e81a9a4b824ab26e785879684c7ea4790420d436218aa3bf4c23687664853">NRF24</a>
+</li>
+<li>NRF24TransmitPowerm6dBm
+: <a class="el" href="classNRF24.html#a8386e81a9a4b824ab26e785879684c7eaf8351d714335d0c24bcbb8d3c983d5c7">NRF24</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<li>powerDown()
+: <a class="el" href="classNRF24.html#a5f40f4c8dcb3b5e097510dc6396c7f9b">NRF24</a>
+</li>
+<li>powerUpRx()
+: <a class="el" href="classNRF24.html#a9e15babbfa487da3425b19c60a93c057">NRF24</a>
+</li>
+<li>powerUpTx()
+: <a class="el" href="classNRF24.html#a796cb1901211284a958197d657d6f164">NRF24</a>
+</li>
+<li>printRegisters()
+: <a class="el" href="classNRF24.html#ab6b14a05c78e40f0491793dcb73c8274">NRF24</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
+<li>recv()
+: <a class="el" href="classNRF24.html#a12799e0afcb52f2a8cb7418dca9e0eab">NRF24</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
+<li>send()
+: <a class="el" href="classNRF24.html#aad280539b80b28e55ab3187714bc7f2f">NRF24</a>
+</li>
+<li>setChannel()
+: <a class="el" href="classNRF24.html#a3fa90005f98eb2744a533899f9b7e023">NRF24</a>
+</li>
+<li>setConfiguration()
+: <a class="el" href="classNRF24.html#a790d69e5cb1039fb2924f9405e30e250">NRF24</a>
+</li>
+<li>setPayloadSize()
+: <a class="el" href="classNRF24.html#adb2fbd1d1aadaad1e9b268508149b6c8">NRF24</a>
+</li>
+<li>setPipeAddress()
+: <a class="el" href="classNRF24.html#a28b29969592f9f59c267ae7ffa020b2b">NRF24</a>
+</li>
+<li>setRetry()
+: <a class="el" href="classNRF24.html#a1ac9bfce3833725b8b66d9875a8bc00e">NRF24</a>
+</li>
+<li>setRF()
+: <a class="el" href="classNRF24.html#a3453db8390d5be4aa99d8c7fde3062a4">NRF24</a>
+</li>
+<li>setThisAddress()
+: <a class="el" href="classNRF24.html#ade21e0bd4f92d0dfa45909bbbb0e4b01">NRF24</a>
+</li>
+<li>setTransmitAddress()
+: <a class="el" href="classNRF24.html#a7b40c4c481bddf343acdac5179fddc75">NRF24</a>
+</li>
+<li>spiBurstRead()
+: <a class="el" href="classNRF24.html#a448aad6cda19f068009106aa5f6a7e6a">NRF24</a>
+</li>
+<li>spiBurstReadRegister()
+: <a class="el" href="classNRF24.html#abc48bb5a86d0bb498c753dc47cea8daa">NRF24</a>
+</li>
+<li>spiBurstWrite()
+: <a class="el" href="classNRF24.html#a01161d0ba54c409e62ad670b9eceb73d">NRF24</a>
+</li>
+<li>spiBurstWriteRegister()
+: <a class="el" href="classNRF24.html#a8562055be6ba65ca8fc292be5f8abc5a">NRF24</a>
+</li>
+<li>spiCommand()
+: <a class="el" href="classNRF24.html#a08ae66610a928a779c0b256e782128b5">NRF24</a>
+</li>
+<li>spiRead()
+: <a class="el" href="classNRF24.html#ab2f002c33ec719dfdd3ae70d70559254">NRF24</a>
+</li>
+<li>spiReadRegister()
+: <a class="el" href="classNRF24.html#a264f427858362e106705d92152bc634e">NRF24</a>
+</li>
+<li>spiWrite()
+: <a class="el" href="classNRF24.html#a16f168ffe059120ba696936cd6bd76f1">NRF24</a>
+</li>
+<li>spiWriteRegister()
+: <a class="el" href="classNRF24.html#a81931bc1679b213b1cb1ae65b8357985">NRF24</a>
+</li>
+<li>statusRead()
+: <a class="el" href="classNRF24.html#a9940479d33d554cab35d50b99112a166">NRF24</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_w"></a>- w -</h3><ul>
+<li>waitAvailable()
+: <a class="el" href="classNRF24.html#a5260f3e5eeb911e720290e652f628ab5">NRF24</a>
+</li>
+<li>waitAvailableTimeout()
+: <a class="el" href="classNRF24.html#ae36ca859ea942a6e9480e8747a27921e">NRF24</a>
+</li>
+<li>waitPacketSent()
+: <a class="el" href="classNRF24.html#a78a011cddedb14b8764ad5ea760c28ae">NRF24</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.5
+</small></address>
+</body>
+</html>

+ 69 - 0
NRF24_for_attiny/doc/functions_enum.html

@@ -0,0 +1,69 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.5"/>
+<title>NRF24: Class Members - Enumerations</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">NRF24
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.5 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow3" class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li class="current"><a href="functions_enum.html"><span>Enumerations</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+    </ul>
+  </div>
+</div><!-- top -->
+<div class="contents">
+&#160;<ul>
+<li>NRF24DataRate
+: <a class="el" href="classNRF24.html#a52d7af9188397d4a6f5dab55d4f04742">NRF24</a>
+</li>
+<li>NRF24TransmitPower
+: <a class="el" href="classNRF24.html#a8386e81a9a4b824ab26e785879684c7e">NRF24</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.5
+</small></address>
+</body>
+</html>

+ 84 - 0
NRF24_for_attiny/doc/functions_eval.html

@@ -0,0 +1,84 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.5"/>
+<title>NRF24: Class Members - Enumerator</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">NRF24
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.5 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow3" class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_enum.html"><span>Enumerations</span></a></li>
+      <li class="current"><a href="functions_eval.html"><span>Enumerator</span></a></li>
+    </ul>
+  </div>
+</div><!-- top -->
+<div class="contents">
+&#160;<ul>
+<li>NRF24DataRate1Mbps
+: <a class="el" href="classNRF24.html#a52d7af9188397d4a6f5dab55d4f04742a774c99f9cf1c98cb883d4a01c1444c52">NRF24</a>
+</li>
+<li>NRF24DataRate250kbps
+: <a class="el" href="classNRF24.html#a52d7af9188397d4a6f5dab55d4f04742ae4523002495ee537f2731b61a220e3af">NRF24</a>
+</li>
+<li>NRF24DataRate2Mbps
+: <a class="el" href="classNRF24.html#a52d7af9188397d4a6f5dab55d4f04742aca0c89dd1b40bdc57b7026d8da54de9a">NRF24</a>
+</li>
+<li>NRF24TransmitPower0dBm
+: <a class="el" href="classNRF24.html#a8386e81a9a4b824ab26e785879684c7eacef1d6c037e276e6dadaff2b6056ec0c">NRF24</a>
+</li>
+<li>NRF24TransmitPowerm12dBm
+: <a class="el" href="classNRF24.html#a8386e81a9a4b824ab26e785879684c7eacce8a36a9753c7c125ad6db450ddfff8">NRF24</a>
+</li>
+<li>NRF24TransmitPowerm18dBm
+: <a class="el" href="classNRF24.html#a8386e81a9a4b824ab26e785879684c7ea4790420d436218aa3bf4c23687664853">NRF24</a>
+</li>
+<li>NRF24TransmitPowerm6dBm
+: <a class="el" href="classNRF24.html#a8386e81a9a4b824ab26e785879684c7eaf8351d714335d0c24bcbb8d3c983d5c7">NRF24</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.5
+</small></address>
+</body>
+</html>

+ 204 - 0
NRF24_for_attiny/doc/functions_func.html

@@ -0,0 +1,204 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.5"/>
+<title>NRF24: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">NRF24
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.5 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow3" class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_enum.html"><span>Enumerations</span></a></li>
+      <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow4" class="tabs3">
+    <ul class="tablist">
+      <li><a href="#index_a"><span>a</span></a></li>
+      <li><a href="#index_f"><span>f</span></a></li>
+      <li><a href="#index_i"><span>i</span></a></li>
+      <li><a href="#index_n"><span>n</span></a></li>
+      <li><a href="#index_p"><span>p</span></a></li>
+      <li><a href="#index_r"><span>r</span></a></li>
+      <li><a href="#index_s"><span>s</span></a></li>
+      <li><a href="#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div><!-- top -->
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
+<li>available()
+: <a class="el" href="classNRF24.html#a84a25d5654902ed6b69d3a0de9422cfd">NRF24</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_f"></a>- f -</h3><ul>
+<li>flushRx()
+: <a class="el" href="classNRF24.html#a9d3d0d432b09d3403a52aa9a78d3f848">NRF24</a>
+</li>
+<li>flushTx()
+: <a class="el" href="classNRF24.html#a644f3b4fd446438fb340b52df4216ba9">NRF24</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_i"></a>- i -</h3><ul>
+<li>init()
+: <a class="el" href="classNRF24.html#a6e98cf508939240c1805245170a995f6">NRF24</a>
+</li>
+<li>isSending()
+: <a class="el" href="classNRF24.html#aaff7453d951c74e87ca845e708742252">NRF24</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_n"></a>- n -</h3><ul>
+<li>NRF24()
+: <a class="el" href="classNRF24.html#ab0eb09c01f73bee4ff6935c0503a8ace">NRF24</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<li>powerDown()
+: <a class="el" href="classNRF24.html#a5f40f4c8dcb3b5e097510dc6396c7f9b">NRF24</a>
+</li>
+<li>powerUpRx()
+: <a class="el" href="classNRF24.html#a9e15babbfa487da3425b19c60a93c057">NRF24</a>
+</li>
+<li>powerUpTx()
+: <a class="el" href="classNRF24.html#a796cb1901211284a958197d657d6f164">NRF24</a>
+</li>
+<li>printRegisters()
+: <a class="el" href="classNRF24.html#ab6b14a05c78e40f0491793dcb73c8274">NRF24</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
+<li>recv()
+: <a class="el" href="classNRF24.html#a12799e0afcb52f2a8cb7418dca9e0eab">NRF24</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
+<li>send()
+: <a class="el" href="classNRF24.html#aad280539b80b28e55ab3187714bc7f2f">NRF24</a>
+</li>
+<li>setChannel()
+: <a class="el" href="classNRF24.html#a3fa90005f98eb2744a533899f9b7e023">NRF24</a>
+</li>
+<li>setConfiguration()
+: <a class="el" href="classNRF24.html#a790d69e5cb1039fb2924f9405e30e250">NRF24</a>
+</li>
+<li>setPayloadSize()
+: <a class="el" href="classNRF24.html#adb2fbd1d1aadaad1e9b268508149b6c8">NRF24</a>
+</li>
+<li>setPipeAddress()
+: <a class="el" href="classNRF24.html#a28b29969592f9f59c267ae7ffa020b2b">NRF24</a>
+</li>
+<li>setRetry()
+: <a class="el" href="classNRF24.html#a1ac9bfce3833725b8b66d9875a8bc00e">NRF24</a>
+</li>
+<li>setRF()
+: <a class="el" href="classNRF24.html#a3453db8390d5be4aa99d8c7fde3062a4">NRF24</a>
+</li>
+<li>setThisAddress()
+: <a class="el" href="classNRF24.html#ade21e0bd4f92d0dfa45909bbbb0e4b01">NRF24</a>
+</li>
+<li>setTransmitAddress()
+: <a class="el" href="classNRF24.html#a7b40c4c481bddf343acdac5179fddc75">NRF24</a>
+</li>
+<li>spiBurstRead()
+: <a class="el" href="classNRF24.html#a448aad6cda19f068009106aa5f6a7e6a">NRF24</a>
+</li>
+<li>spiBurstReadRegister()
+: <a class="el" href="classNRF24.html#abc48bb5a86d0bb498c753dc47cea8daa">NRF24</a>
+</li>
+<li>spiBurstWrite()
+: <a class="el" href="classNRF24.html#a01161d0ba54c409e62ad670b9eceb73d">NRF24</a>
+</li>
+<li>spiBurstWriteRegister()
+: <a class="el" href="classNRF24.html#a8562055be6ba65ca8fc292be5f8abc5a">NRF24</a>
+</li>
+<li>spiCommand()
+: <a class="el" href="classNRF24.html#a08ae66610a928a779c0b256e782128b5">NRF24</a>
+</li>
+<li>spiRead()
+: <a class="el" href="classNRF24.html#ab2f002c33ec719dfdd3ae70d70559254">NRF24</a>
+</li>
+<li>spiReadRegister()
+: <a class="el" href="classNRF24.html#a264f427858362e106705d92152bc634e">NRF24</a>
+</li>
+<li>spiWrite()
+: <a class="el" href="classNRF24.html#a16f168ffe059120ba696936cd6bd76f1">NRF24</a>
+</li>
+<li>spiWriteRegister()
+: <a class="el" href="classNRF24.html#a81931bc1679b213b1cb1ae65b8357985">NRF24</a>
+</li>
+<li>statusRead()
+: <a class="el" href="classNRF24.html#a9940479d33d554cab35d50b99112a166">NRF24</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_w"></a>- w -</h3><ul>
+<li>waitAvailable()
+: <a class="el" href="classNRF24.html#a5260f3e5eeb911e720290e652f628ab5">NRF24</a>
+</li>
+<li>waitAvailableTimeout()
+: <a class="el" href="classNRF24.html#ae36ca859ea942a6e9480e8747a27921e">NRF24</a>
+</li>
+<li>waitPacketSent()
+: <a class="el" href="classNRF24.html#a78a011cddedb14b8764ad5ea760c28ae">NRF24</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.5
+</small></address>
+</body>
+</html>

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 42 - 0
NRF24_for_attiny/doc/index.html


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 15 - 0
NRF24_for_attiny/doc/jquery.js


BIN
NRF24_for_attiny/doc/nav_f.png


BIN
NRF24_for_attiny/doc/nav_g.png


BIN
NRF24_for_attiny/doc/nav_h.png


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 42 - 0
NRF24_for_attiny/doc/nrf24_audio_rx_8pde-example.html


+ 117 - 0
NRF24_for_attiny/doc/nrf24_audio_tx_8pde-example.html

@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.5"/>
+<title>NRF24: nrf24_audio_tx.pde</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">NRF24
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.5 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">nrf24_audio_tx.pde</div>  </div>
+</div><!--header-->
+<div class="contents">
+<p>Example sketch showing how to create an audio digital transmitter with the <a class="el" href="classNRF24.html" title="Send and receive addressed, reliable, acknowledged datagrams by nRF24L01. ">NRF24</a> class. Connect a 1Vp-p audio sigal to analog input 0, connected through a 1uF capacitor Works with the nrf24_audio_rx sample receiver The audio quality is poor: dont expect hi-fi!</p>
+<p>This code sends about 250 messages per second, each with 32 8 bit samples from analog input 0 It uses the NRF4 in NOACK mode. The receiver never acknowledges or replies Tested on UNO</p>
+<div class="fragment"><div class="line"><span class="comment">// nrf24_audio_tx.pde</span></div>
+<div class="line"><span class="comment">// -*- mode: C++ -*-</span></div>
+<div class="line"><span class="comment">// Example sketch showing how to create an audio digital transmitter </span></div>
+<div class="line"><span class="comment">// with the NRF24 class. </span></div>
+<div class="line"><span class="comment">// Connect a 1Vp-p audio sigal to analog input 0, connected through a 1uF capacitor</span></div>
+<div class="line"><span class="comment">// Works with the nrf24_audio_rx sample receiver</span></div>
+<div class="line"><span class="comment">// The audio quality is poor: dont expect hi-fi!</span></div>
+<div class="line"><span class="comment">//</span></div>
+<div class="line"><span class="comment">// This code sends about 250 messages per second, each with 32 8 bit samples from analog input 0</span></div>
+<div class="line"><span class="comment">// It uses the NRF4 in NOACK mode. The receiver never acknowledges or replies</span></div>
+<div class="line"><span class="comment">// Tested on UNO</span></div>
+<div class="line"></div>
+<div class="line"><span class="preprocessor">#include &lt;NRF24.h&gt;</span></div>
+<div class="line"><span class="preprocessor">#include &lt;SPI.h&gt;</span></div>
+<div class="line"></div>
+<div class="line"></div>
+<div class="line"><span class="comment">// Singleton instance of the radio</span></div>
+<div class="line"><a name="_a0"></a><a class="code" href="classNRF24.html">NRF24</a> nrf24;</div>
+<div class="line"><span class="comment">// NRF24 nrf24(8, 7); // use this to be electrically compatible with Mirf</span></div>
+<div class="line"><span class="comment">// NRF24 nrf24(8, 10);// For Leonardo, need explicit SS pin</span></div>
+<div class="line"></div>
+<div class="line"><span class="keywordtype">void</span> setup() </div>
+<div class="line">{</div>
+<div class="line">  Serial.begin(9600);</div>
+<div class="line">  <span class="keywordflow">while</span> (!Serial) </div>
+<div class="line">    ; <span class="comment">// wait for serial port to connect. Needed for Leonardo only</span></div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a1"></a><a class="code" href="classNRF24.html#a6e98cf508939240c1805245170a995f6">init</a>())</div>
+<div class="line">    Serial.println(<span class="stringliteral">&quot;NRF24 init failed&quot;</span>);</div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a2"></a><a class="code" href="classNRF24.html#a3fa90005f98eb2744a533899f9b7e023">setChannel</a>(1))</div>
+<div class="line">    Serial.println(<span class="stringliteral">&quot;setChannel failed&quot;</span>);</div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a3"></a><a class="code" href="classNRF24.html#adb2fbd1d1aadaad1e9b268508149b6c8">setPayloadSize</a>(32))</div>
+<div class="line">    Serial.println(<span class="stringliteral">&quot;setPayloadSize failed&quot;</span>);</div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a4"></a><a class="code" href="classNRF24.html#a3453db8390d5be4aa99d8c7fde3062a4">setRF</a>(<a name="a5"></a><a class="code" href="classNRF24.html#a52d7af9188397d4a6f5dab55d4f04742aca0c89dd1b40bdc57b7026d8da54de9a">NRF24::NRF24DataRate2Mbps</a>, <a name="a6"></a><a class="code" href="classNRF24.html#a8386e81a9a4b824ab26e785879684c7eacef1d6c037e276e6dadaff2b6056ec0c">NRF24::NRF24TransmitPower0dBm</a>))</div>
+<div class="line">    Serial.println(<span class="stringliteral">&quot;setRF failed&quot;</span>);    </div>
+<div class="line">  <span class="comment">// Enable the EN_DYN_ACK feature so we can use noack</span></div>
+<div class="line">  nrf24.<a name="a7"></a><a class="code" href="classNRF24.html#a81931bc1679b213b1cb1ae65b8357985">spiWriteRegister</a>(NRF24_REG_1D_FEATURE, NRF24_EN_DYN_ACK);</div>
+<div class="line">  analogReference(INTERNAL); <span class="comment">// So we can read 1Vp-p signals</span></div>
+<div class="line">  Serial.println(<span class="stringliteral">&quot;initialised&quot;</span>);</div>
+<div class="line">}</div>
+<div class="line">  </div>
+<div class="line"><span class="keywordtype">void</span> loop()</div>
+<div class="line">{</div>
+<div class="line">  uint8_t buf[32];</div>
+<div class="line">  uint8_t i;</div>
+<div class="line">  </div>
+<div class="line">  <span class="comment">// Collect 32 audio samples. At 109 microsecs per sample, we can achieve about 250</span></div>
+<div class="line">  <span class="comment">// 32 byte packets transmitted per second: 6.4kHz sample rate</span></div>
+<div class="line">  <span class="keywordflow">for</span> (i = 0; i &lt; 32; i++)</div>
+<div class="line">    buf[i] = analogRead(0); <span class="comment">// 0 - 1023 becomes 0 - 255, top 2 bits clipped. approx 109 microsecs per sample</span></div>
+<div class="line"></div>
+<div class="line">  <span class="comment">// Now send the samples NOACK (EN_DYN_ACK must be enabled first)</span></div>
+<div class="line">  <span class="comment">// With 2Mbps, NOACK and 32 byte payload, can send about 1900 messages per sec</span></div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a8"></a><a class="code" href="classNRF24.html#a7b40c4c481bddf343acdac5179fddc75">setTransmitAddress</a>((uint8_t*)<span class="stringliteral">&quot;aurx1&quot;</span>, 5))</div>
+<div class="line">   Serial.println(<span class="stringliteral">&quot;setTransmitAddress failed&quot;</span>);</div>
+<div class="line">  <span class="comment">// Send the data  </span></div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a9"></a><a class="code" href="classNRF24.html#aad280539b80b28e55ab3187714bc7f2f">send</a>(buf, <span class="keyword">sizeof</span>(buf), <span class="keyword">true</span>)) <span class="comment">// NOACK, 110 microsecs</span></div>
+<div class="line">     Serial.println(<span class="stringliteral">&quot;send failed&quot;</span>);  </div>
+<div class="line">  <span class="comment">// Transmission takes about 300 microsecs, of which about 130microsecs is transmitter startup time</span></div>
+<div class="line">  <span class="comment">// and 160 microsecs is transmit time for 32 bytes+8 bytes overhead @ 2Mbps</span></div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a10"></a><a class="code" href="classNRF24.html#a78a011cddedb14b8764ad5ea760c28ae">waitPacketSent</a>())</div>
+<div class="line">     Serial.println(<span class="stringliteral">&quot;waitPacketSent failed&quot;</span>);  </div>
+<div class="line">    digitalWrite(3, LOW);</div>
+<div class="line">}</div>
+<div class="line"></div>
+</div><!-- fragment --> </div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.5
+</small></address>
+</body>
+</html>

+ 131 - 0
NRF24_for_attiny/doc/nrf24_ping_client_8pde-example.html

@@ -0,0 +1,131 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.5"/>
+<title>NRF24: nrf24_ping_client.pde</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">NRF24
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.5 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">nrf24_ping_client.pde</div>  </div>
+</div><!--header-->
+<div class="contents">
+<p>Example sketch showing how to create a simple messageing client with the <a class="el" href="classNRF24.html" title="Send and receive addressed, reliable, acknowledged datagrams by nRF24L01. ">NRF24</a> class. It is designed to work with the example nrf24_ping_server It also works with ping_server from the Mirf library</p>
+<div class="fragment"><div class="line"><span class="comment">// nrf24_ping_client.pde</span></div>
+<div class="line"><span class="comment">// -*- mode: C++ -*-</span></div>
+<div class="line"><span class="comment">// Example sketch showing how to create a simple messageing client</span></div>
+<div class="line"><span class="comment">// with the NRF24 class. </span></div>
+<div class="line"><span class="comment">// It is designed to work with the example nrf24_ping_server</span></div>
+<div class="line"><span class="comment">// It also works with ping_server from the Mirf library</span></div>
+<div class="line"></div>
+<div class="line"><span class="preprocessor">#include &lt;NRF24.h&gt;</span></div>
+<div class="line"><span class="preprocessor">#include &lt;SPI.h&gt;</span></div>
+<div class="line"></div>
+<div class="line"></div>
+<div class="line"><span class="comment">// Singleton instance of the radio</span></div>
+<div class="line"><a name="_a0"></a><a class="code" href="classNRF24.html">NRF24</a> nrf24;</div>
+<div class="line"><span class="comment">// NRF24 nrf24(8, 7); // use this to be electrically compatible with Mirf</span></div>
+<div class="line"><span class="comment">// NRF24 nrf24(8, 10);// For Leonardo, need explicit SS pin</span></div>
+<div class="line"></div>
+<div class="line"><span class="keywordtype">void</span> setup() </div>
+<div class="line">{</div>
+<div class="line">  Serial.begin(9600);</div>
+<div class="line"></div>
+<div class="line">  <span class="keywordflow">while</span> (!Serial) </div>
+<div class="line">    ; <span class="comment">// wait for serial port to connect. Needed for Leonardo only</span></div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a1"></a><a class="code" href="classNRF24.html#a6e98cf508939240c1805245170a995f6">init</a>())</div>
+<div class="line">    Serial.println(<span class="stringliteral">&quot;NRF24 init failed&quot;</span>);</div>
+<div class="line">  <span class="comment">// Defaults after init are 2.402 GHz (channel 2)</span></div>
+<div class="line">  <span class="comment">// Now be compatible with Mirf ping_server</span></div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a2"></a><a class="code" href="classNRF24.html#a3fa90005f98eb2744a533899f9b7e023">setChannel</a>(1))</div>
+<div class="line">    Serial.println(<span class="stringliteral">&quot;setChannel failed&quot;</span>);</div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a3"></a><a class="code" href="classNRF24.html#ade21e0bd4f92d0dfa45909bbbb0e4b01">setThisAddress</a>((uint8_t*)<span class="stringliteral">&quot;clie1&quot;</span>, 5))</div>
+<div class="line">    Serial.println(<span class="stringliteral">&quot;setThisAddress failed&quot;</span>);</div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a4"></a><a class="code" href="classNRF24.html#adb2fbd1d1aadaad1e9b268508149b6c8">setPayloadSize</a>(<span class="keyword">sizeof</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>)))</div>
+<div class="line">    Serial.println(<span class="stringliteral">&quot;setPayloadSize failed&quot;</span>);</div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a5"></a><a class="code" href="classNRF24.html#a3453db8390d5be4aa99d8c7fde3062a4">setRF</a>(<a name="a6"></a><a class="code" href="classNRF24.html#a52d7af9188397d4a6f5dab55d4f04742aca0c89dd1b40bdc57b7026d8da54de9a">NRF24::NRF24DataRate2Mbps</a>, <a name="a7"></a><a class="code" href="classNRF24.html#a8386e81a9a4b824ab26e785879684c7eacef1d6c037e276e6dadaff2b6056ec0c">NRF24::NRF24TransmitPower0dBm</a>))</div>
+<div class="line">    Serial.println(<span class="stringliteral">&quot;setRF failed&quot;</span>);    </div>
+<div class="line"></div>
+<div class="line">  Serial.println(<span class="stringliteral">&quot;initialised&quot;</span>);</div>
+<div class="line">}</div>
+<div class="line"></div>
+<div class="line"><span class="comment">// With printing commented and delay removed, this can achieve about 666 round trips per second</span></div>
+<div class="line"><span class="keywordtype">void</span> loop()</div>
+<div class="line">{</div>
+<div class="line"><span class="comment">//  Serial.println(&quot;send&quot;);</span></div>
+<div class="line">  </div>
+<div class="line">  <span class="comment">// Send some data to the server</span></div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a8"></a><a class="code" href="classNRF24.html#a7b40c4c481bddf343acdac5179fddc75">setTransmitAddress</a>((uint8_t*)<span class="stringliteral">&quot;serv1&quot;</span>, 5))</div>
+<div class="line">    Serial.println(<span class="stringliteral">&quot;setTransmitAddress failed&quot;</span>);</div>
+<div class="line"></div>
+<div class="line">  <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> time = millis();</div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a9"></a><a class="code" href="classNRF24.html#aad280539b80b28e55ab3187714bc7f2f">send</a>((uint8_t*)&amp;time, <span class="keyword">sizeof</span>(time)))</div>
+<div class="line">      Serial.println(<span class="stringliteral">&quot;send failed&quot;</span>);  </div>
+<div class="line">   <span class="keywordflow">if</span> (!nrf24.<a name="a10"></a><a class="code" href="classNRF24.html#a78a011cddedb14b8764ad5ea760c28ae">waitPacketSent</a>())</div>
+<div class="line">      Serial.println(<span class="stringliteral">&quot;waitPacketSent failed&quot;</span>); </div>
+<div class="line"><span class="comment">//     Serial.println(&quot;Sent&quot;);   </span></div>
+<div class="line">  </div>
+<div class="line">  <span class="keywordflow">if</span> (nrf24.<a name="a11"></a><a class="code" href="classNRF24.html#ae36ca859ea942a6e9480e8747a27921e">waitAvailableTimeout</a>(100))</div>
+<div class="line">  {</div>
+<div class="line">    <span class="comment">// Server should send the same time back to us</span></div>
+<div class="line"></div>
+<div class="line">     <span class="comment">//    Serial.println(&quot;available&quot;);</span></div>
+<div class="line">    <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> data;</div>
+<div class="line">    uint8_t len = <span class="keyword">sizeof</span>(data);</div>
+<div class="line">    <span class="keywordflow">if</span> (!nrf24.<a name="a12"></a><a class="code" href="classNRF24.html#a12799e0afcb52f2a8cb7418dca9e0eab">recv</a>((uint8_t*)&amp;data, &amp;len))</div>
+<div class="line">      Serial.println(<span class="stringliteral">&quot;read failed&quot;</span>);</div>
+<div class="line"></div>
+<div class="line">   <span class="comment">// Compute the round trip time. This is the time to send one (acknowledged) message (with data) </span></div>
+<div class="line">   <span class="comment">// to the server and </span></div>
+<div class="line">   <span class="comment">// for the server to send one (acknowledged) reply (with data) back to us</span></div>
+<div class="line">   <span class="comment">// Typical reported RTT is 1- 2 ms</span></div>
+<div class="line">   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> rtt = millis() - data;</div>
+<div class="line">   Serial.print(<span class="stringliteral">&quot;Ping: &quot;</span>);</div>
+<div class="line">   Serial.println(rtt);</div>
+<div class="line"></div>
+<div class="line">  }</div>
+<div class="line">  <span class="keywordflow">else</span></div>
+<div class="line">    Serial.println(<span class="stringliteral">&quot;No reply from server&quot;</span>);</div>
+<div class="line"></div>
+<div class="line">  delay(1000);  </div>
+<div class="line">}</div>
+<div class="line"></div>
+</div><!-- fragment --> </div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.5
+</small></address>
+</body>
+</html>

+ 112 - 0
NRF24_for_attiny/doc/nrf24_ping_server_8pde-example.html

@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.5"/>
+<title>NRF24: nrf24_ping_server.pde</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">NRF24
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.5 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">nrf24_ping_server.pde</div>  </div>
+</div><!--header-->
+<div class="contents">
+<p>Example sketch showing how to create a simple messageing server with the <a class="el" href="classNRF24.html" title="Send and receive addressed, reliable, acknowledged datagrams by nRF24L01. ">NRF24</a> class. It is designed to work with the example nrf24_ping_client. It also works with ping_client from the Mirf library</p>
+<div class="fragment"><div class="line"><span class="comment">// nrf24_ping_server.pde</span></div>
+<div class="line"><span class="comment">// -*- mode: C++ -*-</span></div>
+<div class="line"><span class="comment">// Example sketch showing how to create a simple messageing server</span></div>
+<div class="line"><span class="comment">// with the NRF24 class. </span></div>
+<div class="line"><span class="comment">// It is designed to work with the example nrf24_ping_client. </span></div>
+<div class="line"><span class="comment">// It also works with ping_client from the Mirf library</span></div>
+<div class="line"></div>
+<div class="line"><span class="preprocessor">#include &lt;NRF24.h&gt;</span></div>
+<div class="line"><span class="preprocessor">#include &lt;SPI.h&gt;</span></div>
+<div class="line"></div>
+<div class="line"></div>
+<div class="line"><span class="comment">// Singleton instance of the radio</span></div>
+<div class="line"><a name="_a0"></a><a class="code" href="classNRF24.html">NRF24</a> nrf24;</div>
+<div class="line"><span class="comment">// NRF24 nrf24(8, 7); // use this to be electrically compatible with Mirf</span></div>
+<div class="line"><span class="comment">// NRF24 nrf24(8, 10);// For Leonardo, need explicit SS pin</span></div>
+<div class="line"></div>
+<div class="line"><span class="keywordtype">void</span> setup() </div>
+<div class="line">{</div>
+<div class="line">  Serial.begin(9600);</div>
+<div class="line">  <span class="keywordflow">while</span> (!Serial) </div>
+<div class="line">    ; <span class="comment">// wait for serial port to connect. Needed for Leonardo only</span></div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a1"></a><a class="code" href="classNRF24.html#a6e98cf508939240c1805245170a995f6">init</a>())</div>
+<div class="line">    Serial.println(<span class="stringliteral">&quot;NRF24 init failed&quot;</span>);</div>
+<div class="line">  <span class="comment">// Defaults after init are 2.402 GHz (channel 2)</span></div>
+<div class="line">  <span class="comment">// Now be compatible with Mirf ping_client</span></div>
+<div class="line"> <span class="keywordflow">if</span> (!nrf24.<a name="a2"></a><a class="code" href="classNRF24.html#a3fa90005f98eb2744a533899f9b7e023">setChannel</a>(1))</div>
+<div class="line">    Serial.println(<span class="stringliteral">&quot;setChannel failed&quot;</span>);</div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a3"></a><a class="code" href="classNRF24.html#ade21e0bd4f92d0dfa45909bbbb0e4b01">setThisAddress</a>((uint8_t*)<span class="stringliteral">&quot;serv1&quot;</span>, 5))</div>
+<div class="line">    Serial.println(<span class="stringliteral">&quot;setThisAddress failed&quot;</span>);</div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a4"></a><a class="code" href="classNRF24.html#adb2fbd1d1aadaad1e9b268508149b6c8">setPayloadSize</a>(<span class="keyword">sizeof</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>)))</div>
+<div class="line">    Serial.println(<span class="stringliteral">&quot;setPayloadSize failed&quot;</span>);</div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a5"></a><a class="code" href="classNRF24.html#a3453db8390d5be4aa99d8c7fde3062a4">setRF</a>(<a name="a6"></a><a class="code" href="classNRF24.html#a52d7af9188397d4a6f5dab55d4f04742aca0c89dd1b40bdc57b7026d8da54de9a">NRF24::NRF24DataRate2Mbps</a>, <a name="a7"></a><a class="code" href="classNRF24.html#a8386e81a9a4b824ab26e785879684c7eacef1d6c037e276e6dadaff2b6056ec0c">NRF24::NRF24TransmitPower0dBm</a>))</div>
+<div class="line">    Serial.println(<span class="stringliteral">&quot;setRF failed&quot;</span>);    </div>
+<div class="line">  Serial.println(<span class="stringliteral">&quot;initialised&quot;</span>);</div>
+<div class="line">}</div>
+<div class="line"></div>
+<div class="line"><span class="keywordtype">void</span> loop()</div>
+<div class="line">{</div>
+<div class="line"><span class="comment">//  Serial.println(&quot;waiting&quot;);</span></div>
+<div class="line">  nrf24.<a name="a8"></a><a class="code" href="classNRF24.html#a5260f3e5eeb911e720290e652f628ab5">waitAvailable</a>();</div>
+<div class="line">  <span class="comment">// ping_client sends us an unsigned long containing its timestamp</span></div>
+<div class="line">  <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> data;</div>
+<div class="line">  uint8_t len = <span class="keyword">sizeof</span>(data);</div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a9"></a><a class="code" href="classNRF24.html#a12799e0afcb52f2a8cb7418dca9e0eab">recv</a>((uint8_t*)&amp;data, &amp;len))</div>
+<div class="line">    Serial.println(<span class="stringliteral">&quot;read failed&quot;</span>);</div>
+<div class="line"><span class="comment">//   Serial.println(data);</span></div>
+<div class="line"></div>
+<div class="line">  <span class="comment">// Now send the same data back</span></div>
+<div class="line">  <span class="comment">// Need to set the address of the detination each time, since auto-ack changes the TX address</span></div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a10"></a><a class="code" href="classNRF24.html#a7b40c4c481bddf343acdac5179fddc75">setTransmitAddress</a>((uint8_t*)<span class="stringliteral">&quot;clie1&quot;</span>, 5))</div>
+<div class="line">   Serial.println(<span class="stringliteral">&quot;setTransmitAddress failed&quot;</span>);</div>
+<div class="line">  <span class="comment">// Send the same data back   </span></div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a11"></a><a class="code" href="classNRF24.html#aad280539b80b28e55ab3187714bc7f2f">send</a>((uint8_t*)&amp;data, <span class="keyword">sizeof</span>(data)))</div>
+<div class="line">     Serial.println(<span class="stringliteral">&quot;send failed&quot;</span>);  </div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a12"></a><a class="code" href="classNRF24.html#a78a011cddedb14b8764ad5ea760c28ae">waitPacketSent</a>())</div>
+<div class="line">  {</div>
+<div class="line">     Serial.println(<span class="stringliteral">&quot;waitPacketSent failed&quot;</span>);  </div>
+<div class="line">  }</div>
+<div class="line">}</div>
+<div class="line"></div>
+</div><!-- fragment --> </div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.5
+</small></address>
+</body>
+</html>

+ 104 - 0
NRF24_for_attiny/doc/nrf24_specan_8pde-example.html

@@ -0,0 +1,104 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.5"/>
+<title>NRF24: nrf24_specan.pde</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">NRF24
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.5 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">nrf24_specan.pde</div>  </div>
+</div><!--header-->
+<div class="contents">
+<p>Example sketch showing how to create a primitive spectrum analyser with the <a class="el" href="classNRF24.html" title="Send and receive addressed, reliable, acknowledged datagrams by nRF24L01. ">NRF24</a> class. The nRF24L01 received power detector is only one bit, but this will show which channels have more than -64dBm present</p>
+<div class="fragment"><div class="line"><span class="comment">// nrf24_specan.pde</span></div>
+<div class="line"><span class="comment">// -*- mode: C++ -*-</span></div>
+<div class="line"><span class="comment">// Example sketch showing how to create a primitive spectrum analyser</span></div>
+<div class="line"><span class="comment">// with the NRF24 class. </span></div>
+<div class="line"><span class="comment">// The nRF24L01 received power detector is only one bit, but</span></div>
+<div class="line"><span class="comment">// this will show which channels have more than -64dBm present</span></div>
+<div class="line"></div>
+<div class="line"><span class="preprocessor">#include &lt;NRF24.h&gt;</span></div>
+<div class="line"><span class="preprocessor">#include &lt;SPI.h&gt;</span></div>
+<div class="line"></div>
+<div class="line"></div>
+<div class="line"><span class="comment">// Singleton instance of the radio</span></div>
+<div class="line"><a name="_a0"></a><a class="code" href="classNRF24.html">NRF24</a> nrf24;</div>
+<div class="line"><span class="comment">// NRF24 nrf24(8, 7); // use this to be electrically compatible with Mirf</span></div>
+<div class="line"><span class="comment">// NRF24 nrf24(8, 10);// For Leonardo, need explicit SS pin</span></div>
+<div class="line"></div>
+<div class="line"><span class="keywordtype">void</span> setup() </div>
+<div class="line">{</div>
+<div class="line">  Serial.begin(9600);</div>
+<div class="line">  <span class="keywordflow">while</span> (!Serial)</div>
+<div class="line">        ; <span class="comment">// wait for serial port to connect. Needed for Leonardo only</span></div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a1"></a><a class="code" href="classNRF24.html#a6e98cf508939240c1805245170a995f6">init</a>())</div>
+<div class="line">    Serial.println(<span class="stringliteral">&quot;NRF24 init failed&quot;</span>);</div>
+<div class="line">  <span class="comment">// Narrow the receiver bandwidth</span></div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a2"></a><a class="code" href="classNRF24.html#a3453db8390d5be4aa99d8c7fde3062a4">setRF</a>(<a name="a3"></a><a class="code" href="classNRF24.html#a52d7af9188397d4a6f5dab55d4f04742ae4523002495ee537f2731b61a220e3af">NRF24::NRF24DataRate250kbps</a>, <a name="a4"></a><a class="code" href="classNRF24.html#a8386e81a9a4b824ab26e785879684c7ea4790420d436218aa3bf4c23687664853">NRF24::NRF24TransmitPowerm18dBm</a>))</div>
+<div class="line">    Serial.println(<span class="stringliteral">&quot;setRF failed&quot;</span>);    </div>
+<div class="line"></div>
+<div class="line">  <span class="comment">// Start the receiver</span></div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a5"></a><a class="code" href="classNRF24.html#a9e15babbfa487da3425b19c60a93c057">powerUpRx</a>())</div>
+<div class="line">    Serial.println(<span class="stringliteral">&quot;powerUpRx failed&quot;</span>);</div>
+<div class="line"></div>
+<div class="line">  Serial.println(<span class="stringliteral">&quot;initialised&quot;</span>);</div>
+<div class="line">}</div>
+<div class="line"></div>
+<div class="line"><span class="comment">// Here we only scan the first 50 channels</span></div>
+<div class="line"><span class="keywordtype">void</span> loop()</div>
+<div class="line">{</div>
+<div class="line">  uint8_t i;</div>
+<div class="line">  <span class="keywordflow">for</span> (i = 0; i &lt; 50; i++)</div>
+<div class="line">  {</div>
+<div class="line">      <span class="keywordflow">if</span> (!nrf24.<a name="a6"></a><a class="code" href="classNRF24.html#a3fa90005f98eb2744a533899f9b7e023">setChannel</a>(i))</div>
+<div class="line">        Serial.println(<span class="stringliteral">&quot;setChannel failed&quot;</span>);</div>
+<div class="line">      delay(1); <span class="comment">// need at least 170microsecs</span></div>
+<div class="line">      uint8_t rpd = nrf24.<a name="a7"></a><a class="code" href="classNRF24.html#a264f427858362e106705d92152bc634e">spiReadRegister</a>(NRF24_REG_09_RPD); <span class="comment">// 1 bit only :-(</span></div>
+<div class="line">      Serial.print(i, DEC);</div>
+<div class="line">      Serial.print(<span class="stringliteral">&quot;: &quot;</span>);</div>
+<div class="line">      Serial.println(rpd);</div>
+<div class="line">  }</div>
+<div class="line">  Serial.println(<span class="stringliteral">&quot;-------------------------&quot;</span>);</div>
+<div class="line">  delay(1000);</div>
+<div class="line">}</div>
+<div class="line"></div>
+</div><!-- fragment --> </div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.5
+</small></address>
+</body>
+</html>

+ 94 - 0
NRF24_for_attiny/doc/nrf24_test_8pde-example.html

@@ -0,0 +1,94 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.5"/>
+<title>NRF24: nrf24_test.pde</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">NRF24
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.5 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">nrf24_test.pde</div>  </div>
+</div><!--header-->
+<div class="contents">
+<p>Test suite for the <a class="el" href="classNRF24.html" title="Send and receive addressed, reliable, acknowledged datagrams by nRF24L01. ">NRF24</a> class.</p>
+<div class="fragment"><div class="line"><span class="comment">// nrf24_test.pde</span></div>
+<div class="line"><span class="comment">// -*- mode: C++ -*-</span></div>
+<div class="line"><span class="comment">// Test suite for the NRF24 class. </span></div>
+<div class="line"></div>
+<div class="line"><span class="preprocessor">#include &lt;NRF24.h&gt;</span></div>
+<div class="line"><span class="preprocessor">#include &lt;SPI.h&gt;</span></div>
+<div class="line"></div>
+<div class="line"></div>
+<div class="line"><span class="comment">// Singleton instance of the radio</span></div>
+<div class="line"><a name="_a0"></a><a class="code" href="classNRF24.html">NRF24</a> nrf24;</div>
+<div class="line"></div>
+<div class="line"><span class="keywordtype">void</span> setup() </div>
+<div class="line">{</div>
+<div class="line">  Serial.begin(9600);</div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a1"></a><a class="code" href="classNRF24.html#a6e98cf508939240c1805245170a995f6">init</a>())</div>
+<div class="line">    Serial.println(<span class="stringliteral">&quot;NRF24 init failed&quot;</span>);</div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a2"></a><a class="code" href="classNRF24.html#a3fa90005f98eb2744a533899f9b7e023">setChannel</a>(1))</div>
+<div class="line">    Serial.println(<span class="stringliteral">&quot;setChannel failed&quot;</span>);</div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a3"></a><a class="code" href="classNRF24.html#ade21e0bd4f92d0dfa45909bbbb0e4b01">setThisAddress</a>((uint8_t*)<span class="stringliteral">&quot;clie1&quot;</span>, 5))</div>
+<div class="line">    Serial.println(<span class="stringliteral">&quot;setThisAddress failed&quot;</span>);</div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a4"></a><a class="code" href="classNRF24.html#adb2fbd1d1aadaad1e9b268508149b6c8">setPayloadSize</a>(4))</div>
+<div class="line">    Serial.println(<span class="stringliteral">&quot;setPayloadSize failed&quot;</span>);</div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a5"></a><a class="code" href="classNRF24.html#a3453db8390d5be4aa99d8c7fde3062a4">setRF</a>(<a name="a6"></a><a class="code" href="classNRF24.html#a52d7af9188397d4a6f5dab55d4f04742aca0c89dd1b40bdc57b7026d8da54de9a">NRF24::NRF24DataRate2Mbps</a>, <a name="a7"></a><a class="code" href="classNRF24.html#a8386e81a9a4b824ab26e785879684c7eacef1d6c037e276e6dadaff2b6056ec0c">NRF24::NRF24TransmitPower0dBm</a>))</div>
+<div class="line">    Serial.println(<span class="stringliteral">&quot;setRF failed&quot;</span>);  </div>
+<div class="line">}</div>
+<div class="line"></div>
+<div class="line"><span class="keywordtype">void</span> loop()</div>
+<div class="line">{</div>
+<div class="line">  Serial.println(<span class="stringliteral">&quot;start&quot;</span>);</div>
+<div class="line"> </div>
+<div class="line">  <span class="comment">// Configure for carrier wave:</span></div>
+<div class="line">  nrf24.<a name="a8"></a><a class="code" href="classNRF24.html#a81931bc1679b213b1cb1ae65b8357985">spiWriteRegister</a>(NRF24_REG_06_RF_SETUP, NRF24_CONT_WAVE | NRF24_PLL_LOCK | NRF24_PWR_0dBm);</div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a9"></a><a class="code" href="classNRF24.html#a796cb1901211284a958197d657d6f164">powerUpTx</a>())</div>
+<div class="line">    Serial.println(<span class="stringliteral">&quot;powerUpTx failed&quot;</span>);  </div>
+<div class="line"></div>
+<div class="line">  delay(5000);</div>
+<div class="line">  <span class="keywordflow">if</span> (!nrf24.<a name="a10"></a><a class="code" href="classNRF24.html#a5f40f4c8dcb3b5e097510dc6396c7f9b">powerDown</a>())</div>
+<div class="line">    Serial.println(<span class="stringliteral">&quot;powerDown failed&quot;</span>);  </div>
+<div class="line"> </div>
+<div class="line">  delay(5000);</div>
+<div class="line"> }</div>
+<div class="line"></div>
+</div><!-- fragment --> </div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.5
+</small></address>
+</body>
+</html>

BIN
NRF24_for_attiny/doc/open.png


BIN
NRF24_for_attiny/doc/sync_off.png


BIN
NRF24_for_attiny/doc/sync_on.png


BIN
NRF24_for_attiny/doc/tab_a.png


BIN
NRF24_for_attiny/doc/tab_b.png


BIN
NRF24_for_attiny/doc/tab_h.png


BIN
NRF24_for_attiny/doc/tab_s.png


+ 60 - 0
NRF24_for_attiny/doc/tabs.css

@@ -0,0 +1,60 @@
+.tabs, .tabs2, .tabs3 {
+    background-image: url('tab_b.png');
+    width: 100%;
+    z-index: 101;
+    font-size: 13px;
+    font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+}
+
+.tabs2 {
+    font-size: 10px;
+}
+.tabs3 {
+    font-size: 9px;
+}
+
+.tablist {
+    margin: 0;
+    padding: 0;
+    display: table;
+}
+
+.tablist li {
+    float: left;
+    display: table-cell;
+    background-image: url('tab_b.png');
+    line-height: 36px;
+    list-style: none;
+}
+
+.tablist a {
+    display: block;
+    padding: 0 20px;
+    font-weight: bold;
+    background-image:url('tab_s.png');
+    background-repeat:no-repeat;
+    background-position:right;
+    color: #283A5D;
+    text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+    text-decoration: none;
+    outline: none;
+}
+
+.tabs3 .tablist a {
+    padding: 0 10px;
+}
+
+.tablist a:hover {
+    background-image: url('tab_h.png');
+    background-repeat:repeat-x;
+    color: #fff;
+    text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+    text-decoration: none;
+}
+
+.tablist li.current a {
+    background-image: url('tab_a.png');
+    background-repeat:repeat-x;
+    color: #fff;
+    text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+}

+ 221 - 0
NRF24_for_attiny/examples/crazyflie/crazyflie.ino

@@ -0,0 +1,221 @@
+// crazyflie.pde
+// -*- mode: C++ -*-
+//
+// This sketch act like a Crazyflie quadcopter http://www.bitcraze.se/
+// using the CRTP radiolink protocol:
+// http://wiki.bitcraze.se/projects:crazyflie:firmware:comm_protocol
+//
+// Requires 
+// - NRF24 radio module such as the sparkfun WRL-00691 http://www.sparkfun.com/products/691
+// - Arduino such as Uno
+// - A Crazyflie transmitter, such as the Carzyflie PC client+CrazyRadio module
+// or
+// the NRF24 crazyflie client part of the NRF24 library
+//
+// Uses NRF24 library to comunicate with the Crazyflie, 
+// http://www.airspayce.com/mikem/arduino/NRF24
+//
+// Receives and decodes varion message types from teh Crazyflie transmitter, although
+// only the link echo and commander messages are fully implemented
+//
+// Author: Mike McCauley
+// Copyright (C) 2012 Mike McCauley
+
+#include <NRF24.h>
+#include <SPI.h>
+
+// Structure of Crazyflie commander messages
+#pragma pack(1);
+typedef struct 
+{
+  float roll;
+  float pitch;
+  float yaw;
+  uint16_t thrust;
+} CommanderCrtpValues;
+#pragma pack()
+
+// Useful macros for CRTP message contents and formatting
+#define CRTP_HEADER(port, channel) (((port & 0x0F) << 4) | (channel & 0x0F))
+#define CRTP_HEADER_PORT(h) ((h >> 4) & 0xf)
+#define CRTP_HEADER_CHANNEL(h) (h & 0x3)
+
+// Param channels
+#define PARAM_TOC_CH 0
+#define PARAM_READ_CH 1
+#define PARAM_WRITE_CH 2
+
+// Log channels
+#define LOG_TOC_CH 0
+#define LOG_CONTROL_CH 1
+#define LOG_LOG_CH 2
+// Log packet parameters storage
+#define LOG_MAX_OPS 64
+#define LOG_MAX_BLOCKS 8
+
+// Port definitions
+typedef enum {
+  CRTP_PORT_CONSOLE     = 0x00,
+  CRTP_PORT_PARAM       = 0x02,
+  CRTP_PORT_COMMANDER   = 0x03,
+  CRTP_PORT_LOG         = 0x05,
+  CRTP_PORT_LINK        = 0x0F,
+} CRTPPort;
+
+// Common command numbers
+#define CMD_GET_ITEM 0
+#define CMD_GET_INFO 1
+
+// Singleton instance of the radio
+NRF24 nrf24;
+// NRF24 nrf24(8, 7); // use this to be electrically compatible with Mirf
+// NRF24 nrf24(8, 10);// For Leonardo, need explicit SS pin
+
+// The address to use for this Crazyflie
+uint8_t address[] = { 0xe7, 0xe7, 0xe7, 0xe7, 0xe7 };
+
+void setup() 
+{
+  Serial.begin(115200);
+  while (!Serial)
+    ; // Wait for serial port, only required for Leonardo
+
+  if (!nrf24.init())
+    Serial.println("NRF24 init failed");
+
+  // Be Crazyflie radiolink compatible
+  // We use the NRF24 library for convenience, but
+  // we use a different configuration to the default NRF24
+  if (!nrf24.setChannel(13))
+     Serial.println("setChannel failed");
+  // Set data rate to 250k and low power
+  if (!nrf24.setRF(NRF24::NRF24DataRate250kbps, NRF24::NRF24TransmitPower0dBm))
+     Serial.println("setRF failed");  
+  if (!nrf24.setPipeAddress(0, address, sizeof(address)))
+     Serial.println("setPipeAddress failed");  
+  // Be compatible with Crazyflie: No interrupts, 2 bytes CRC
+  nrf24.setConfiguration(NRF24_MASK_RX_DR | NRF24_MASK_TX_DS | NRF24_MASK_MAX_RT | NRF24_EN_CRC | NRF24_CRCO);
+  nrf24.spiWriteRegister(NRF24_REG_1D_FEATURE, NRF24_EN_DPL | NRF24_EN_ACK_PAY);   // Dynamic size payload + ack
+  nrf24.spiWriteRegister(NRF24_REG_1C_DYNPD, NRF24_DPL_P0);     // Dynamic payload on pipe 0
+  if (!nrf24.setRetry(6, 3)) // 1500us and 3 retries
+     Serial.println("setRetry failed");  
+
+  Serial.println("initialised");
+}
+
+// Debugging data dumper
+void dump(char* prompt, uint8_t* data, uint8_t len)
+{
+  Serial.print(prompt);
+  Serial.print(": ");	
+  for (int i = 0; i < len; i++)
+  {
+    Serial.print(data[i], HEX);
+    Serial.print(" ");
+  }
+  Serial.println("");
+}
+
+// Send an ACK with a payload on pipe 0
+void sendAckPayload(uint8_t* data, uint8_t len)
+{
+  nrf24.spiBurstWrite(NRF24_COMMAND_W_ACK_PAYLOAD(0), data, len);
+  nrf24.waitPacketSent();
+}
+
+// ACK with no payload on pipe 0
+void sendAck()
+{
+  sendAckPayload(0, 0);
+}
+
+void loop()
+{
+  uint8_t buf[100];
+  uint8_t buflen = sizeof(buf);
+  static uint32_t last_second = 0;
+  
+  // enable receiver again, after transmit and wait for a message
+  nrf24.waitAvailable();
+  if (nrf24.recv(buf, &buflen))
+  {
+    // Decode incoming messages from client based on port number in the header byte
+ //   dump("msg", buf, buflen);
+    if (CRTP_HEADER_PORT(buf[0]) == CRTP_PORT_LINK) // Link Echo
+    {
+      sendAck(); // Just ack, no payload
+    }
+    else if (CRTP_HEADER_PORT(buf[0]) == CRTP_PORT_COMMANDER) // Commander
+    {
+      // Commander message to set control positions
+      CommanderCrtpValues *p = (CommanderCrtpValues*)(buf+1);
+      Serial.println(p->roll); // -30.0 to 30.0
+      Serial.println(p->pitch); // -28.0 to 32.0
+      Serial.println(p->yaw); // -200.0 to 200.0
+      Serial.println(p->thrust); // 0 to 45755
+      sendAck(); // Just ack, no payload
+//      dump("commander", buf, buflen);
+    }
+    else if (CRTP_HEADER_PORT(buf[0]) == CRTP_PORT_PARAM) // Parameter
+    {
+      if (buf[1] == CMD_GET_INFO) // Param GET_INFO
+      {
+        // pc client only fetches item data if the CRC changes
+        // If you change the contents of your TOC, you must change the CRC
+        // Crazyflie PC client doesnt relaly believe it if you say there are no TOC entries
+        uint8_t reply[] = { CRTP_HEADER(CRTP_PORT_PARAM, PARAM_TOC_CH), CMD_GET_INFO, 1, 0, 0, 2, 0}; // 1 params in toc
+        sendAckPayload(reply, sizeof(reply));
+      }
+      else if (buf[1] == CMD_GET_ITEM) // Param GET_ITEM
+      { 
+        // Set up a fax param as item 0
+        uint8_t reply[] = { CRTP_HEADER(CRTP_PORT_PARAM, PARAM_TOC_CH), CMD_GET_ITEM, 0, 1, 'x', 0, 'y', 0}; // bogus item 0 uint8_t param
+        sendAckPayload(reply, sizeof(reply));
+      }
+      else
+      {
+        Serial.print("unknown param type ");
+        Serial.println(buf[1]);
+      }
+ //     dump("param", buf, buflen);
+    }
+    else if (buf[0] == CRTP_HEADER_PORT(buf[0]) == CRTP_PORT_PARAM) // Log
+    {
+      // http://wiki.bitcraze.se/projects:crazyflie:crtp:log
+      if (buf[1] == CMD_GET_INFO) // Log GET_INFO
+      {
+        // pc client only fetches item data if the CRC changes
+        // If you change the contents of your TOC, you must change the CRC
+        // Crazyflie PC client doesnt relaly believe it if you say there are no TOC entries
+       uint8_t reply[] = { CRTP_HEADER(CRTP_PORT_LOG, LOG_TOC_CH), CMD_GET_INFO, 1, 0, 0, 2, 1, 8, 64}; // 1 log item in toc
+        sendAckPayload(reply, sizeof(reply));
+      }   
+      else if (buf[1] == CMD_GET_ITEM) // Log GET_ITEM
+      {
+        // Set up a fake battery voltage as item 0
+        uint8_t reply[] = { CRTP_HEADER(CRTP_PORT_LOG, LOG_TOC_CH), CMD_GET_ITEM, 0, 7, 'p', 'm', 0, 'v', 'b', 'a', 't', 0}; // item 0 float pm.vbat
+        sendAckPayload(reply, sizeof(reply));
+      }
+//      dump("log", buf, buflen);
+    }
+    else
+    {
+      // Sometimes get bogus type 0x93
+ //     dump("unknown", buf, buflen);
+    }
+  }
+  
+  // Do once per second tasks
+  uint32_t this_second = millis() / 1000;
+  if (this_second != last_second)
+  {
+    // This is how you would send value data for a log block
+    // with current real-time data
+    // if a log block has ben set up by the client
+//    uint8_t msg[] = {CRTP_HEADER(CRTP_PORT_LOG, LOG_LOG_CH), 0, 0, 0, 0, 11, 11, 11, 11};
+//    sendAckPayload(msg, sizeof(msg));
+
+    last_second = this_second;
+  }
+}
+

Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott