Compare commits

...

49 Commits

Author SHA1 Message Date
Elmar van Rijnswou 768a854b08 Added proper support for rev2 7 years ago
Elmar van Rijnswou 3a5a11d824 Reworked buffering structure 7 years ago
Elmar van Rijnswou b5d39ad75d Refactored. Removed stupid debugging. Pressing start will now sample for one second 7 years ago
Maximilian Stiefel a07c02ed40 Tested FFT library. 7 years ago
Elmar van Rijnswou 343dc35727 Try the faster adc 7 years ago
Elmar van Rijnswou 58cc1d228d This should work 7 years ago
Elmar van Rijnswou 86fb1cb382 Try 7 years ago
Elmar van Rijnswou f4def40a70 Try 7 years ago
Elmar van Rijnswou 4a6db536af Fixed includes 7 years ago
Elmar van Rijnswou 330eff28c0 Further cleaning of the code 7 years ago
Elmar van Rijnswou dc2285233b Something always has to go wrong 7 years ago
Elmar van Rijnswou 6ae7b44df7 refactoring continues 7 years ago
Elmar van Rijnswou cb29bc0c4f some code refactoring 7 years ago
Elmar van Rijnswou fffb8548ed Saves to file on pressing stop now 7 years ago
Elmar van Rijnswou 0f4d8cb832 User interface works. Have to redo the communication, step away from string compares, and get nice json. 7 years ago
Elmar van Rijnswou 937be691fc Reworked the architecture to allow for a publisher/subscriber model. Added signal processing. Make sure to stop the hub before changing channels! (To be done automatically in the future) and there is NO typesafety for the publisher/subscriber... yet!~ 7 years ago
Maximilian Stiefel 1f23600d60 Started with a signal processor. 7 years ago
Elmar van Rijnswou 4ccf55cef4 refactored pcb structure 7 years ago
Elmar van Rijnswou a319ffc710 refactored pcb structure 7 years ago
Elmar van Rijnswou a056b00956 Ported to 3v3 7 years ago
Elmar van Rijnswou eb71ddca4b Lets set this fixed. maybe move it to 10.0.0.1 in the future? 7 years ago
Elmar van Rijnswou 6b49cbebb3 Solved inaccuracy problem with adc. Started with a nice overview for the raw samples 7 years ago
Maximilian Stiefel ab0eca2fa2 Minor correction. 7 years ago
Maximilian Stiefel 1053aea16c Documented my code. Added a doxygen file. 7 years ago
Maximilian Stiefel c77ff21c86 Fixed minor problem with one ADC not showing up. 7 years ago
Maximilian Stiefel 311c3e3897 Solved merge conflict. 7 years ago
Maximilian Stiefel b95915d1b6 Made rectangle signal from DAC work. 7 years ago
Maximilian Stiefel 019413d75c Made rectangle signal from DAC work. 7 years ago
elamre e91588c8e8 Renamed channels 7 years ago
elamre d6730e82e6 Fix for the revision 1 channels 7 years ago
Maximilian Stiefel 6d54251ebf I have no idea what I'm doin. 7 years ago
elamre 77e3155da8 Added printout of settings. Made the adc freespinning 7 years ago
elamre d73d877e76 Removed stupid debnugging 7 years ago
elamre c84d8317d2 Made it a bit more elegant 7 years ago
Maximilian Stiefel 2e5f9a9d56 Continued programming for a bit .. 7 years ago
Maximilian Stiefel ea34c70012 Driver for DAC works. Started with an application objectfor LED controll. 7 years ago
Maximilian Stiefel 8f7a2b79f8 Cleaning. 7 years ago
elamre 8ad16673ff Fixed conversion bug. Adjusted reading setting adc 7 years ago
Maximilian Stiefel 9e1c6a5940 Started with the DAC driver. 7 years ago
Maximilian Stiefel a6a8552c7a Cleaned a bit and added a .gitignore. 7 years ago
Maximilian Stiefel 8a7c767caa Merge branch 'software_develop' of github.com:s3xm3x/UppSense into software_develop 7 years ago
elamre 541816f455 Fixed wrong conversion 7 years ago
Maximilian Stiefel 07f1ba7782 Merge branch 'software_develop' of github.com:s3xm3x/UppSense into software_develop 7 years ago
elamre fc8ca4b8ce Wrong integer size 7 years ago
elamre 2ef5ab1dc7 Changed logging, added addresses on top of application 7 years ago
Maximilian Stiefel f0a07ac1f5 Merge branch 'software_develop' of github.com:s3xm3x/UppSense into software_develop 7 years ago
elamre d4e3d24002 Added a web interface, with strange behavior? Tomorrow fixing the bugs 7 years ago
Maximilian Stiefel 84d58111e4 Merge branch 'master' of github.com:s3xm3x/UppSense into software_develop 7 years ago
elamre d423eecd49 Small test 7 years ago
  1. 4
      pcbs/digital_board_rev_1/.gitignore
  2. 0
      pcbs/digital_board_rev_1/History/.gitignore
  3. 0
      pcbs/digital_board_rev_1/Project Logs for uppsense/.gitignore
  4. 0
      pcbs/digital_board_rev_1/output/.gitignore
  5. BIN
      pcbs/digital_board_rev_1/output/Gerber.zip
  6. 234
      pcbs/digital_board_rev_1/output/Gerber/debug.log
  7. 0
      pcbs/digital_board_rev_1/output/Gerber/gerber_digital_board.zip
  8. 0
      pcbs/digital_board_rev_1/output/Gerber/uppsense.gbl
  9. 0
      pcbs/digital_board_rev_1/output/Gerber/uppsense.gbo
  10. 0
      pcbs/digital_board_rev_1/output/Gerber/uppsense.gbs
  11. 0
      pcbs/digital_board_rev_1/output/Gerber/uppsense.gko
  12. 0
      pcbs/digital_board_rev_1/output/Gerber/uppsense.gtl
  13. 0
      pcbs/digital_board_rev_1/output/Gerber/uppsense.gto
  14. 0
      pcbs/digital_board_rev_1/output/Gerber/uppsense.gts
  15. 0
      pcbs/digital_board_rev_1/output/Gerber/uppsense.txt
  16. 0
      pcbs/digital_board_rev_1/output/layout.pdf
  17. 0
      pcbs/digital_board_rev_1/output/schematics.pdf
  18. 0
      pcbs/digital_board_rev_1/uppsense.PcbDoc
  19. 0
      pcbs/digital_board_rev_1/uppsense.PrjPcb
  20. 0
      pcbs/digital_board_rev_1/uppsense.PrjPcbStructure
  21. 0
      pcbs/digital_board_rev_1/uppsense.SchDoc
  22. 4
      pcbs/digital_board_rev_2/.gitignore
  23. 3
      pcbs/digital_board_rev_2/History/.gitignore
  24. 1
      pcbs/digital_board_rev_2/Project Logs for uppsense/.gitignore
  25. 344
      pcbs/digital_board_rev_2/Project Outputs for uppsense/Design Rule Check - uppsense.html
  26. BIN
      pcbs/digital_board_rev_2/output/Gerber.zip
  27. 1519
      pcbs/digital_board_rev_2/output/Gerber/uppsense.gbl
  28. 557
      pcbs/digital_board_rev_2/output/Gerber/uppsense.gbo
  29. 69
      pcbs/digital_board_rev_2/output/Gerber/uppsense.gbs
  30. 76
      pcbs/digital_board_rev_2/output/Gerber/uppsense.gko
  31. 3320
      pcbs/digital_board_rev_2/output/Gerber/uppsense.gtl
  32. 5583
      pcbs/digital_board_rev_2/output/Gerber/uppsense.gto
  33. 185
      pcbs/digital_board_rev_2/output/Gerber/uppsense.gts
  34. 142
      pcbs/digital_board_rev_2/output/Gerber/uppsense.txt
  35. BIN
      pcbs/digital_board_rev_2/output/layout.pdf
  36. BIN
      pcbs/digital_board_rev_2/output/schematics.pdf
  37. BIN
      pcbs/digital_board_rev_2/uppsense.PcbDoc
  38. 1112
      pcbs/digital_board_rev_2/uppsense.PrjPcb
  39. 1
      pcbs/digital_board_rev_2/uppsense.PrjPcbStructure
  40. BIN
      pcbs/digital_board_rev_2/uppsense.SchDoc
  41. 28
      pcbs/transimpedance_amp_v0.1/photodiodes.pretty/BPW34FA.kicad_mod
  42. 42
      software/.gitignore
  43. BIN
      software/Basic_Blink/out/build/app.out
  44. BIN
      software/Basic_Blink/out/build/app/ads101x.o
  45. BIN
      software/Basic_Blink/out/build/app/application.o
  46. BIN
      software/Basic_Blink/out/build/app/sensor_hub.o
  47. BIN
      software/Basic_Blink/out/build/app_app.a
  48. BIN
      software/Basic_Blink/out/firmware/0x00000.bin
  49. BIN
      software/Basic_Blink/out/firmware/0x0a000.bin
  50. 10499
      software/Basic_Blink/out/firmware/firmware.map
  51. 10
      software/Basic_Blink/out/firmware/fwMeminfo.new
  52. 10
      software/Basic_Blink/out/firmware/fwMeminfo.old
  53. 2494
      software/Doxyfile
  54. 24
      software/Makefile
  55. 36
      software/app/access_point.cpp
  56. 14
      software/app/access_point.h
  57. 185
      software/app/ads101x.cpp
  58. 76
      software/app/ads101x.h
  59. 42
      software/app/ads_converter.cpp
  60. 30
      software/app/ads_converter.h
  61. 141
      software/app/application.cpp
  62. 138
      software/app/dac101c085.cpp
  63. 72
      software/app/dac101c085.h
  64. 65
      software/app/excitation_light.cpp
  65. 64
      software/app/excitation_light.h
  66. 21
      software/app/port_utilities.cpp
  67. 23
      software/app/port_utilities.h
  68. 71
      software/app/sensor_hub.cpp
  69. 39
      software/app/sensor_hub.h
  70. 49
      software/app/signal_process.cpp
  71. 30
      software/app/signal_process.h
  72. 28
      software/app/temperature.h
  73. 24
      software/app/test.cpp
  74. 17
      software/app/tests.h
  75. 243
      software/app/web_interface.cpp
  76. 124
      software/app/web_interface.h
  77. BIN
      software/files/bootstrap.min.css.gz
  78. 69
      software/files/config.html
  79. 38
      software/files/config.js
  80. 114
      software/files/index.html
  81. 114
      software/files/index.js
  82. BIN
      software/files/jquery-2.1.4.min.js.gz
  83. 16
      software/include/application.h
  84. 18
      software/include/defines.h
  85. 49
      software/include/hardware.h
  86. 44
      software/include/rijnfel_core/adc.h
  87. 44
      software/include/rijnfel_core/data_provider.h
  88. 29
      software/include/rijnfel_core/data_receiver.h
  89. 25
      software/include/rijnfel_core/data_sink.h
  90. 76
      software/include/rijnfel_core/double_buffer.h
  91. 24
      software/include/rijnfel_core/helper_structs.h
  92. 53
      software/include/rijnfel_core/provider_averager.h
  93. 52
      software/include/rijnfel_core/provider_buffer.h
  94. 23
      software/include/rijnfel_core/rijnfel_core.h
  95. 38
      software/include/rijnfel_core/sensor.h
  96. 48
      software/include/rijnfel_core/sensor_settings.h
  97. 16
      software/include/signal_processing.h
  98. 45
      software/include/user_config.h
  99. 184
      software/libs/arduinoFFT/arduinoFFT.cpp
  100. 76
      software/libs/arduinoFFT/arduinoFFT.h

4
pcbs/digital_board_rev_1/.gitignore

@ -0,0 +1,4 @@
__Previews/
History/
Project Logs for uppsense/
Project Outputs for uppsense

0
pcbs/digital_board/History/.gitignore → pcbs/digital_board_rev_1/History/.gitignore

0
pcbs/digital_board/Project Logs for uppsense/.gitignore → pcbs/digital_board_rev_1/Project Logs for uppsense/.gitignore

0
pcbs/digital_board/output/.gitignore → pcbs/digital_board_rev_1/output/.gitignore

BIN
pcbs/digital_board_rev_1/output/Gerber.zip

Binary file not shown.

234
pcbs/digital_board_rev_1/output/Gerber/debug.log

@ -0,0 +1,234 @@
[0709/201852:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/201857:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/201902:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/201907:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/201912:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/201917:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/201922:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/201927:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/201932:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/201937:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/201942:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/201947:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/201952:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/201957:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202002:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202007:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202012:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202017:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202022:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202027:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202032:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202037:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202042:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202047:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202052:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202057:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202102:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202107:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202112:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202117:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202122:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202127:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202132:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202137:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202142:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202147:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202152:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202157:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202202:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202207:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202212:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202217:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202222:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202227:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202232:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202237:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202242:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202247:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202252:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202257:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202302:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202307:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202312:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202317:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202322:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202328:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202333:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202338:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202343:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202348:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202353:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202358:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202403:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202408:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202413:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202418:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202423:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202428:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202433:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202438:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202443:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202448:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202453:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202458:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202503:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202508:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202511:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202513:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202516:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202518:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202521:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202523:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202526:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202528:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202531:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202533:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202536:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202538:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202541:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202543:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202546:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202548:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202551:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202553:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202556:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202558:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202601:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202603:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202606:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202608:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202611:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202613:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202616:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202618:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202621:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202623:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202626:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202628:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202631:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202633:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202636:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202638:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202641:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202643:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202646:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202648:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202651:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202653:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202656:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202658:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202701:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202703:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202706:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202708:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202711:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202713:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202716:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202718:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202721:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202723:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202726:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202728:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202731:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202733:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202736:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202738:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202741:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202743:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202746:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202748:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202751:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202753:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202756:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202758:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202801:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202803:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202806:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202808:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202811:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202813:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202816:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202818:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202821:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202823:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202826:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202828:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202831:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202833:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202836:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202838:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202841:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202843:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202846:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202848:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202851:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202853:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202856:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202858:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202901:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202903:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202906:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202908:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202911:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202913:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202916:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202918:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202921:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202923:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202926:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202928:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202931:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202933:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202936:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202938:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202941:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202943:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202946:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202948:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202951:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202953:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202956:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/202958:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203001:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203003:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203006:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203008:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203011:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203013:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203016:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203018:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203021:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203023:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203026:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203028:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203031:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203033:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203036:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203038:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203041:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203043:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203046:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203048:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203051:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203053:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203056:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203058:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203101:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203103:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203106:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203108:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203111:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203113:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203116:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203118:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203121:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203123:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203126:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203128:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203131:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203133:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203136:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203138:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203141:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.
[0709/203142:WARNING:dns_config_service_win.cc(665)] Failed to read DnsConfig.

0
pcbs/digital_board/output/Gerber/gerber_digital_board.zip → pcbs/digital_board_rev_1/output/Gerber/gerber_digital_board.zip

0
pcbs/digital_board/output/Gerber/uppsense.gbl → pcbs/digital_board_rev_1/output/Gerber/uppsense.gbl

0
pcbs/digital_board/output/Gerber/uppsense.gbo → pcbs/digital_board_rev_1/output/Gerber/uppsense.gbo

0
pcbs/digital_board/output/Gerber/uppsense.gbs → pcbs/digital_board_rev_1/output/Gerber/uppsense.gbs

0
pcbs/digital_board/output/Gerber/uppsense.gko → pcbs/digital_board_rev_1/output/Gerber/uppsense.gko

0
pcbs/digital_board/output/Gerber/uppsense.gtl → pcbs/digital_board_rev_1/output/Gerber/uppsense.gtl

0
pcbs/digital_board/output/Gerber/uppsense.gto → pcbs/digital_board_rev_1/output/Gerber/uppsense.gto

0
pcbs/digital_board/output/Gerber/uppsense.gts → pcbs/digital_board_rev_1/output/Gerber/uppsense.gts

0
pcbs/digital_board/output/Gerber/uppsense.txt → pcbs/digital_board_rev_1/output/Gerber/uppsense.txt

0
pcbs/digital_board/output/layout.pdf → pcbs/digital_board_rev_1/output/layout.pdf

0
pcbs/digital_board/output/schematics.pdf → pcbs/digital_board_rev_1/output/schematics.pdf

0
pcbs/digital_board/uppsense.PcbDoc → pcbs/digital_board_rev_1/uppsense.PcbDoc

0
pcbs/digital_board/uppsense.PrjPcb → pcbs/digital_board_rev_1/uppsense.PrjPcb

0
pcbs/digital_board/uppsense.PrjPcbStructure → pcbs/digital_board_rev_1/uppsense.PrjPcbStructure

0
pcbs/digital_board/uppsense.SchDoc → pcbs/digital_board_rev_1/uppsense.SchDoc

4
pcbs/digital_board_rev_2/.gitignore

@ -0,0 +1,4 @@
__Previews/
History/
Project Logs for uppsense/
Project Outputs for uppsense

3
pcbs/digital_board_rev_2/History/.gitignore

@ -0,0 +1,3 @@
*.SchDoc.Zip
*.PcbDoc.Zip
*.PrjPcb.Zip

1
pcbs/digital_board_rev_2/Project Logs for uppsense/.gitignore

@ -0,0 +1 @@
*.LOG

344
pcbs/digital_board_rev_2/Project Outputs for uppsense/Design Rule Check - uppsense.html

@ -0,0 +1,344 @@
<html>
<head>
<META http-equiv="Content-Type" content="text/html">
<style type="text/css">
h1, h2, h3, h4, h5, h6 {
font-family : segoe ui;
color : black;
background-color : #EDE7D9;
padding: 0.3em;
}
h1 {
font-size: 1.2em;
}
h2 {
font-size: 1.2em;
}
body {
font-family : segoe ui;
}
td, th {
padding: 0.5em;
text-align : left;
width: 10em;
}
th {
background-color : #EEEEEE;
}
th.column1, td.column1 {
text-align: left;
width : auto;
}
table {
width : 100%;
font-size: 0.9em;
}
.DRC_summary_header {
padding-bottom : 0.1em;
border : 0px solid black;
width: 100%;
align: left;
}
.DRC_summary_header_col1,
.DRC_summary_header_col2,
.DRC_summary_header_col3 {
color : black;
font-size:100%;
padding : 0em;
padding-top : 0.2em;
padding-bottom 0.2em;
border : 0px solid black;
vertical-align: top;
text-align: left;
}
.DRC_summary_header_col1 {
font-weight: bold;
width: 8em;
}
.DRC_summary_header_col2 {
width: 0.1em;
}
.DRC_summary_header_col3 {
width : auto;
}
.header_holder {
Width = 100%;
border = 0px solid green;
padding = 0;
}
.front_matter, .front_matter_column1, .front_matter_column2, .front_matter_column3
{
left : 0;
top : 0;
padding: 0em;
padding-top : 0.1em;
border : 0px solid black;
width : 100%;
vertical-align: top;
text-align: left;
}
.front_matter_column1 {
width : 8em;
font-weight: bold;
}
.front_matter_column2 {
width: 0.1em;
}
.front_matter_column3 {
width : auto;
}
.total_column1, .total_column {
font-weight : bold;
}
.total_column1 {
text-align : left;
}
.warning, .error {
color : red;
font-weight : bold;
}
tr.onmouseout_odd {
background-color : #white;
}
tr.onmouseout_even {
background-color : #FAFAFA;
}
tr.onmouseover_odd, tr.onmouseover_even {
background-color : #EEEEEE;
}
a:link, a:visited, .q a:link,.q a:active,.q {
color: #21489e;
}
a:link.callback, a:visited.callback {
color: #21489e;
}
a:link.customize, a:visited.customize {
color: #C0C0C0;
position: absolute;
right: 10px;
}
p.contents_level1 {
font-weight : bold;
font-size : 110%;
margin : 0.5em;
}
p.contents_level2 {
position : relative;
left : 20px;
margin : 0.5em;
}
</style><script type="text/javascript">
function coordToMils(coord) {
var number = coord / 10000;
if (number != number.toFixed(3))
number = number.toFixed(3);
return number + 'mil'
}
function coordToMM(coord) {
var number = 0.0254 * coord / 10000;
if (number != number.toFixed(4))
number = number.toFixed(4);
return number + 'mm'
}
function convertCoord(coordNode, units) {
for (var i = 0; i < coordNode.childNodes.length; i++) {
coordNode.removeChild(coordNode.childNodes[i]);
}
var coord = coordNode.getAttribute('value');
if (coord != null) {
if (units == 'mm') {
textNode = document.createTextNode(coordToMM(coord));
coordNode.appendChild(textNode);
} else if (units == 'mil') {
textNode = document.createTextNode(coordToMils(coord));
coordNode.appendChild(textNode);
}
}
}
function convertUnits(unitNode, units) {
for (var i = 0; i < unitNode.childNodes.length; i++) {
unitNode.removeChild(unitNode.childNodes[i]);
}
textNode = document.createTextNode(units);
unitNode.appendChild(textNode);
}
function changeUnits(radio_input, units) {
if (radio_input.checked) {
var elements = document.getElementsByName('coordinate');
if (elements) {
for (var i = 0; i < elements.length; i++) {
convertCoord(elements[i], units);
}
}
var elements = document.getElementsByName('units');
if (elements) {
for (var i = 0; i < elements.length; i++) {
convertUnits(elements[i], units);
}
}
}
}
</script><title>Design Rule Verification Report</title>
</head>
<body onload=""><img ALT="Altium" src="
file://C:\Users\Public\Documents\Altium\AD17\Templates\AD_logo.png
"><h1>Design Rule Verification Report</h1>
<table class="header_holder">
<td class="column1">
<table class="front_matter">
<tr class="front_matter">
<td class="front_matter_column1">Date:</td>
<td class="front_matter_column2"></td>
<td class="front_matter_column3">21-Aug-17</td>
</tr>
<tr class="front_matter">
<td class="front_matter_column1">Time:</td>
<td class="front_matter_column2"></td>
<td class="front_matter_column3">11:16:58 AM</td>
</tr>
<tr class="front_matter">
<td class="front_matter_column1">Elapsed Time:</td>
<td class="front_matter_column2"></td>
<td class="front_matter_column3">00:00:02</td>
</tr>
<tr class="front_matter">
<td class="front_matter_column1">Filename:</td>
<td class="front_matter_column2"></td>
<td class="front_matter_column3"><a href="file:///C:\Users\Elmar\Desktop\UU\UppSense\pcbs\digital_board_rev_2\uppsense.PcbDoc" class="file"><acronym title="C:\Users\Elmar\Desktop\UU\UppSense\pcbs\digital_board_rev_2\uppsense.PcbDoc">C:\Users\Elmar\Desktop\UU\UppSense\pcbs\digital_board_rev_2\uppsense.PcbDoc</acronym></a></td>
</tr>
</table>
</td>
<td class="column2">
<table class="DRC_summary_header">
<tr>
<td class="DRC_summary_header_col1">Warnings:</td>
<td class="DRC_summary_header_col2"></td>
<td class="DRC_summary_header_col3">0</td></tr>
<tr>
<td class="DRC_summary_header_col1">Rule Violations:</td>
<td class="DRC_summary_header_col2"></td>
<td class="DRC_summary_header_col3">0</td></tr>
</table>
</td>
</table><a name="IDC5FAHQQWOI5NI05H2TQJIWPBQLP4JTT5KOFTXUOHUDVL0HHW2YLJ"><h2>Summary</h2></a><table>
<tr>
<th class="column1">Warnings</th>
<th class="column2">Count</th>
</tr>
<tr>
<td style="font-weight : bold; text-align : right" class="column1">Total</td>
<td style="font-weight : bold" class="column2">0</td>
</tr>
</table><br><table>
<tr>
<th class="column1">Rule Violations</th>
<th class="column2">Count</th>
</tr>
<tr class="onmouseout_odd" onmouseover="className = 'onmouseover_odd'" onmouseout="className = 'onmouseout_odd'">
<td class="column1"><a href="#IDVWGDQCNIYQLPB52LKN4YWJ2IGO5SDMJS12ENOBLCZMA3TODWPDMO">Clearance Constraint (Gap=0.2mm) (InPolygon),(All)</a></td>
<td class="column2">0</td>
</tr>
<tr class="onmouseout_even" onmouseover="className = 'onmouseover_even'" onmouseout="className = 'onmouseout_even'">
<td class="column1"><a href="#IDXYEM30BXVASAIGPVF03DMUTGYBOURWJUTGWUPEDXMYYCTOJXSKYM">Clearance Constraint (Gap=0.2mm) (IsTrack AND AsMM(Width) &gt; 0.2),(All)</a></td>
<td class="column2">0</td>
</tr>
<tr class="onmouseout_odd" onmouseover="className = 'onmouseover_odd'" onmouseout="className = 'onmouseout_odd'">
<td class="column1"><a href="#IDGG1DLJ0F2X1CKDQV25MQ313NKKJHG3IPRL5MLNI45JH4FVC5GMAG">Clearance Constraint (Gap=0.15mm) (All),(All)</a></td>
<td class="column2">0</td>
</tr>
<tr class="onmouseout_even" onmouseover="className = 'onmouseover_even'" onmouseout="className = 'onmouseout_even'">
<td class="column1"><a href="#IDQFFV10D4XINYFCJG4FHWOQVVWJFPXFI3HQWNRJOLVDUOKSER0H0K">Clearance Constraint (Gap=1.1mm) (HasFootprint('FEDUCIAL')),(All)</a></td>
<td class="column2">0</td>
</tr>
<tr class="onmouseout_odd" onmouseover="className = 'onmouseover_odd'" onmouseout="className = 'onmouseout_odd'">
<td class="column1"><a href="#IDSCVJ1NHOUZMZHI0O2YTM1TTHREQONVEB3ZSDUWCFEHOKMFYFXPTH">Clearance Constraint (Gap=0.25mm) (OnLayer('Keep-Out Layer')),(InPolygon)</a></td>
<td class="column2">0</td>
</tr>
<tr class="onmouseout_even" onmouseover="className = 'onmouseover_even'" onmouseout="className = 'onmouseout_even'">
<td class="column1"><a href="#IDNBMTL13XAGC0JCG0DZTN3RLP2DJK5MAZ4AEK3QMWKVXSLUEW2LNF">Clearance Constraint (Gap=0.25mm) (OnLayer('Keep-Out Layer')),(All)</a></td>
<td class="column2">0</td>
</tr>
<tr class="onmouseout_odd" onmouseover="className = 'onmouseover_odd'" onmouseout="className = 'onmouseout_odd'">
<td class="column1"><a href="#ID4LTXDNIDI5GVJGOY3TXGARKN3DRXQDAA5PD0YZNF3DYNQAF1OJRN">Short-Circuit Constraint (Allowed=No) (All),(All)</a></td>
<td class="column2">0</td>
</tr>
<tr class="onmouseout_even" onmouseover="className = 'onmouseover_even'" onmouseout="className = 'onmouseout_even'">
<td class="column1"><a href="#IDEI40H30XUNOODBMIF2RZUE3KFIFE1KJKZ1ROJNCS4PPPFG4D3M1P">Un-Routed Net Constraint ( (All) )</a></td>
<td class="column2">0</td>
</tr>
<tr class="onmouseout_odd" onmouseover="className = 'onmouseover_odd'" onmouseout="className = 'onmouseout_odd'">
<td class="column1"><a href="#IDVGOTBRLR40TOO3R5VBM4JWPLIJC5F2YWMNAVSJT2KV34EBCVDCH">Modified Polygon (Allow modified: No), (Allow shelved: No)</a></td>
<td class="column2">0</td>
</tr>
<tr class="onmouseout_even" onmouseover="className = 'onmouseover_even'" onmouseout="className = 'onmouseout_even'">
<td class="column1"><a href="#IDWDFN3QUKTAFQJL1DYNUSPI4VEJZ1ACMVUQMLHPEMP0HWUTAMOS3B">Width Constraint (Min=0.15mm) (Max=100mm) (Preferred=0.2mm) (All)</a></td>
<td class="column2">0</td>
</tr>
<tr class="onmouseout_odd" onmouseover="className = 'onmouseover_odd'" onmouseout="className = 'onmouseout_odd'">
<td class="column1"><a href="#ID5SJYMANNQTUEJHC2N45PVOX4YO0O1BEW5BEHQLN0PKDL4BJVQKG">Power Plane Connect Rule(Relief Connect )(Expansion=0.508mm) (Conductor Width=0.254mm) (Air Gap=0.254mm) (Entries=4) (All)</a></td>
<td class="column2">0</td>
</tr>
<tr class="onmouseout_even" onmouseover="className = 'onmouseover_even'" onmouseout="className = 'onmouseout_even'">
<td class="column1"><a href="#IDBTUVOERWBYOPJUB20BABOVJSR2DXMZMNINC5IP0WQBWPUNSZOQK">Hole Size Constraint (Min=0.025mm) (Max=20mm) (All)</a></td>
<td class="column2">0</td>
</tr>
<tr class="onmouseout_odd" onmouseover="className = 'onmouseover_odd'" onmouseout="className = 'onmouseout_odd'">
<td class="column1"><a href="#IDN5YTNYCDVMEKM1G4LVAPYWYKXNW3KVSKHCFOUDF3JLMEJTX5L2KC">Hole To Hole Clearance (Gap=0.254mm) (All),(All)</a></td>
<td class="column2">0</td>
</tr>
<tr class="onmouseout_even" onmouseover="className = 'onmouseover_even'" onmouseout="className = 'onmouseout_even'">
<td class="column1"><a href="#IDRWBJL5BKT4TWKYSRQMXMTC22HPNZNS11CNXBFOCD3W5UHXBNR0I">Minimum Solder Mask Sliver (Gap=0mm) (All),(All)</a></td>
<td class="column2">0</td>
</tr>
<tr class="onmouseout_odd" onmouseover="className = 'onmouseover_odd'" onmouseout="className = 'onmouseout_odd'">
<td class="column1"><a href="#IDR3FSMK4RXBARM52Q12YC2RNI4FTFKIMVUZ5IZVCWKFHLKKIIRBNN">Silk To Solder Mask (Clearance=0mm) (IsPad),(All)</a></td>
<td class="column2">0</td>
</tr>
<tr class="onmouseout_even" onmouseover="className = 'onmouseover_even'" onmouseout="className = 'onmouseout_even'">
<td class="column1"><a href="#IDJGSZDYZF4IYFJB33PTYYTWLRRCISJL5R4KHILGNCPH5440IC0YNL">Silk to Silk (Clearance=0mm) (All),(All)</a></td>
<td class="column2">0</td>
</tr>
<tr class="onmouseout_odd" onmouseover="className = 'onmouseover_odd'" onmouseout="className = 'onmouseout_odd'">
<td class="column1"><a href="#ID2F1UGOBU2HKVKGAUM0XH1AVE2IJYZ1EJJXJ3FBEZMDVHSG0324L">Net Antennae (Tolerance=0mm) (All)</a></td>
<td class="column2">0</td>
</tr>
<tr class="onmouseout_even" onmouseover="className = 'onmouseover_even'" onmouseout="className = 'onmouseout_even'">
<td class="column1"><a href="#ID1DJ2EHNQIMG1LW13YUZ05DTEIFSJNOY5YHPLX0KFS00QSAY04GSE">Height Constraint (Min=0mm) (Max=1000mm) (Prefered=12.7mm) (All)</a></td>
<td class="column2">0</td>
</tr>
<tr>
<td style="font-weight : bold; text-align : right" class="column1">Total</td>
<td style="font-weight : bold" class="column2">0</td>
</tr>
</table><br></body>
</html>

BIN
pcbs/digital_board_rev_2/output/Gerber.zip

Binary file not shown.

1519
pcbs/digital_board_rev_2/output/Gerber/uppsense.gbl

File diff suppressed because it is too large

557
pcbs/digital_board_rev_2/output/Gerber/uppsense.gbo

@ -0,0 +1,557 @@
%FSDAX24Y24*%
%MOIN*%
%SFA1B1*%
%IPPOS*%
%ADD19C,0.007900*%
%ADD26C,0.010000*%
%LNuppsense-1*%
%LPD*%
G54D19*
X028248Y029646D02*
X029272D01*
Y030197*
X028248D02*
X029272D01*
X028248Y029646D02*
Y030197D01*
Y030394D02*
X029272D01*
Y030945*
X028248D02*
X029272D01*
X028248Y030394D02*
Y030945D01*
X028228Y031102D02*
X029252D01*
Y031654*
X028228D02*
X029252D01*
X028228Y031102D02*
Y031654D01*
X027087Y031870D02*
Y032894D01*
X026535D02*
X027087D01*
X026535Y031870D02*
Y032894D01*
Y031870D02*
X027087D01*
X028307Y031850D02*
Y032874D01*
X027756D02*
X028307D01*
X027756Y031850D02*
Y032874D01*
Y031850D02*
X028307D01*
X017512Y022598D02*
Y023583D01*
X018134Y022598D02*
Y023583D01*
X017911Y024585D02*
Y024785D01*
X017711Y024585D02*
Y024785D01*
Y023585D02*
Y023785D01*
X017911Y023585D02*
Y023785D01*
Y020315D02*
Y022598D01*
X017711Y020315D02*
Y022585D01*
Y020315D02*
X017911D01*
X016512Y022598D02*
Y023583D01*
X017134Y022598D02*
Y023583D01*
X016911Y024585D02*
Y024785D01*
X016711Y024585D02*
Y024785D01*
Y023585D02*
Y023785D01*
X016911Y023585D02*
Y023785D01*
Y020315D02*
Y022598D01*
X016711Y020315D02*
Y022585D01*
Y020315D02*
X016911D01*
X018311Y022598D02*
Y023585D01*
X011291D02*
X018311D01*
X011911Y020315D02*
Y022598D01*
X011711Y020315D02*
Y022585D01*
Y020315D02*
X011911D01*
X011711Y023585D02*
Y023785D01*
X011911Y023585D02*
Y023785D01*
X011488Y022598D02*
Y023583D01*
X012118Y022598D02*
Y023583D01*
X011291Y022598D02*
Y023585D01*
X015711Y020315D02*
X015911D01*
X015711D02*
Y022585D01*
X015911Y020315D02*
Y022598D01*
X014711Y020315D02*
X014911D01*
X014711D02*
Y022585D01*
X014911Y020315D02*
Y022598D01*
X013711Y020315D02*
X013911D01*
X013711D02*
Y022585D01*
X013911Y020315D02*
Y022598D01*
X012711Y020315D02*
X012911D01*
X012711D02*
Y022585D01*
X012911Y020315D02*
Y022598D01*
X015911Y023585D02*
Y023785D01*
X015711Y023585D02*
Y023785D01*
Y024585D02*
Y024785D01*
X015911Y024585D02*
Y024785D01*
X014911Y023585D02*
Y023785D01*
X014711Y023585D02*
Y023785D01*
Y024585D02*
Y024785D01*
X014911Y024585D02*
Y024785D01*
X013911Y023585D02*
Y023785D01*
X013711Y023585D02*
Y023785D01*
Y024585D02*
Y024785D01*
X013911Y024585D02*
Y024785D01*
X012911Y023585D02*
Y023785D01*
X012711Y023585D02*
Y023785D01*
Y024585D02*
Y024785D01*
X012911Y024585D02*
Y024785D01*
X011911Y024585D02*
Y024785D01*
X011711Y024585D02*
Y024785D01*
X013512Y022598D02*
Y023583D01*
X016134Y022598D02*
Y023583D01*
X015118Y022598D02*
Y023583D01*
X015512Y022598D02*
Y023583D01*
X014118Y022598D02*
Y023583D01*
X014512Y022598D02*
Y023583D01*
X013118Y022598D02*
Y023583D01*
X012512Y022598D02*
Y023583D01*
X011291Y022598D02*
X018311D01*
X011112Y025289D02*
X011212D01*
Y025089D02*
Y025289D01*
X011112Y025089D02*
X011212D01*
X011112D02*
X011212Y025289D01*
Y025089D02*
Y025289D01*
X011112Y025189D02*
X011212Y025089D01*
X011112Y025189D02*
X011312D01*
X011112Y025389D02*
X011312Y025189D01*
X011112Y024989D02*
Y025389D01*
Y024989D02*
X011312Y025189D01*
X011112D02*
X011212Y025289D01*
X011112Y025189D02*
X011212Y025289D01*
X009173Y035641D02*
Y035247D01*
X009370*
X009436Y035313*
Y035444*
X009370Y035510*
X009173*
X009304D02*
X009436Y035641D01*
X009829Y035247D02*
X009567D01*
Y035641*
X009829*
X009567Y035444D02*
X009698D01*
X009960Y035247D02*
Y035510D01*
X010092Y035641*
X010223Y035510*
Y035247*
X010354Y035707D02*
X010616D01*
X011010Y035641D02*
X010748D01*
X011010Y035379*
Y035313*
X010944Y035247*
X010813*
X010748Y035313*
X009436Y036368D02*
X009173D01*
X009436Y036105*
Y036040*
X009370Y035974*
X009239*
X009173Y036040*
X009567Y036368D02*
X009698D01*
X009632*
Y035974*
X009567Y036040*
X009895Y036171D02*
X010157D01*
X010288Y036040D02*
X010354Y035974D01*
X010485*
X010551Y036040*
Y036302*
X010485Y036368*
X010354*
X010288Y036302*
Y036040*
X010682D02*
X010748Y035974D01*
X010879*
X010944Y036040*
Y036105*
X010879Y036171*
X010944Y036237*
Y036302*
X010879Y036368*
X010748*
X010682Y036302*
Y036237*
X010748Y036171*
X010682Y036105*
Y036040*
X010748Y036171D02*
X010879D01*
X011076D02*
X011338D01*
X011731Y036368D02*
X011469D01*
X011731Y036105*
Y036040*
X011666Y035974*
X011535*
X011469Y036040*
X011863D02*
X011928Y035974D01*
X012059*
X012125Y036040*
Y036302*
X012059Y036368*
X011928*
X011863Y036302*
Y036040*
X012256Y036368D02*
X012387D01*
X012322*
Y035974*
X012256Y036040*
X012584Y035974D02*
X012847D01*
Y036040*
X012584Y036302*
Y036368*
X009173Y036636D02*
Y037029D01*
X009370*
X009436Y036964*
Y036701*
X009370Y036636*
X009173*
X009567Y037029D02*
X009698D01*
X009632*
Y036767*
X009567*
X010026Y037160D02*
X010092D01*
X010157Y037095*
Y036767*
X009960*
X009895Y036832*
Y036964*
X009960Y037029*
X010157*
X010288D02*
X010420D01*
X010354*
Y036767*
X010288*
X010682D02*
X010813D01*
X010879Y036832*
Y037029*
X010682*
X010616Y036964*
X010682Y036898*
X010879*
X011010Y037029D02*
X011141D01*
X011076*
Y036636*
X011010*
X011731D02*
Y037029D01*
X011928*
X011994Y036964*
Y036898*
Y036832*
X011928Y036767*
X011731*
X012191Y037029D02*
X012322D01*
X012387Y036964*
Y036832*
X012322Y036767*
X012191*
X012125Y036832*
Y036964*
X012191Y037029*
X012584Y036767D02*
X012715D01*
X012781Y036832*
Y037029*
X012584*
X012519Y036964*
X012584Y036898*
X012781*
X012912Y036767D02*
Y037029D01*
Y036898*
X012978Y036832*
X013043Y036767*
X013109*
X013568Y036636D02*
Y037029D01*
X013371*
X013306Y036964*
Y036832*
X013371Y036767*
X013568*
X009173Y037428D02*
Y037756D01*
X009239Y037822*
X009370*
X009436Y037756*
Y037428*
X009567Y037953D02*
Y037559D01*
X009764*
X009829Y037625*
Y037756*
X009764Y037822*
X009567*
X009960Y037953D02*
Y037559D01*
X010157*
X010223Y037625*
Y037756*
X010157Y037822*
X009960*
X010616Y037494D02*
X010551Y037428D01*
X010420*
X010354Y037494*
Y037559*
X010420Y037625*
X010551*
X010616Y037690*
Y037756*
X010551Y037822*
X010420*
X010354Y037756*
X010944Y037822D02*
X010813D01*
X010748Y037756*
Y037625*
X010813Y037559*
X010944*
X011010Y037625*
Y037690*
X010748*
X011141Y037822D02*
Y037559D01*
X011338*
X011403Y037625*
Y037822*
X011535D02*
X011731D01*
X011797Y037756*
X011731Y037690*
X011600*
X011535Y037625*
X011600Y037559*
X011797*
X012125Y037822D02*
X011994D01*
X011928Y037756*
Y037625*
X011994Y037559*
X012125*
X012191Y037625*
Y037690*
X011928*
X027205Y031575D02*
Y031181D01*
X027402*
X027467Y031247*
Y031378*
X027402Y031444*
X027205*
X027336D02*
X027467Y031575D01*
X027598Y031247D02*
X027664Y031181D01*
X027795*
X027861Y031247*
Y031312*
X027795Y031378*
X027861Y031444*
Y031509*
X027795Y031575*
X027664*
X027598Y031509*
Y031444*
X027664Y031378*
X027598Y031312*
Y031247*
X027664Y031378D02*
X027795D01*
X027244Y030906D02*
Y030512D01*
X027441*
X027506Y030578*
Y030709*
X027441Y030774*
X027244*
X027375D02*
X027506Y030906D01*
X027638Y030512D02*
X027900D01*
Y030578*
X027638Y030840*
Y030906*
X027717Y033583D02*
Y033189D01*
X027913*
X027979Y033255*
Y033386*
X027913Y033451*
X027717*
X027848D02*
X027979Y033583D01*
X028372Y033189D02*
X028241Y033255D01*
X028110Y033386*
Y033517*
X028176Y033583*
X028307*
X028372Y033517*
Y033451*
X028307Y033386*
X028110*
X026535Y033543D02*
Y033150D01*
X026732*
X026798Y033215*
Y033347*
X026732Y033412*
X026535*
X026667D02*
X026798Y033543D01*
X027191Y033150D02*
X026929D01*
Y033347*
X027060Y033281*
X027126*
X027191Y033347*
Y033478*
X027126Y033543*
X026995*
X026929Y033478*
X027185Y030118D02*
Y029725D01*
X027382*
X027447Y029790*
Y029921*
X027382Y029987*
X027185*
X027316D02*
X027447Y030118D01*
X027579Y029790D02*
X027644Y029725D01*
X027775*
X027841Y029790*
Y029856*
X027775Y029921*
X027710*
X027775*
X027841Y029987*
Y030053*
X027775Y030118*
X027644*
X027579Y030053*
G54D26*
X012441Y025869D02*
Y026469D01*
Y026169*
X012841*
Y025869*
Y026469*
X013441D02*
X013041D01*
X013441Y026069*
Y025969*
X013341Y025869*
X013141*
X013041Y025969*
M02*

69
pcbs/digital_board_rev_2/output/Gerber/uppsense.gbs

@ -0,0 +1,69 @@
%FSDAX24Y24*%
%MOIN*%
%SFA1B1*%
%IPPOS*%
%AMD28*
4,1,8,0.005900,0.021700,-0.005900,0.021700,-0.015800,0.011800,-0.015800,-0.011800,-0.005900,-0.021700,0.005900,-0.021700,0.015800,-0.011800,0.015800,0.011800,0.005900,0.021700,0.0*
1,1,0.019800,0.005900,0.011800*
1,1,0.019800,-0.005900,0.011800*
1,1,0.019800,-0.005900,-0.011800*
1,1,0.019800,0.005900,-0.011800*
%
%AMD29*
4,1,8,0.021700,-0.005900,0.021700,0.005900,0.011800,0.015800,-0.011800,0.015800,-0.021700,0.005900,-0.021700,-0.005900,-0.011800,-0.015800,0.011800,-0.015800,0.021700,-0.005900,0.0*
1,1,0.019800,0.011800,-0.005900*
1,1,0.019800,0.011800,0.005900*
1,1,0.019800,-0.011800,0.005900*
1,1,0.019800,-0.011800,-0.005900*
%
G04~CAMADD=28~8~0.0~0.0~316.0~434.0~99.0~0.0~15~0.0~0.0~0.0~0.0~0~0.0~0.0~0.0~0.0~0~0.0~0.0~0.0~0.0~316.0~434.0*
%ADD28D28*%
G04~CAMADD=29~8~0.0~0.0~316.0~434.0~99.0~0.0~15~0.0~0.0~0.0~0.0~0~0.0~0.0~0.0~0.0~0~0.0~0.0~0.0~270.0~434.0~316.0*
%ADD29D29*%
%ADD37C,0.078900*%
%ADD38R,0.078900X0.078900*%
%ADD39C,0.047400*%
%LNuppsense-1*%
%LPD*%
G54D28*
X029055Y029921D03*
X028465D03*
X029055Y030669D03*
X028465D03*
X029035Y031378D03*
X028445D03*
G54D29*
X026811Y032677D03*
Y032087D03*
X028031Y032657D03*
Y032067D03*
G54D37*
X033433Y024185D03*
Y025185D03*
X034433Y024185D03*
Y025185D03*
X035433Y024185D03*
X017811Y025185D03*
Y024185D03*
X016811Y025185D03*
Y024185D03*
X011811D03*
X012811Y025185D03*
Y024185D03*
X013811Y025185D03*
Y024185D03*
X014811D03*
Y025185D03*
X015811Y024185D03*
Y025185D03*
G54D38*
X035433Y025185D03*
X011811D03*
G54D39*
X022362Y035248D03*
Y035748D03*
Y036248D03*
Y036748D03*
Y037248D03*
M02*

76
pcbs/digital_board_rev_2/output/Gerber/uppsense.gko

@ -0,0 +1,76 @@
%FSDAX24Y24*%
%MOIN*%
%SFA1B1*%
%IPPOS*%
%ADD26C,0.010000*%
%LNuppsense-1*%
%LPD*%
G54D26*
X039370Y037402D02*
D01*
X039365Y037539*
X039350Y037676*
X039326Y037811*
X039293Y037944*
X039251Y038075*
X039199Y038202*
X039139Y038326*
X039070Y038445*
X038993Y038559*
X038909Y038667*
X038817Y038769*
X038718Y038865*
X038613Y038953*
X038502Y039034*
X038385Y039107*
X038264Y039171*
X038138Y039227*
X038009Y039274*
X037877Y039312*
X037742Y039341*
X037606Y039360*
X037469Y039369*
X037402Y039370*
X009843D02*
D01*
X009705Y039365*
X009568Y039350*
X009433Y039326*
X009300Y039293*
X009169Y039251*
X009042Y039199*
X008918Y039139*
X008799Y039070*
X008685Y038993*
X008577Y038909*
X008475Y038817*
X008379Y038718*
X008291Y038613*
X008210Y038502*
X008137Y038385*
X008073Y038264*
X008017Y038138*
X007970Y038009*
X007932Y037877*
X007903Y037742*
X007884Y037606*
X007875Y037469*
X007874Y037402*
Y019685D02*
X039370D01*
X023976Y036417D02*
X030374D01*
X023976D02*
Y039370D01*
X030374Y036417D02*
Y039370D01*
X039370Y019685D02*
Y037402D01*
X030374Y039370D02*
X037402D01*
X007874Y019685D02*
Y037402D01*
X009843Y039370D02*
X023976D01*
M02*

3320
pcbs/digital_board_rev_2/output/Gerber/uppsense.gtl

File diff suppressed because it is too large

5583
pcbs/digital_board_rev_2/output/Gerber/uppsense.gto

File diff suppressed because it is too large

185
pcbs/digital_board_rev_2/output/Gerber/uppsense.gts

@ -0,0 +1,185 @@
%FSDAX24Y24*%
%MOIN*%
%SFA1B1*%
%IPPOS*%
%AMD28*
4,1,8,0.005900,0.021700,-0.005900,0.021700,-0.015800,0.011800,-0.015800,-0.011800,-0.005900,-0.021700,0.005900,-0.021700,0.015800,-0.011800,0.015800,0.011800,0.005900,0.021700,0.0*
1,1,0.019800,0.005900,0.011800*
1,1,0.019800,-0.005900,0.011800*
1,1,0.019800,-0.005900,-0.011800*
1,1,0.019800,0.005900,-0.011800*
%
%AMD29*
4,1,8,0.021700,-0.005900,0.021700,0.005900,0.011800,0.015800,-0.011800,0.015800,-0.021700,0.005900,-0.021700,-0.005900,-0.011800,-0.015800,0.011800,-0.015800,0.021700,-0.005900,0.0*
1,1,0.019800,0.011800,-0.005900*
1,1,0.019800,0.011800,0.005900*
1,1,0.019800,-0.011800,0.005900*
1,1,0.019800,-0.011800,-0.005900*
%
G04~CAMADD=28~8~0.0~0.0~316.0~434.0~99.0~0.0~15~0.0~0.0~0.0~0.0~0~0.0~0.0~0.0~0.0~0~0.0~0.0~0.0~0.0~316.0~434.0*
%ADD28D28*%
G04~CAMADD=29~8~0.0~0.0~316.0~434.0~99.0~0.0~15~0.0~0.0~0.0~0.0~0~0.0~0.0~0.0~0.0~0~0.0~0.0~0.0~270.0~434.0~316.0*
%ADD29D29*%
%ADD30O,0.025700X0.065100*%
%ADD31R,0.025700X0.065100*%
%ADD32R,0.063100X0.090700*%
%ADD33R,0.108000X0.053000*%
%ADD34R,0.063000X0.108000*%
%ADD35R,0.019800X0.065100*%
%ADD36O,0.019800X0.065100*%
%ADD37C,0.078900*%
%ADD38R,0.078900X0.078900*%
%ADD39C,0.047400*%
%LNuppsense-1*%
%LPD*%
G54D28*
X029902Y023031D03*
X029311D03*
X008665Y029130D03*
X009255D03*
X008653Y028428D03*
X009244D03*
X008668Y023427D03*
X009259D03*
X008668Y022677D03*
X009259D03*
X009803Y026378D03*
X010394D03*
X009803Y027126D03*
X010394D03*
X009818Y020627D03*
X010409D03*
X009818Y021327D03*
X010409D03*
X033720Y033701D03*
X033130D03*
X016240Y034606D03*
X016831D03*
X032185Y022098D03*
X032776D03*
X032185Y022807D03*
X032776D03*
X033858Y027165D03*
X034449D03*
G54D29*
X009213Y033445D03*
Y034035D03*
X032598Y024126D03*
Y024717D03*
X020748Y035236D03*
Y034646D03*
X021417Y034154D03*
Y033563D03*
X018543Y034606D03*
Y035197D03*
X033425Y026437D03*
Y025846D03*
X032598Y026016D03*
Y025425D03*
X031535Y022157D03*
Y021567D03*
X030787Y022138D03*
Y021547D03*
X032677Y027146D03*
Y027736D03*
G54D30*
X009902Y032874D03*
X010660Y029660D03*
X010625Y023909D03*
G54D31*
X010157Y032874D03*
X010413D03*
X010669D03*
Y034606D03*
X010413D03*
X010167D03*
X009911D03*
X010404Y029660D03*
X010148D03*
X009893D03*
Y027928D03*
X010148D03*
X010404D03*
X010660D03*
X010369Y023909D03*
X010113D03*
X009857D03*
Y022177D03*
X010113D03*
X010369D03*
X010625D03*
G54D32*
X017696Y038752D03*
X019468D03*
Y035170D03*
X017696D03*
X033130Y038760D03*
X034902D03*
Y035177D03*
X033130D03*
G54D33*
X024096Y035123D03*
Y034343D03*
Y033553D03*
Y032773D03*
Y031973D03*
Y031193D03*
Y030413D03*
Y029623D03*
X030246Y029613D03*
Y030403D03*
Y031183D03*
X030236Y031973D03*
Y032763D03*
Y033543D03*
Y035123D03*
Y034343D03*
G54D34*
X025196Y028803D03*
X025976D03*
X026756D03*
X027556D03*
X028336D03*
X029136D03*
G54D35*
X031136Y025296D03*
X031333D03*
X031530D03*
X031727D03*
X031924D03*
Y023563D03*
X031727D03*
X031530D03*
X031333D03*
G54D36*
X031136Y023563D03*
G54D37*
X033433Y024185D03*
Y025185D03*
X034433Y024185D03*
Y025185D03*
X035433Y024185D03*
X017811Y025185D03*
Y024185D03*
X016811Y025185D03*
Y024185D03*
X011811D03*
X012811Y025185D03*
Y024185D03*
X013811Y025185D03*
Y024185D03*
X014811D03*
Y025185D03*
X015811Y024185D03*
Y025185D03*
G54D38*
X035433Y025185D03*
X011811D03*
G54D39*
X022362Y035248D03*
Y035748D03*
Y036248D03*
Y036748D03*
Y037248D03*
M02*

142
pcbs/digital_board_rev_2/output/Gerber/uppsense.txt

@ -0,0 +1,142 @@
%FSDAX24Y24*%
%MOIN*%
%SFA1B1*%
%IPPOS*%
%ADD9500C,0.011800*%
%ADD9501C,0.027600*%
%ADD9502C,0.028000*%
%ADD9503C,0.039400*%
%LNuppsense-1*%
%LPD*%
G54D9500*
X032480Y023622D03*
X036417D03*
X038386D03*
X037402Y021654D03*
X035433D03*
X037402Y025591D03*
X036417Y027559D03*
X038386D03*
X037402Y029528D03*
X035433D03*
X033465D03*
X031673Y026756D03*
X030646D03*
X030512Y027559D03*
X028543D03*
X026575D03*
X024606D03*
X022638D03*
X020827Y027165D03*
X021654Y025591D03*
X019685D03*
X018701Y023622D03*
X020669D03*
X022638D03*
X024606D03*
X026457Y022756D03*
X025591Y021654D03*
X023622D03*
X021654D03*
X019685D03*
X017717D03*
X015748D03*
Y029528D03*
X018701Y027559D03*
X021654Y029528D03*
X025118Y029623D03*
X025591Y029528D03*
X027559D03*
X029528D03*
X029055Y030315D03*
Y031024D03*
X029528Y025591D03*
X028543Y023622D03*
X030512D03*
X029528Y021654D03*
X027559D03*
X025591Y025591D03*
X023622D03*
X014764Y023622D03*
X012795D03*
X011811Y021654D03*
X013780D03*
X010236Y024488D03*
X009724Y024528D03*
X012795Y027559D03*
X011811Y029528D03*
X013780D03*
X012795Y031496D03*
X014764D03*
Y035433D03*
X012795D03*
X010827D03*
X009843Y033465D03*
X009893Y031654D03*
X010236D03*
X010748Y032087D03*
X011811Y037402D03*
X013780D03*
X015748D03*
X017717D03*
X019685D03*
X021654D03*
X023622D03*
X022638Y034764D03*
X021890Y034173D03*
X019685Y033465D03*
X017717D03*
X016732Y031496D03*
Y035433D03*
X022638Y031496D03*
X029055Y031890D03*
X026575Y035433D03*
X032480D03*
X031496Y033465D03*
X032480Y031496D03*
X034449D03*
X036417D03*
X038386D03*
X037402Y033465D03*
X035433D03*
X034528Y033701D03*
X036417Y035433D03*
X038386D03*
X037402Y037402D03*
X035433D03*
X033465D03*
X031496D03*
G54D9501*
X022362Y035248D03*
Y035748D03*
Y036248D03*
Y036748D03*
Y037248D03*
G54D9502*
X026181Y034331D03*
X026220Y035118D03*
X029213Y033504D03*
X029134Y032756D03*
G54D9503*
X033433Y024185D03*
Y025185D03*
X034433D03*
Y024185D03*
X035433D03*
Y025185D03*
X017811D03*
Y024185D03*
X016811D03*
Y025185D03*
X015811D03*
Y024185D03*
X014811D03*
X013811D03*
X012811D03*
X011811D03*
Y025185D03*
X012811D03*
X013811D03*
X014811D03*
M02*

BIN
pcbs/digital_board_rev_2/output/layout.pdf

Binary file not shown.

BIN
pcbs/digital_board_rev_2/output/schematics.pdf

Binary file not shown.

BIN
pcbs/digital_board_rev_2/uppsense.PcbDoc

Binary file not shown.

1112
pcbs/digital_board_rev_2/uppsense.PrjPcb

File diff suppressed because it is too large

1
pcbs/digital_board_rev_2/uppsense.PrjPcbStructure

@ -0,0 +1 @@
Record=TopLevelDocument|FileName=uppsense.SchDoc

BIN
pcbs/digital_board_rev_2/uppsense.SchDoc

Binary file not shown.

28
pcbs/transimpedance_amp_v0.1/photodiodes.pretty/BPW34FA.kicad_mod

@ -1,8 +1,30 @@
(module BPW34FA (layer F.Cu) (tedit 58FDD900)
(fp_text reference REF** (at 0 0.5) (layer F.SilkS)
(module BPW34FA (layer F.Cu) (tedit 58FDDC7C)
(fp_text reference REF** (at 0 3.81) (layer F.SilkS)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text value BPW34FA (at 0 -0.5) (layer F.Fab)
(fp_text value BPW34FA (at 0 -3.81) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start -0.8 -1.2) (end -0.6 -1.1) (layer F.SilkS) (width 0.15))
(fp_line (start -0.8 -1.2) (end -0.8 -1.5) (layer F.SilkS) (width 0.15))
(fp_line (start -0.5 -0.8) (end -0.5 -1) (layer F.SilkS) (width 0.15))
(fp_line (start -0.5 -1) (end -0.5 -0.8) (layer F.SilkS) (width 0.15))
(fp_line (start -0.5 -0.8) (end -0.3 -0.7) (layer F.SilkS) (width 0.15))
(fp_line (start -0.5 -0.8) (end 0.3 -1.3) (layer F.SilkS) (width 0.15))
(fp_line (start -0.8 -1.2) (end 0 -1.7) (layer F.SilkS) (width 0.15))
(fp_line (start -1.1 -0.9) (end -1.1 0.9) (layer F.SilkS) (width 0.15))
(fp_line (start -1.1 0) (end 0.6 0.9) (layer F.SilkS) (width 0.15))
(fp_line (start 0.6 0) (end 0.6 0.9) (layer F.SilkS) (width 0.15))
(fp_line (start 0.6 -0.9) (end 0.6 0) (layer F.SilkS) (width 0.15))
(fp_line (start -1.1 0) (end 0.6 -0.9) (layer F.SilkS) (width 0.15))
(fp_line (start -1.6 0) (end 1.5 0) (layer F.SilkS) (width 0.15))
(fp_line (start 1.5 0) (end 1.6 0) (layer F.SilkS) (width 0.15))
(fp_line (start 2 1) (end 2 2) (layer F.SilkS) (width 0.15))
(fp_line (start 2 -2) (end 2 -1) (layer F.SilkS) (width 0.15))
(fp_line (start -2 1) (end -2 2) (layer F.SilkS) (width 0.15))
(fp_line (start -2 -2) (end 2 -2) (layer F.SilkS) (width 0.15))
(fp_line (start -2 2) (end 2 2) (layer F.SilkS) (width 0.15))
(fp_line (start -2 -2) (end -2 -1) (layer F.SilkS) (width 0.15))
(pad 1 thru_hole circle (at -2.5 0) (size 1.524 1.524) (drill 0.762) (layers *.Cu *.Mask))
(pad 2 thru_hole circle (at 2.5 0) (size 1.524 1.524) (drill 0.762) (layers *.Cu *.Mask))
)

42
software/.gitignore

@ -0,0 +1,42 @@
# Created by https://www.gitignore.io/api/c++
### C++ ###
# Prerequisites
*.d
# Compiled Object files
*.slo
*.lo
*.o
*.obj
# Precompiled Headers
*.gch
*.pch
# Compiled Dynamic libraries
*.so
*.dylib
*.dll
# Fortran module files
*.mod
*.smod
# Compiled Static libraries
*.lai
*.la
*.a
*.lib
# Executables
*.exe
*.out
*.app
out/
# Individual Setting
Makefile-user.mk
documentation/
# End of https://www.gitignore.io/api/c++

BIN
software/Basic_Blink/out/build/app.out

Binary file not shown.

BIN
software/Basic_Blink/out/build/app/ads101x.o

Binary file not shown.

BIN
software/Basic_Blink/out/build/app/application.o

Binary file not shown.

BIN
software/Basic_Blink/out/build/app/sensor_hub.o

Binary file not shown.

BIN
software/Basic_Blink/out/build/app_app.a

Binary file not shown.

BIN
software/Basic_Blink/out/firmware/0x00000.bin

Binary file not shown.

BIN
software/Basic_Blink/out/firmware/0x0a000.bin

Binary file not shown.

10499
software/Basic_Blink/out/firmware/firmware.map

File diff suppressed because it is too large

10
software/Basic_Blink/out/firmware/fwMeminfo.new

@ -1,10 +0,0 @@
Section| Description| Start (hex)| End (hex)|Used space
------------------------------------------------------------------------------
data| Initialized Data (RAM)| 3FFE8000| 3FFE8389| 905
rodata| ReadOnly Data (RAM)| 3FFE8390| 3FFE8D6C| 2524
bss| Uninitialized Data (RAM)| 3FFE8D70| 3FFEF160| 25584
text| Cached Code (IRAM)| 40100000| 401063A8| 25512
irom0_text| Uncached Code (SPI)| 4020A000| 4023964C| 194124
Total Used RAM : 29013
Free RAM : 52907
Free IRam : 7274

10
software/Basic_Blink/out/firmware/fwMeminfo.old

@ -1,10 +0,0 @@
Section| Description| Start (hex)| End (hex)|Used space
------------------------------------------------------------------------------
data| Initialized Data (RAM)| 3FFE8000| 3FFE8389| 905
rodata| ReadOnly Data (RAM)| 3FFE8390| 3FFE8D50| 2496
bss| Uninitialized Data (RAM)| 3FFE8D50| 3FFEF108| 25528
text| Cached Code (IRAM)| 40100000| 401063A8| 25512
irom0_text| Uncached Code (SPI)| 4020A000| 40239584| 193924
Total Used RAM : 28929
Free RAM : 52991
Free IRam : 7274

2494
software/Doxyfile

File diff suppressed because it is too large

24
software/Makefile

@ -0,0 +1,24 @@
#####################################################################
#### Please don't change this file. Use Makefile-user.mk instead ####
#####################################################################
# Including user Makefile.
# Should be used to set project-specific parameters
include ./Makefile-user.mk
# Important parameters check.
# We need to make sure SMING_HOME and ESP_HOME variables are set.
# You can use Makefile-user.mk in each project or use enviromental variables to set it globally.
ifndef SMING_HOME
$(error SMING_HOME is not set. Please configure it in Makefile-user.mk)
endif
ifndef ESP_HOME
$(error ESP_HOME is not set. Please configure it in Makefile-user.mk)
endif
# Include main Sming Makefile
ifeq ($(RBOOT_ENABLED), 1)
include $(SMING_HOME)/Makefile-rboot.mk
else
include $(SMING_HOME)/Makefile-project.mk
endif

36
software/app/access_point.cpp

@ -0,0 +1,36 @@
/*
* access_point.cpp
*
* Created on: Aug 28, 2017
* Author: Elmar
*/
#include <user_config.h>
#include <SmingCore/SmingCore.h>
#include "access_point.h"
static void STADisconnect(String ssid, uint8_t ssid_len, uint8_t bssid[6], uint8_t reason) {
if (!WifiAccessPoint.isEnabled()) {
WifiStation.disconnect();
WifiAccessPoint.enable(true);
WifiStation.connect();
}
}
static void STAGotIP(IPAddress ip, IPAddress mask, IPAddress gateway) {
if (WifiAccessPoint.isEnabled()) {
WifiAccessPoint.enable(false);
}
}
void access_point_start() {
wifi_set_sleep_type(NONE_SLEEP_T);
WifiAccessPoint.setIP(IPAddress(10, 0, 0, 1));
WifiAccessPoint.enable(true);
WifiEvents.onStationDisconnect(STADisconnect);
WifiEvents.onStationGotIP(STAGotIP);
}
void access_point_config() {
WifiAccessPoint.config("Sensus", "", AUTH_OPEN, false, 3);
}

14
software/app/access_point.h

@ -0,0 +1,14 @@
/*
* access_point.h
*
* Created on: Aug 28, 2017
* Author: Elmar
*/
#ifndef APP_ACCESS_POINT_H_
#define APP_ACCESS_POINT_H_
void access_point_start();
void access_point_config();
#endif /* APP_ACCESS_POINT_H_ */

185
software/app/ads101x.cpp

@ -0,0 +1,185 @@
/*
* ADS101x.cpp
*
* Created on: Jul 20, 2017
* Author: Elmar
*/
#include "ads101x.h"
#include <SmingCore/Wire.h>
#include <SmingCore/SmingCore.h>
namespace rijnfel {
namespace ads {
static const uint16_t OS_POS = 15;
static const uint16_t OS_MASK = 1 << OS_POS;
static const uint16_t MUX_POS = 12;
static const uint16_t MUX_MASK = 7 << MUX_POS;
static const uint16_t PGA_POS = 9;
static const uint16_t PGA_MASK = 7 << PGA_POS;
static const uint16_t MODE_POS = 8;
static const uint16_t MODE_MASK = 1 << MODE_POS;
static const uint16_t DR_POS = 5;
static const uint16_t DR_MASK = 7 << DR_POS;
#define OS_BIT(val) ((val << OS_POS) & OS_MASK)
#define MUX_BIT(val) ((val << MUX_POS) & MUX_MASK)
#define PGA_BIT(val) ((val << PGA_POS) & PGA_MASK)
#define MODE_BIT(val) ((val << MODE_POS) & MODE_MASK)
#define DR_BIT(val) ((val << DR_POS) & DR_MASK)
static const uint8_t REGISTER_CONVERSION = 0;
static const uint8_t REGISTER_CONFIG = 1;
static const uint8_t REGISTER_LOW_TRESHOLD = 2;
static const uint8_t REGISTER_HIGH_TRESHOLD = 2;
cADS101x::cADS101x(uint8_t i_address) :
m_address(i_address), m_readyPin(0) {
SetDefaults();
}
cADS101x::cADS101x(uint8_t i_readyPin, uint8_t i_address) :
m_address(i_address), m_readyPin(i_readyPin) {
SetDefaults();
}
void cADS101x::SetOneShot(bool i_oneShot) {
m_oneShot = i_oneShot;
}
void cADS101x::SetGain(enum eGainAmplifier i_gain) {
m_gain = i_gain;
}
void cADS101x::SetMux(enum eInputMux i_mux) {
m_mux = i_mux;
}
void cADS101x::SetSampleSpeed(enum eSampleSpeed i_sampleSpeed) {
m_sampleSpeed = i_sampleSpeed;
}
void cADS101x::WaitSample(void) {
OneShot();
uint16 readSettings = 0;
do {
readSettings = GetSettings();
} while (readSettings & OS_MASK != 1);
}
bool cADS101x::IsReady(void) {
return (GetSettings() & OS_MASK);
}
uint16_t cADS101x::CreateSettings(uint8_t start) {
return OS_BIT(start) | MUX_BIT(m_mux) | PGA_BIT(m_gain) | MODE_BIT(m_oneShot) | DR_BIT(m_sampleSpeed);
}
void cADS101x::WriteSettings(uint16_t i_settings) {
#ifdef DUMMY_ADC
return;
#else
Wire.beginTransmission(m_address);
Wire.write((uint8_t) REGISTER_CONFIG);
Wire.write((uint8_t) (i_settings >> 8));
Wire.write((uint8_t) (i_settings & 0xFF));
int8_t ret = Wire.endTransmission();
if (ret) {
//Serial.printf("Err writing settings ret: %d\n\r", ret);
}
#endif
}
uint16_t cADS101x::ReadRegister(uint8_t i_register) {
#ifdef DUMMY_ADC
return 1;
#else
Wire.beginTransmission(m_address);
Wire.write(i_register);
Wire.endTransmission();
Wire.requestFrom(m_address, static_cast<uint8_t>(2));
return ((Wire.read() << 8) | (Wire.read()));
#endif
}
void cADS101x::OneShot(void) {
//if (m_oneShot) {
uint16_t settings = CreateSettings(1);
WriteSettings(settings);
//}
}
uint16_t cADS101x::GetSettings(void) {
#ifdef DUMMY_ADC
return CreateSettings(0);
#else
return ReadRegister(REGISTER_CONFIG);
#endif
}
ads_voltage_t cADS101x::ConvertSample(ads_sample_t & sample) {
//Raw sample is in (parts of) millivolts, go to micro to remove fractions
ads_voltage_t returnType = (sample.rawSample >> 4);
//Multiply for extra precision
switch (sample.gain) {
case eGainAmplifier::FSR_0_256:
//one lsb is 0.125 mv = 125 uv
returnType *= 125;
break;
case eGainAmplifier::FSR_0_512:
//one lsb is 0.25 mv = 250 uv
returnType *= 250;
break;
case eGainAmplifier::FSR_1_024:
//one lsb is 0.5 mv = 500 uv
returnType *= 500;
break;
case eGainAmplifier::FSR_2_048:
//one lsb is 1 mv = 1000 uv
returnType *= 1000;
break;
case eGainAmplifier::FSR_4_096:
//one lsb is 2 mv = 2000 uv
returnType *= 2000;
break;
case eGainAmplifier::FSR_6_144:
//one lsb is 3 mv = 3000 uv
returnType *= 3000;
break;
}
return returnType / 1000;
}
ads_sample_t cADS101x::RawSample(void) {
#ifdef DUMMY_ADC
ads_sample_t sample;
sample.gain = m_gain;
sample.mux = m_mux;
sample.rawSample = m_counter;
m_counter += 8;
return sample;
#else
OneShot();
ads_sample_t sample;
sample.rawSample = ReadRegister(REGISTER_CONVERSION);
sample.gain = m_gain;
sample.mux = m_mux;
m_latestSample = sample;
#endif
return sample;
}
void cADS101x::SetDefaults(void) {
m_mux = eInputMux::AIN_0_1;
m_gain = eGainAmplifier::FSR_2_048;
m_sampleSpeed = eSampleSpeed::SPS_1600;
m_oneShot = true;
#ifdef DUMMY_ADC
m_counter = 0;
#endif
}
}
}

76
software/app/ads101x.h

@ -0,0 +1,76 @@
/*
* ADS101x.h
*
* Created on: Jul 20, 2017
* Author: Elmar
*/
#ifndef APP_ADS101X_H_
#define APP_ADS101X_H_
#include <stdint.h>
#include <hardware.h>
#include <rijnfel_core/rijnfel_core.h>
namespace rijnfel {
namespace ads {
//Voltage in uV
typedef int32_t ads_voltage_t;
enum eInputMux {
AIN_0_1, AIN_0_3, AIN_1_3, AIN_2_3, AIN_0, AIN_1, AIN_2, AIN_3
};
enum eGainAmplifier {
FSR_6_144, FSR_4_096, FSR_2_048, FSR_1_024, FSR_0_512, FSR_0_256
};
enum eSampleSpeed {
SPS_128, SPS_250, SPS_490, SPS_920, SPS_1600, SPS_2400, SPS_3300
};
struct ads_sample_t {
uint16_t rawSample;
enum eInputMux mux;
enum eGainAmplifier gain;
};
class cADS101x: public cADC<ads_sample_t, ads_voltage_t> {
public:
cADS101x(uint8_t i_address = 0x48);
cADS101x(uint8_t i_readyPin, uint8_t i_address = 0x48);
void SetOneShot(bool i_oneShot = true);
void SetGain(enum eGainAmplifier i_gain);
void SetMux(enum eInputMux i_mux);
void SetSampleSpeed(enum eSampleSpeed i_speed);
virtual void WaitSample(void);
virtual bool IsReady(void);
uint16_t GetSettings(void);
virtual ads_sample_t RawSample(void);
virtual ads_voltage_t ConvertSample(ads_sample_t & sample);
virtual ~cADS101x() {
}
private:
uint16_t CreateSettings(uint8_t i_startSample);
uint16_t ReadRegister(uint8_t i_register);
void WriteSettings(uint16_t i_settings);
void SetDefaults(void);
void OneShot(void);
private:
uint8_t m_address, m_readyPin;
bool m_oneShot;
enum eInputMux m_mux;
enum eGainAmplifier m_gain;
enum eSampleSpeed m_sampleSpeed;
private:
#ifdef DUMMY_ADC
uint16_t m_counter;
#endif
};
}
}
#endif /* APP_ADS101X_H_ */

42
software/app/ads_converter.cpp

@ -0,0 +1,42 @@
/*
* ads_converter.cpp
*
* Created on: Aug 22, 2017
* Author: Elmar
*/
#include "ads_converter.h"
namespace rijnfel {
cAdsConverter::cAdsConverter(cADC<ads::ads_sample_t, int32_t> & i_adc) :
m_adc(i_adc), m_rawSamples(this) {
// TODO Auto-generated constructor stub
}
cAdsConverter::~cAdsConverter() {
// TODO Auto-generated destructor stub
}
void cAdsConverter::ReceiveCallback(void* i_data, cDataReceiver* i_provider) {
//We dont car for the provider
cDoubleBuffer<ads::ads_sample_t> * i_adcBuffer = static_cast<cDoubleBuffer<ads::ads_sample_t>*>(i_data);
ads::ads_sample_t * buf = &i_adcBuffer->GetReadyBuffer()[0];
if (buf != NULL) {
sSizedArray arr;
int pos = buf->mux - ads::eInputMux::AIN_0;
int64_t average = 0;
int size = i_adcBuffer->GetSize();
arr.size = size;
arr.u_array = new uint32_t[size];
for (int i = 0; i < size; i++) {
arr.u_array[i] = m_adc.ConvertSample(buf[i]);
}
m_convertedSamples[pos].Push(static_cast<void *>(&arr));
delete arr.u_array;
}
}
} /* namespace rijnfel */

30
software/app/ads_converter.h

@ -0,0 +1,30 @@
/*
* ads_converter.h
*
* Created on: Aug 22, 2017
* Author: Elmar
*/
#ifndef APP_ADS_CONVERTER_H_
#define APP_ADS_CONVERTER_H_
#include <rijnfel_core/rijnfel_core.h>
#include "ads101x.h"
namespace rijnfel {
class cAdsConverter: public cDataSink {
public:
cAdsConverter(cADC<ads::ads_sample_t, int32_t> & i_adc);
virtual void ReceiveCallback(void * i_data, cDataReceiver * i_provider);
// Every channel has its own provider, after this we can not distinguish anymore
cDataProvider m_convertedSamples[4];
cDataReceiver m_rawSamples;
virtual ~cAdsConverter();
private:
cADC<ads::ads_sample_t, int32_t> & m_adc;
};
} /* namespace rijnfel */
#endif /* APP_ADS_CONVERTER_H_ */

141
software/app/application.cpp

@ -0,0 +1,141 @@
#include <user_config.h>
#include <hardware.h>
#include <SmingCore/SmingCore.h>
#include <SmingCore/HardwareSerial.h>
#include <application.h>
#include <stdint.h>
#include <rijnfel_core/rijnfel_core.h>
#include "excitation_light.h"
#include "ads101x.h"
#include "ads_converter.h"
#include "web_interface.h"
#include "signal_process.h"
#include "sensor_hub.h"
#include "access_point.h"
#include "tests.h"
using namespace rijnfel;
cAdsConverter * adsConverter;
//We want different signal processing for the channels
cSignalProcess signalProcess[2];
cProviderAverager<uint16_t, uint32_t> averagers[4];
cProviderBuffer<uint32_t> bufferChannels[2] { { 1024 }, { 1024 } };
cProviderAverager<uint16_t, uint32_t> processedAveragers[2] { { 10 }, { 10 } };
cProviderAverager<uint16_t, uint32_t> processedAveragersBuffer[2] { { 10 }, { 10 } };
Timer procTimer;
Timer rectangleTimer;
Timer _stopTimer;
light::cExcitationLight mylight;
cSensorHub hub(HUB_PERIOD);
ads::cADS101x ads1015(0, ADC_ADDRESS);
static bool _sensorStationRunning = false;
static bool _keepRunning = false;
static void UpdateSensorHub() {
WDT.alive();
hub.Update();
}
static void StopRunning() {
StopSensorStation();
}
void StartSensorStation(int seconds) {
if (_sensorStationRunning) {
return;
}
if (seconds == 0) {
_keepRunning = true;
} else {
_stopTimer.initializeMs(seconds * 1000, StopRunning).start(false);
_keepRunning = false;
}
procTimer.initializeUs(HUB_PERIOD, UpdateSensorHub).start();
_sensorStationRunning = true;
}
void StopSensorStation(void) {
if (!_sensorStationRunning)
return;
if (!_keepRunning) {
_stopTimer.stop();
}
procTimer.initializeUs(HUB_PERIOD, UpdateSensorHub).stop();
_sensorStationRunning = false;
}
void ChangeSampleChannel(int channel) {
if (channel > 0 && channel < 5) {
if (_sensorStationRunning) {
hub.Stop();
}
ads1015.SetMux(static_cast<ads::eInputMux>(ads::eInputMux::AIN_0 + channel - 1));
if (_sensorStationRunning) {
hub.Start();
}
}
}
void ready() {
hub.Start();
access_point_config();
}
void init() {
spiffs_mount();
Serial.begin(460800);
system_update_cpu_freq(SYS_CPU_160MHZ);
access_point_start();
System.onReady(ready);
Wire.pins(4, 5);
Wire.begin();
Serial.systemDebugOutput(false);
delay(10);
system_set_os_print(0);
// Turn off LED for measurements
hub.Stop();
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, 1);
ads1015.SetMux(ads::eInputMux::AIN_0);
ads1015.SetSampleSpeed(ads::eSampleSpeed::SPS_3300);
ads1015.SetGain(ads::eGainAmplifier::FSR_4_096);
ads1015.SetOneShot(false);
hub.SetAdc(&ads1015);
adsConverter = new cAdsConverter(ads1015);
cSensorSettings<ads::ads_sample_t> * adcSettings;
adcSettings = new cSensorSettings<ads::ads_sample_t>(ADC_TIMEBASE, ADC_PERIOD);
adcSettings->m_samplesProvider.Connect(&adsConverter->m_rawSamples);
hub.SetAdcSettings(adcSettings);
// Channel one and two are getting processed
// adc:uint16 -- buffer:sSizedArray[] -- signal:sSizedArray[] -- average:uint16 -- web
for (int i = 0; i < 2; i++) {
hub.m_adc_output[i].Connect(&bufferChannels[i].m_input);
bufferChannels[i].m_output.Connect(&signalProcess[i].m_incommingData);
signalProcess[i].m_processedData.Connect(&processedAveragers[i].m_input);
processedAveragers[i].m_output.Connect(&processedAveragersBuffer[i].m_input);
processedAveragersBuffer[i].m_output.Connect(&cWebInterface::GetInstance()->m_sensorValRaw);
}
for (int i = 0; i < 4; i++) {
hub.m_adc_output[i].Connect(&averagers[i].m_input);
averagers[i].m_output.Connect(&cWebInterface::GetInstance()->m_adcAverage[i]);
}
cWebInterface::GetInstance()->StartServer();
mylight.SetCurrent(5000);
mylight.RectangleUpdate();
}

138
software/app/dac101c085.cpp

@ -0,0 +1,138 @@
//----------------------------------------------------------------------------------------------------------------------------
// Project: Uppsense
// Name: dac101c085.cpp
// Author: Maximilian Stiefel
// Date: 08.08.2017
//
// Description: Small simple driver for the TI DAC101C085.
//
//----------------------------------------------------------------------------------------------------------------------------
//-------------------------------------Libraries------------------------------------------------------------------------------
#include "dac101c085.h"
#include <SmingCore/Wire.h>
#include <SmingCore/SmingCore.h>
//-------------------------------------Namespaces-----------------------------------------------------------------------------
namespace rijnfel {
namespace dac {
//-------------------------------------Constructor----------------------------------------------------------------------------
cDAC101C085::cDAC101C085(uint8_t i_number, uint8_t i_address):
m_dac_number(i_number), m_address(i_address)
{}
//-------------------------------------Destructor-----------------------------------------------------------------------------
cDAC101C085::~cDAC101C085()
{}
//-------------------------------------checkDev-------------------------------------------------------------------------------
uint8_t cDAC101C085::CheckDev()
{
// Vars
byte error = 0;
// Action
#if DEBUG_LEVEL == 1
Serial.print("DAC: Scanning address 0x");
Serial.print(m_address, HEX);
Serial.println(".");
#endif
Wire.beginTransmission(m_address);
error = Wire.endTransmission();
return I2CError(error); // Pass to error parser
}
//-------------------------------------changeSettings-------------------------------------------------------------------------
uint8_t cDAC101C085::ChangeSettings(enum eOpMode mode, uint16_t val)
{
// Vars
uint16_t settings = 0;
// Action
if( val > 1023)
return 0; // This is illegal
settings = val << D_BITS_POS; // First two bits have to be 0
switch(mode)
{
case NORMAL:
settings += (0b00 << PD_BITS_POS);
break;
case PULL_DOWN_2K5:
settings += (0b01 << PD_BITS_POS);
break;
case PULL_DOWN_100K:
settings += (0b10 << PD_BITS_POS);
break;
case HIGH_IMPEDANCE:
settings += (0b11 << PD_BITS_POS);
break;
}
return WriteSettings(settings);
}
//-------------------------------------WriteSettings--------------------------------------------------------------------------
uint8_t cDAC101C085::WriteSettings(uint16_t settings)
{
// Vars
uint8_t error = 0;
// Action
Wire.beginTransmission(m_address);
Wire.write( (uint8_t) (settings >> 8) ); // Most significant byte
Wire.write( (uint8_t) (settings & 0xFF) ); // Least significant byte
error = Wire.endTransmission();
Serial.println(settings);
return I2CError(error); // Pass to error parser
}
//-------------------------------------ReadSettings--------------------------------------------------------------------------
uint16_t cDAC101C085::ReadSettings(void)
{
// Vars
uint8_t number = 0;
uint16_t settings = 0;
// Action
number = Wire.requestFrom(m_address, (uint8_t) 2);
if( number != 2)
{
Serial.print("DAC: Trying to read 2 bytes from 0x");
Serial.print(m_address, HEX);
Serial.println(" went wrong.");
return 0;
}
settings = (uint16_t) Wire.read() << 8; // Most significant byte
settings += (uint16_t) Wire.read(); // Least significant byte
return settings;
}
//-------------------------------------I2CError-------------------------------------------------------------------------------
uint8_t cDAC101C085::I2CError(uint8_t error)
{
switch(error)
{
case 0:
#if DEBUG_LEVEL == 1
Serial.println("DAC: I2C device found. Transmission successful.");
#endif
break;
case 2:
Serial.print("DAC: Received NACK after address from 0x.");
Serial.print(m_address, HEX);
Serial.println(".");
break;
case 3:
Serial.print("DAC: Received NACK after data from 0x.");
Serial.print(m_address, HEX);
Serial.println(".");
break;
case 4:
Serial.print("DAC: Unknow error at 0x.");
Serial.print(m_address, HEX);
Serial.println(".");
break;
}
return ( (error == 0) ? 1 : 0 );
}
}
}

72
software/app/dac101c085.h

@ -0,0 +1,72 @@
//----------------------------------------------------------------------------------------------------------------------------
// Project: Uppsense
// Name: dac101c085.h
// Author: Maximilian Stiefel
// Date: 08.08.2017
//
// Description: Small simple driver for the TI DAC101C085.
//
//----------------------------------------------------------------------------------------------------------------------------
#ifndef APP_DAC101C085_H_
#define APP_DAC101C085_H_
//-------------------------------------Libraries------------------------------------------------------------------------------
#include <stdint.h>
#include <defines.h>
//-------------------------------------Defines--------------------------------------------------------------------------------
#define PD_BITS_POS 13 // Position of power down bits
#define D_BITS_POS 2 // Position of data bits
//-------------------------------------Namespaces-----------------------------------------------------------------------------
namespace rijnfel {
namespace dac {
//-------------------------------------Enums----------------------------------------------------------------------------------
/** Represents the operational mode of the DAC.
*/
enum eOpMode {NORMAL, PULL_DOWN_2K5, PULL_DOWN_100K, HIGH_IMPEDANCE};
//-------------------------------------cDAC101085-----------------------------------------------------------------------------
/** Small simple driver for the TI DAC101C085.
*/
class cDAC101C085
{
public:
/** @brief Instantiate DAC, assign a number and an address.
* @param i_dac_number Number of the DAC.
* @param i_address I2C address of this DAC.
*/
cDAC101C085(uint8_t i_dac_number, uint8_t i_address); // Constructor
/** @brief Free DAC, is currently doing nothing.
*/
~cDAC101C085(); // Destructor
/** @brief Check if the device is answering on the bus.
* @retval uint8_t Returns 1 on success, 0 when failing.
*/
uint8_t CheckDev(); // Check if device is available and alive
/** @brief Read out 16 bit register of the DAC.
* @retval uint16_t 16 bit read from the DAC.
*/
uint16_t ReadSettings(void);
/** @brief Write new setting to DAC register.
* @retval uint8_t Returns 1 on success, 0 when failing.
*/
uint8_t ChangeSettings(enum eOpMode mode, uint16_t val);
private:
uint8_t m_dac_number; // Which of the dacs is it?
uint8_t m_address;
uint8_t WriteSettings(uint16_t settings);
uint8_t I2CError(uint8_t error);
};
}
}
#endif /* APP_DAC101C085_H_ */

65
software/app/excitation_light.cpp

@ -0,0 +1,65 @@
//----------------------------------------------------------------------------------------------------------------------------
// Project: Uppsense
// Name: excitation_light.cpp
// Author: Maximilian Stiefel
// Date: 09.08.2017
//
// Description:
//
//----------------------------------------------------------------------------------------------------------------------------
//-------------------------------------Libraries------------------------------------------------------------------------------
#include "excitation_light.h"
#include <defines.h>
#include <SmingCore/SmingCore.h>
//-------------------------------------Namespaces-----------------------------------------------------------------------------
namespace rijnfel {
namespace light {
//-------------------------------------Constructor----------------------------------------------------------------------------
cExcitationLight::cExcitationLight():
m_rectangleStatus(0), m_DACRectHigh(0)
{
m_DAC = new dac::cDAC101C085(1, 0xE);
}
//-------------------------------------Destructor-----------------------------------------------------------------------------
cExcitationLight::~cExcitationLight()
{
delete m_DAC;
}
//-------------------------------------setCurrent-----------------------------------------------------------------------------
uint8_t cExcitationLight::SetCurrent(uint16_t microamp)
{
uint32_t new_DACRectHigh = 0;
if(microamp < CURR_MAX_UAMP)
{
new_DACRectHigh = ( (microamp*R_SENSE*RESOLUTION_DAC)/VREF_DAC ) / 1000;
#if DEBUG_LEVEL == 1
Serial.print("DAC value: ");
Serial.println(new_DACRectHigh);
#endif
m_DACRectHigh = new_DACRectHigh;
return 1;
}
else
return 0;
}
//-------------------------------------rectangleUpdate------------------------------------------------------------------------
uint8_t cExcitationLight::RectangleUpdate()
{
m_rectangleStatus ? m_DAC->ChangeSettings(dac::eOpMode::NORMAL, 0) : m_DAC->ChangeSettings(dac::eOpMode::NORMAL, m_DACRectHigh);
m_rectangleStatus ^= 0xFF;
}
//-------------------------------------DeactivateLED--------------------------------------------------------------------------
uint8_t cExcitationLight::DeactivateLED()
{
return m_DAC->ChangeSettings(dac::eOpMode::PULL_DOWN_2K5, 0);
}
}
}

64
software/app/excitation_light.h

@ -0,0 +1,64 @@
//----------------------------------------------------------------------------------------------------------------------------
// Project: Uppsense
// Name: excitation_light.h
// Author: Maximilian Stiefel
// Date: 09.08.2017
//
// Description: Class to use the excitation light in an advanced way with the help of a DAC.
//
//----------------------------------------------------------------------------------------------------------------------------
#ifndef APP_EXCITATION_LIGHT_H_
#define APP_EXCITATION_LIGHT_H_
//-------------------------------------Libraries------------------------------------------------------------------------------
#include <stdint.h>
#include "dac101c085.h"
#include "hardware.h"
//-------------------------------------Defines--------------------------------------------------------------------------------
//-------------------------------------Namespaces-----------------------------------------------------------------------------
namespace rijnfel {
namespace light {
//-------------------------------------Enums----------------------------------------------------------------------------------
//-------------------------------------cExcitationLight-----------------------------------------------------------------------
/** Class to use the excitation light in an advanced way with the help of a DAC.
*/
class cExcitationLight
{
public:
/** Construct object, allocate space for DAC.
*/
cExcitationLight(); // Constructor
/** Destruct object, free space for DAC.
*/
~cExcitationLight(); // Destructor
/** Set the desired current through excitation light.
* @param microamp Current in uA.
* @retval uint8_t Returns 1 on success, 0 when failing.
*/
uint8_t SetCurrent(uint16_t microamp);
/** Function to be hooked up to a timer to generate rectangular signal.
* @retval uint8_t Returns 1 on success, 0 when failing.
*/
uint8_t RectangleUpdate();
/** Use 2K5 pull-down resistor to turn LED completely off.
* @retval uint8_t Returns 1 on success, 0 when failing.
*/
uint8_t DeactivateLED();
private:
dac::cDAC101C085 *m_DAC;
uint8_t m_rectangleStatus;
uint16_t m_DACRectHigh;
};
}
}
#endif /* APP_EXCITATION_LIGHT_H_ */

21
software/app/port_utilities.cpp

@ -0,0 +1,21 @@
/*
* port_utilities.cpp
*
* Created on: Aug 29, 2017
* Author: Elmar
*/
#include "port_utilities.h"
namespace rijnfel {
cPortUtilities::cPortUtilities() {
// TODO Auto-generated constructor stub
}
cPortUtilities::~cPortUtilities() {
// TODO Auto-generated destructor stub
}
} /* namespace rijnfel */

23
software/app/port_utilities.h

@ -0,0 +1,23 @@
/*
* port_utilities.h
*
* Created on: Aug 29, 2017
* Author: Elmar
*/
#ifndef APP_PORT_UTILITIES_H_
#define APP_PORT_UTILITIES_H_
#include <rijnfel_core/rijnfel_core.h>
namespace rijnfel {
class cPortUtilities {
public:
cPortUtilities();
virtual ~cPortUtilities();
};
} /* namespace rijnfel */
#endif /* APP_PORT_UTILITIES_H_ */

71
software/app/sensor_hub.cpp

@ -0,0 +1,71 @@
/*
* sensor_hub.cpp
*
* Created on: Aug 1, 2017
* Author: Elmar
*/
#include "sensor_hub.h"
#include <stdint.h>
namespace rijnfel {
cSensorHub::cSensorHub(uint32_t i_updatePeriod) :
m_updatePeriod(i_updatePeriod) {
m_adc = new ads::cADS101x();
m_adcSettings = NULL;
m_tempSettings = NULL;
m_running = false;
}
void cSensorHub::Update() {
if (!m_running)
return;
if (m_adcSettings) {
if (m_adcSettings->ShouldSample(m_updatePeriod)) {
ads::ads_sample_t sample = m_adc->RawSample();
ads::ads_voltage_t voltage = m_adc->ConvertSample(sample);
m_adc_output[sample.mux - ads::eInputMux::AIN_0].Push(&voltage);
}
}
}
void cSensorHub::SetAdc(ads::cADS101x* i_adc) {
if (m_adc != NULL) {
delete m_adc;
}
m_adc = i_adc;
}
void cSensorHub::SetAdcSettings(cSensorSettings<ads::ads_sample_t> * i_adcSettings) {
m_adcSettings = i_adcSettings;
}
void cSensorHub::SetTempSettings(cSensorSettings<uint32_t> * i_tempSettings) {
m_tempSettings = i_tempSettings;
}
void cSensorHub::Stop() {
if (m_running) {
m_running = false;
//if (m_adcSettings) {
// m_adcSettings->m_samplesProvider.Push(static_cast<void*>(&m_adcSettings->m_buffer));
m_adcSettings->Reset();
//}
}
}
void cSensorHub::Start() {
m_running = true;
}
cSensorHub::~cSensorHub() {
if (m_adcSettings)
delete m_adcSettings;
if (m_tempSettings)
delete m_tempSettings;
delete m_adc;
}
} /* namespace rijnfel */

39
software/app/sensor_hub.h

@ -0,0 +1,39 @@
/*
* sensor_hub.h
*
* Created on: Aug 1, 2017
* Author: Elmar
*/
#ifndef APP_SENSOR_HUB_H_
#define APP_SENSOR_HUB_H_
#include <rijnfel_core/rijnfel_core.h>
#include "ads101x.h"
namespace rijnfel {
class cSensorHub {
public:
//in milliseconds
cSensorHub(uint32_t i_updatePeriod);
void SetAdc(ads::cADS101x * i_adc);
void SetAdcSettings(cSensorSettings<ads::ads_sample_t> * i_adcSettings);
void Stop();
void Start();
void SetTempSettings(cSensorSettings<uint32_t> * i_tempSettings);
void Update();
virtual ~cSensorHub();
cDataProvider m_adc_output[4];
private:
uint32_t m_updatePeriod;
cSensorSettings<ads::ads_sample_t> * m_adcSettings;
cSensorSettings<uint32_t> * m_tempSettings;
ads::cADS101x * m_adc;
bool m_running;
};
} /* namespace rijnfel */
#endif /* APP_SENSOR_HUB_H_ */

49
software/app/signal_process.cpp

@ -0,0 +1,49 @@
/*
* signal_process.cpp
*
* Created on: Aug 22, 2017
* Author: Elmar
*/
#include "signal_process.h"
#include <stddef.h>
#include <SmingCore/SmingCore.h>
#include <rijnfel_core/rijnfel_core.h>
//TODO remove this
namespace rijnfel {
cSignalProcess::cSignalProcess() :
m_incommingData(this) {
m_currentIndex = 0;
m_currentMaxIndex = 0;
m_currentBuffer = NULL;
// TODO Auto-generated constructor stub
}
cSignalProcess::~cSignalProcess() {
// TODO Auto-generated destructor stub
}
void cSignalProcess::ReceiveCallback(void* i_data, cDataReceiver* i_provider) {
sSizedArray * arr = static_cast<sSizedArray*>(i_data);
process(arr->u_array, arr->size);
Serial.printf("Size: %d\n", arr->size);
m_processedData.Push(i_data);
}
void cSignalProcess::process(uint32_t* io_array, size_t size) {
}
void cSignalProcess::print(double* vData) {
for (int i = 0; i < SAMPLES; i++) {
if (i == SAMPLES - 1)
Serial.printf("%f\n", vData[i]);
else
Serial.printf("%f, ", vData[i]);
}
}
} /* namespace rijnfel */

30
software/app/signal_process.h

@ -0,0 +1,30 @@
/*
* signal_process.h
*
* Created on: Aug 22, 2017
* Author: Elmar
*/
#ifndef APP_SIGNAL_PROCESS_H_
#define APP_SIGNAL_PROCESS_H_
#include <rijnfel_core/rijnfel_core.h>
#include <signal_processing.h>
namespace rijnfel {
class cSignalProcess: public cDataSink {
public:
cSignalProcess();
virtual ~cSignalProcess();
void ReceiveCallback(void * i_data, cDataReceiver * i_provider);
cDataReceiver m_incommingData;
cDataProvider m_processedData;
protected:
void process(uint32_t * io_array, size_t size);
uint32_t * m_currentBuffer;
uint32_t m_currentIndex;
uint32_t m_currentMaxIndex;
void print(double* vData);
};
} /* namespace rijnfel */
#endif /* APP_SIGNAL_PROCESS_H_ */

28
software/app/temperature.h

@ -0,0 +1,28 @@
/*
* temperature.h
*
* Created on: Aug 1, 2017
* Author: Elmar
*/
#ifndef APP_TEMPERATURE_H_
#define APP_TEMPERATURE_H_
#include <rijnfel_core/rijnfel_core.h>
namespace rijnfel {
template<typename Sample, typename Temperature>
class cTemperatureSensor: cSensor<Sample> {
public:
cTemperatureSensor() {
}
virtual Temperature ConvertSample(Sample sample) = 0;
virtual ~cTemperatureSensor() {
}
};
}
#endif /* APP_TEMPERATURE_H_ */

24
software/app/test.cpp

@ -0,0 +1,24 @@
/*
* test.cpp
*
* Created on: Aug 23, 2017
* Author: Elmar
*/
#include <SmingCore/HardwareSerial.h>
#include "tests.h"
void SettingsTest(rijnfel::ads::cADS101x * ads1015) {
for (int channel = 0; channel < 4; channel++) {
ads1015->SetMux(static_cast<rijnfel::ads::eInputMux>(rijnfel::ads::eInputMux::AIN_0 + channel));
Serial.printf("Settings: %d\n\r", ads1015->GetSettings());
}
}
void AdcTest(rijnfel::ads::cADS101x * ads1015) {
for (int channel = 0; channel < 4; channel++) {
ads1015->SetMux(static_cast<rijnfel::ads::eInputMux>(rijnfel::ads::eInputMux::AIN_0 + channel));
rijnfel::ads::ads_sample_t sample = ads1015->RawSample();
Serial.printf("converted: %d channel: %d\n\r", ads1015->ConvertSample(sample), sample.mux);
}
}

17
software/app/tests.h

@ -0,0 +1,17 @@
/*
* tests.h
*
* Created on: Aug 23, 2017
* Author: Elmar
*/
#ifndef APP_TESTS_H_
#define APP_TESTS_H_
#include "ads101x.h"
#include "dac101c085.h"
void SettingsTest(rijnfel::ads::cADS101x ads1015);
void AdcTest(rijnfel::ads::cADS101x * ads1015);
#endif /* APP_TESTS_H_ */

243
software/app/web_interface.cpp

@ -0,0 +1,243 @@
/*
* web_interface.cpp
*
* Created on: Aug 6, 2017
* Author: Elmar
*/
#include "web_interface.h"
#include <application.h>
#include <SmingCore/SmingCore.h>
#include <SmingCore/Network/WebConstants.h>
#include <SmingCore/FileSystem.h>
#include <third-party/http-parser/http_parser.h>
#include <SmingCore/Network/Http/Websocket/WebsocketResource.h>
namespace rijnfel {
cWebInterface *cWebInterface::s_instance = 0;
static void onIndex(HttpRequest & i_request, HttpResponse & i_response) {
cWebInterface::GetInstance()->OnIndex(i_request, i_response);
}
static void onRefresh(HttpRequest & i_request, HttpResponse & i_response) {
cWebInterface::GetInstance()->OnRefresh(i_request, i_response);
}
static void onConfiguration(HttpRequest &request, HttpResponse &response) {
cWebInterface::GetInstance()->OnConfiguration(request, response);
}
static void onConfiguration_json(HttpRequest &request, HttpResponse &response) {
cWebInterface::GetInstance()->OnConfiguration_json(request, response);
}
void wsConnected(WebSocketConnection& socket) {
cWebInterface::GetInstance()->m_connectedUser = &socket;
Serial.printf("Connection!");
}
void wsMessageReceived(WebSocketConnection& socket, const String& message) {
if (message.equals("start")) {
StartSensorStation(1);
cWebInterface::GetInstance()->m_sendWebsocket = true;
} else {
StopSensorStation();
cWebInterface::GetInstance()->m_sendWebsocket = false;
}
if (message.equals("ch1")) {
ChangeSampleChannel(1);
} else if (message.equals("ch2")) {
ChangeSampleChannel(2);
} else if (message.equals("ch3")) {
ChangeSampleChannel(3);
} else if (message.equals("ch4")) {
ChangeSampleChannel(4);
}
}
void wsDisconnected(WebSocketConnection& socket) {
cWebInterface::GetInstance()->m_connectedUser = NULL;
}
cWebInterface::cWebInterface() :
m_serverStarted(false), m_adcAverage { { this }, { this }, { this }, { this } }, m_sensorValRaw(this), m_connectedUser(
NULL), m_sendWebsocket(false) {
for (int i = 0; i < 4; i++) {
m_adcAverageVal[i] = 0;
}
}
void onFile(HttpRequest & i_request, HttpResponse & i_response) {
String file = i_request.getPath();
if (file[0] == '/')
file = file.substring(1);
if (file[0] == '.')
i_response.forbidden();
else {
i_response.setCache(86400, true); // It's important to use cache for better performance.
i_response.sendFile(file);
}
}
static void onChannel(HttpRequest & i_request, HttpResponse & i_response) {
//cWebInterface::GetInstance()->OnFile(i_request, i_response);
}
void cWebInterface::StartServer() {
if (m_serverStarted)
return;
WebsocketResource* wsResource = new WebsocketResource();
wsResource->setConnectionHandler(wsConnected);
wsResource->setMessageHandler(wsMessageReceived);
wsResource->setDisconnectionHandler(wsDisconnected);
m_server.addPath("/", onIndex);
m_server.addPath("/channel", onChannel);
m_server.addPath("/state", onRefresh);
m_server.addPath("/config", onConfiguration);
m_server.addPath("/config.json", onConfiguration_json);
m_server.addPath("/ws", wsResource);
m_server.setDefaultHandler(onFile);
m_server.listen(80);
}
void cWebInterface::StopServer() {
if (!m_serverStarted)
return;
m_serverStarted = false;
}
void cWebInterface::OnIndex(HttpRequest &i_request, HttpResponse & i_response) {
i_response.setCache(86400, true); // It's important to use cache for better performance.
i_response.sendFile("index.html");
}
void cWebInterface::OnRefresh(HttpRequest & i_request, HttpResponse & i_response) {
JsonObjectStream* stream = new JsonObjectStream();
JsonObject& json = stream->getRoot();
json["adc_1"] = m_adcAverageVal[0];
json["adc_2"] = m_adcAverageVal[1];
#ifdef REV_1
json["adc_3"] = m_adcAverageVal[3];
json["adc_4"] = m_adcAverageVal[2];
#else
json["adc_3"] = m_adcAverageVal[2];
json["adc_4"] = m_adcAverageVal[3];
#endif
i_response.sendJsonObject(stream);
}
void cWebInterface::OnRawUpdate(HttpRequest& i_request, HttpResponse& i_response) {
}
void cWebInterface::ReceiveCallback(void* i_data, cDataReceiver* i_receiver) {
if (i_receiver == &m_sensorValRaw) {
if (m_connectedUser != NULL && m_sendWebsocket) {
sSizedArray * arr = static_cast<sSizedArray *>(i_data);
Serial.printf("Web Size: %d\n", arr->size);
char buf[12];
for (size_t i = 0; i < arr->size; i++) {
sprintf(buf, "%d,", arr->u_array[i]);
const String sendString(buf);
m_connectedUser->sendString(sendString);
if (i % 10 == 0)
WDT.alive();
}
}
} else {
for (int i = 0; i < 4; i++) {
if (i_receiver == &m_adcAverage[i]) {
m_adcAverageVal[i] = *static_cast<int32_t *>(i_data);
PrintValues();
break;
}
}
}
}
void cWebInterface::PrintValues() {
Serial.printf("c[0]: %d c[1]: %d c[2]: %d c[3]: %d\n\r", m_adcAverageVal[0], m_adcAverageVal[1], m_adcAverageVal[2],
m_adcAverageVal[3]);
}
cWebInterface::~cWebInterface() {
// TODO Auto-generated destructor stub
}
void cWebInterface::ResetRawValues() {
/*
for (int channel = 0; channel < 4; channel++) {
for (int sample = 0; sample < 1000; sample++) {
m_adc_values_raw[channel][sample] = 0;
}
}
*/
}
void cWebInterface::OnConfiguration(HttpRequest &request, HttpResponse &response) {
if (request.method == http_method::HTTP_POST) {
//debugf("Update config");
// Update config
if (request.getBody() == NULL) {
Serial.println(request.getPostParameter("StaSSID"));
//debugf("NULL bodyBuf");
return;
} else {
StaticJsonBuffer<200> jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(request.getBody());
//root.prettyPrintTo(Serial); //Uncomment it for debuging
/* if (root["StaSSID"].success()) // Settings
{
uint8_t PrevStaEnable = ActiveConfig.StaEnable;
ActiveConfig.StaSSID = String((const char *)root["StaSSID"]);
ActiveConfig.StaPassword = String((const char *)root["StaPassword"]);
ActiveConfig.StaEnable = root["StaEnable"];
if (PrevStaEnable && ActiveConfig.StaEnable)
{
WifiStation.enable(true);
WifiAccessPoint.enable(false);
WifiStation.config(ActiveConfig.StaSSID, ActiveConfig.StaPassword);
}
else if (ActiveConfig.StaEnable)
{
WifiStation.enable(true, true);
WifiAccessPoint.enable(false, true);
WifiStation.config(ActiveConfig.StaSSID, ActiveConfig.StaPassword);
}
else
{
WifiStation.enable(false, true);
WifiAccessPoint.enable(true, true);
WifiAccessPoint.config("TyTherm", "ENTERYOURPASSWD", AUTH_WPA2_PSK);
}
}*/
}
//saveConfig(ActiveConfig);
} else {
response.setCache(86400, true); // It's important to use cache for better performance.
response.sendFile("config.html");
}
}
void cWebInterface::OnConfiguration_json(HttpRequest &request, HttpResponse &response) {
JsonObjectStream* stream = new JsonObjectStream();
JsonObject& json = stream->getRoot();
json["StaSSID"] = 22;
json["StaPassword"] = 23;
json["StaEnable"] = 24;
response.sendJsonObject(stream);
}
} /* namespace rijnfel */

124
software/app/web_interface.h

@ -0,0 +1,124 @@
/*
* web_interface.h
*
* Created on: Aug 6, 2017
* Author: Elmar
*/
#ifndef APP_WEB_INTERFACE_H_
#define APP_WEB_INTERFACE_H_
//TODO remove this
#include "ads101x.h"
#include <SmingCore/SmingCore.h>
#include <rijnfel_core/rijnfel_core.h>
namespace rijnfel {
class cWebInterface: public cDataSink {
public:
/**
* Returns the global cWebInterface instance.
* Only one webserver should ever be running
* @return global cWebInterface instance
*/
static cWebInterface *GetInstance() {
if (cWebInterface::s_instance == NULL)
cWebInterface::s_instance = new cWebInterface();
return cWebInterface::s_instance;
}
/// Singleton instance
static cWebInterface *s_instance;
public:
/**
* Should not be used because it's a singleton
* @param delete
*/
cWebInterface(cWebInterface const&) = delete;
/**
* Should not be used because it's a singleton
* @param delete
* @return delete
*/
cWebInterface& operator=(cWebInterface const&) = delete;
/**
* Registers the paths and starts the server
*/
void StartServer();
/**
* Stops the server
*/
void StopServer();
/**
* This is a debug function that prints out the average values
* @todo remove this
*/
void PrintValues();
/**
* Destructor
*/
virtual ~cWebInterface();
// This is what the future will look like
// cDataReceiver m_sensorVal[2];
// cDataReceiver m_battery;
// cDataReceiver m_ledLife;
// cDataReceiver m_temp;
// But for now...
cDataReceiver m_sensorValRaw;
cDataReceiver m_adcAverage[4];
virtual void ReceiveCallback(void * i_data, cDataReceiver * i_receiver);
public:
/**
*
* @param i_request
* @param i_response Response to the client, index.html
*/
void OnIndex(HttpRequest & i_request, HttpResponse & i_response);
/**
* Function gets called from the mobile to refresh the average values
* @param i_request Request from the client
* @param i_response Response to the client, contains JSON with averages
*/
void OnRefresh(HttpRequest & i_request, HttpResponse & i_response);
/**
*
* @param i_request
* @param i_response
*/
void OnRawUpdate(HttpRequest& i_request, HttpResponse& i_response);
void OnConfiguration_json(HttpRequest &request, HttpResponse &response);
void OnConfiguration(HttpRequest &request, HttpResponse &response);
//TODO migrate this
WebSocketConnection * m_connectedUser;
bool m_sendWebsocket;
protected:
/**
* Initializes the variables
*/
cWebInterface();
private:
void ResetRawValues();
/// Whether the server has started or not
bool m_serverStarted;
/// Holds the average for all the channels
int32_t m_adcAverageVal[4];
/// Server instance
HttpServer m_server;
};
} /* namespace rijnfel */
#endif /* APP_WEB_INTERFACE_H_ */

BIN
software/files/bootstrap.min.css.gz

Binary file not shown.

69
software/files/config.html

@ -0,0 +1,69 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>TyTherm configuration</title>
<!-- Bootstrap core -->
<link href="bootstrap.min.css" rel="stylesheet">
<script src="jquery-2.1.4.min.js"></script>
<style>
.main { font-size: 63px; }
</style>
</head>
<script src="config.js"></script>
<body>
<div class="container">
<div class="header">
<nav>
<ul class="nav nav-pills pull-right">
<li role="presentation"><a href="/">Status</a></li>
<li role="presentation" class="active"><a href="/config">Configuration</a></li>
</ul>
</nav>
<h3 class="text-muted">TyTherm</h3>
</div>
<div class="row">
<h2>&nbsp;</h2>
<div class="col-xs-offset-2 col-xs-8">
<!-- Network config -->
<div>
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Network</h3>
</div>
<div class="panel-body">
<form id="form_netcfg" method="POST">
<div class="form-group">
<label for="StaSSID">Name</label>
<input type="text" id="StaSSID" name="StaSSID" class="form-control" placeholder="Enter SSID" value="{StaSSID}">
</div>
<div class="form-group">
<label for="Password">Password</label>
<input type="password" id="StaPassword" name="StaPassword" class="form-control" placeholder="Password">
</div>
<div class="form-group">
<label for="StaEnable">Enable WIFI Client</label>
<input type="checkbox" id="StaEnable" name="StaEnable" class="form-control">
</div>
<button type="submit" class="btn btn-success">Save network</button>
<button type="button" id="netcfg_cancel" class="btn btn-link">Cancel</button>
</form>
</div>
</div>
</div>
<!-- TyTherm adjustment config -->
</div> <!-- /col -->
</div> <!-- /row -->
</div> <!-- /container -->
</body>
</html>

38
software/files/config.js

@ -0,0 +1,38 @@
function get_config() {
$.getJSON('/config.json',
function(data) {
$.each(data, function(key, value){
document.getElementById(key).value = value;
if (data.StaEnable == 1) {
document.getElementById('StaEnable').checked = true;
}
else
document.getElementById('StaEnable').checked = false;
});
});
}
function post_netcfg(event) {
event.preventDefault();
var formData = {
'StaSSID' : document.getElementById('StaSSID').value,
'StaPassword' : document.getElementById('StaPassword').value,
'StaEnable' : (document.getElementById('StaEnable').checked ? 1 : 0)
};
$.ajax({
type : 'POST',
url : '/config',
contentType : 'application/json; charset=utf-8',
data : JSON.stringify(formData),
dataType : 'json'
})
}
$( document ).ready(function() {
get_config();
document.getElementById('form_netcfg').addEventListener('submit', post_netcfg);
document.getElementById('netcfg_cancel').addEventListener('click', get_config);
});

114
software/files/index.html

@ -0,0 +1,114 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>TyTherm Status</title>
<!-- Bootstrap core -->
<link href="bootstrap.min.css" rel="stylesheet">
<script src="jquery-2.1.4.min.js"></script>
<style>
.main { font-size: 63px; }
</style>
</head>
<script src="index.js"></script>
<body>
<div class="container">
<div class="header">
<nav>
<ul class="nav nav-pills pull-right">
<li role="presentation" class="active"><a href="/">Status</a></li>
<li role="presentation"><a href="/config">Configuration</a></li>
</ul>
</nav>
<h3 class="text-muted">TyTherm</h3>
</div>
<div class="row">
<h2>&nbsp;</h2>
<div class="col-xs-offset-2">
<div class="col-xs-10">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Raw samples</h3>
</div>
<div class="panel-body">
<textarea id="raw_samples" rows="4" cols="50" style="width:100%;">
</textarea>
<button onclick="buttonStartCallback()">Start</button>
<button onclick="buttonStopCallback()">Stop</button>
<button onclick="cleanCallback()">Clean</button>
<button onclick="ch1()">ch1</button>
<button onclick="ch2()">ch2</button>
<button onclick="ch3()">ch3</button>
<button onclick="ch4()">ch4</button>
<div id="channel_id">Channel 1</div>
</div>
</div>
</div>
</div> <!-- /col -->
</div> <!-- /row -->
<div class="row">
<div class="col-xs-offset-2">
<div class="col-xs-10 col-md-5">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">ADC 1</h3>
</div>
<div class="panel-body">
<h1 id="adc_1" class="text-center main">{adc_1}</h1>
</div>
</div>
</div>
</div> <!-- /col -->
<div class="col-xs-offset-2">
<div class="col-xs-10 col-md-5">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">ADC 2</h3>
</div>
<div class="panel-body">
<h1 id="adc_2" class="text-center main">{adc_2}</h1>
</div>
</div>
</div>
</div> <!-- /col -->
</div> <!-- /row -->
<div class="row">
<div class="col-xs-offset-2">
<div class="col-xs-10 col-md-5">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">ADC 3</h3>
</div>
<div class="panel-body">
<h1 id="adc_3" class="text-center main">{adc_3}</h1>
</div>
</div>
</div>
</div> <!-- /col -->
<div class="col-xs-offset-2">
<div class="col-xs-10 col-md-5">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">ADC 4</h3>
</div>
<div class="panel-body">
<h1 id="adc_4" class="text-center main">{adc_4}</h1>
</div>
</div>
</div>
</div> <!-- /col -->
</div> <!-- /row -->
</div> <!-- /container -->
</body>
</html>

114
software/files/index.js

@ -0,0 +1,114 @@
$( document ).ready(function() {
(function worker() {
$.getJSON('/state', function(data) {
document.getElementById('adc_1').textContent = data.adc_1;
document.getElementById('adc_2').textContent = data.adc_2;
document.getElementById('adc_3').textContent = data.adc_3;
document.getElementById('adc_4').textContent = data.adc_4;
//var text = document.getElementById('raw_adc');
//text.value += data.raw_adc;
setTimeout(worker, 500);
});
})();
var wsUri = "ws://" + location.host + "/ws";
websocket = new WebSocket(wsUri);
websocket.onopen = function(evt) { onOpen(evt) };
websocket.onclose = function(evt) { onClose(evt) };
websocket.onmessage = function(evt) { onMessage(evt) };
websocket.onerror = function(evt) { onError(evt) };
});
function buttonStartCallback(){
websocket.send("start");
var myTextArea = $('#raw_samples');
myTextArea.val("");
}
function cleanCallback() {
var myTextArea = $('#raw_samples');
myTextArea.val("");
}
function ch1() {
document.getElementById("channel_id").innerHTML = "Channel 1"
var myTextArea = $('#raw_samples');
myTextArea.val("Stopped");
websocket.send("ch1");
}
function ch2() {
document.getElementById("channel_id").innerHTML = "Channel 2"
var myTextArea = $('#raw_samples');
myTextArea.val("Stopped");
websocket.send("ch2");
}
function ch3() {
document.getElementById("channel_id").innerHTML = "Channel 3"
var myTextArea = $('#raw_samples');
myTextArea.val("Stopped");
websocket.send("ch3");
}
function ch4() {
document.getElementById("channel_id").innerHTML = "Channel 4"
var myTextArea = $('#raw_samples');
myTextArea.val("Stopped");
websocket.send("ch4");
}
function buttonStopCallback(){
websocket.send("stop");
saveTextAsFile();
}
// https://stackoverflow.com/questions/21479107/saving-html5-textarea-contents-to-file
function saveTextAsFile() {
var textToWrite = document.getElementById('raw_samples').value;
var textFileAsBlob = new Blob([ textToWrite ], { type: 'text/plain' });
var fileNameToSaveAs = "samples.csv";
var downloadLink = document.createElement("a");
downloadLink.download = fileNameToSaveAs;
downloadLink.innerHTML = "Download File";
if (window.webkitURL != null) {
// Chrome allows the link to be clicked without actually adding it to the DOM.
downloadLink.href = window.webkitURL.createObjectURL(textFileAsBlob);
} else {
// Firefox requires the link to be added to the DOM before it can be clicked.
downloadLink.href = window.URL.createObjectURL(textFileAsBlob);
downloadLink.onclick = destroyClickedElement;
downloadLink.style.display = "none";
document.body.appendChild(downloadLink);
}
downloadLink.click();
}
function destroyClickedElement(event) {
// remove the link from the DOM
document.body.removeChild(event.target);
}
function onOpen(evt) {
console.log("CONNECTED");
}
function onClose(evt) {
console.log("close");
}
function onMessage(evt) {
var myTextArea = $('#raw_samples');
myTextArea.val(myTextArea.val() + evt.data);
}
function onError(evt){
console.log("error: " + evt.data);
}

BIN
software/files/jquery-2.1.4.min.js.gz

Binary file not shown.

16
software/include/application.h

@ -0,0 +1,16 @@
/*
* application.h
*
* Created on: Aug 23, 2017
* Author: Elmar
*/
#ifndef INCLUDE_APPLICATION_H_
#define INCLUDE_APPLICATION_H_
//Disgusting
void StartSensorStation(int seconds);
void StopSensorStation(void);
void ChangeSampleChannel(int channel);
#endif /* INCLUDE_APPLICATION_H_ */

18
software/include/defines.h

@ -0,0 +1,18 @@
//----------------------------------------------------------------------------------------------------------------------------
// Project: Uppsense
// Name: hardware.h
// Author: Maximilian Stiefel
// Date: 09.08.2017
//
// Description:
//
//----------------------------------------------------------------------------------------------------------------------------
#ifndef APP_DEFINES_H_
#define APP_DEFINES_H_
#include "hardware.h"
#define DEBUG_LEVEL 1
#endif /* APP_HARDWARE_H_ */

49
software/include/hardware.h

@ -0,0 +1,49 @@
//----------------------------------------------------------------------------------------------------------------------------
// Project: Uppsense
// Name: hardware.h
// Author: Maximilian Stiefel
// Date: 09.08.2017
//
// Description:
//
//----------------------------------------------------------------------------------------------------------------------------
#ifndef APP_HARDWARE_H_
#define APP_HARDWARE_H_
#include <signal_processing.h>
#define REV_2
#define SMING_RELEASE
#ifdef DEBUG_VERBOSE_LEVEL
#undef DEBUG_VERBOSE_LEVEL
#endif
#define DEBUG_VERBOSE_LEVEL WARN
//-------------------------------------I2C ADRESSES---------------------------------------------------------------------------
#ifdef REV_1
static const uint8_t ADC_ADDRESS = 0x49;
static const uint8_t DAC1_ADDRESS = 0xE;
#define DUMMY_ADC
#endif
#ifdef REV_2
static const uint8_t ADC_ADDRESS = 0x49;
static const uint8_t DAC2_ADDRESS = 0x78;
static const uint8_t DAC1_ADDRESS = 0x09;
static const uint8_t TEMP_ADDRESS = 0x12;
#endif
static const uint16_t R_SENSE = 100; // 100 Ohm sensing resistor
static const uint16_t CURR_MAX_UAMP = 10000; // 10 mA max.
static const uint16_t VREF_DAC = 3300; // in mV
static const uint16_t RESOLUTION_DAC = 1024;
static const int HUB_PERIOD = 500;
static const int ADC_PERIOD = 500; // f_samp = 2 kHz
static const int ADC_TIMEBASE = ADC_PERIOD * SAMPLES * 4;
#define LED_PIN 2 // GPIO2
#endif /* APP_HARDWARE_H_ */

44
software/include/rijnfel_core/adc.h

@ -0,0 +1,44 @@
/*
* adc.h
*
* Created on: Jul 20, 2017
* Author: Elmar
*/
#ifndef APP_ADC_H_
#define APP_ADC_H_
#include "../rijnfel_core/sensor.h"
namespace rijnfel {
/**
* Abstract interface for Analog to Digital converters.
* Template holds sample type and voltage type
*/
template<typename Sample, typename Voltage>
class cADC: public cSensor<Sample> {
public:
/**
* Default constructor
*/
cADC() {
}
/**
* This virtual function should be implemented to convert a sample to a voltage
* @param i_sample the raw sample that should be converted
* @return a voltage in mili-volt
*/
virtual Voltage ConvertSample(Sample & i_sample) = 0;
/**
* Default destructor
*/
virtual ~cADC() {
}
};
}
#endif /* APP_ADC_H_ */

44
software/include/rijnfel_core/data_provider.h

@ -0,0 +1,44 @@
/*
* data_provider.h
*
* Created on: Aug 22, 2017
* Author: Elmar
*/
#ifndef APP_DATA_PROVIDER_H_
#define APP_DATA_PROVIDER_H_
#include <vector>
#include <stddef.h>
#include "data_receiver.h"
namespace rijnfel {
class cDataProvider {
public:
void Connect(cDataReceiver * i_receiver) {
m_receivers.push_back(i_receiver);
}
void Push(void * i_data) {
typedef std::vector<cDataReceiver*>::iterator Iterator;
for (Iterator it = m_receivers.begin(), it_e = m_receivers.end(); it != it_e; ++it) {
(*it)->Receive(i_data);
}
}
~cDataProvider() {
//
//typedef std::vector<cDataReceiver>::iterator Iterator;
//for (Iterator it = receivers.begin(), it_e = receivers.end(); it != it_e; ++it) {
// if ((*it) != NULL) {
// delete (*it);
// }
//}
}
private:
std::vector<cDataReceiver*> m_receivers;
};
}
#endif /* APP_DATA_PROVIDER_H_ */

29
software/include/rijnfel_core/data_receiver.h

@ -0,0 +1,29 @@
/*
* data_receiver.h
*
* Created on: Aug 22, 2017
* Author: Elmar
*/
#ifndef APP_DATA_RECEIVER_H_
#define APP_DATA_RECEIVER_H_
#include "data_sink.h"
namespace rijnfel {
class cDataReceiver {
public:
cDataReceiver(cDataSink * i_sink) {
m_sink = i_sink;
}
void Receive(void * i_data) {
m_sink->ReceiveCallback(i_data, this);
}
private:
cDataSink * m_sink;
};
}
#endif /* APP_DATA_RECEIVER_H_ */

25
software/include/rijnfel_core/data_sink.h

@ -0,0 +1,25 @@
/*
* data_sink.h
*
* Created on: Aug 22, 2017
* Author: Elmar
*/
#ifndef APP_DATA_SINK_H_
#define APP_DATA_SINK_H_
namespace rijnfel {
class cDataReceiver;
class cDataSink {
public:
cDataSink() {
}
virtual ~cDataSink() {
}
virtual void ReceiveCallback(void * i_data, cDataReceiver * i_receiver) = 0;
};
}
#endif /* APP_DATA_SINK_H_ */

76
software/include/rijnfel_core/double_buffer.h

@ -0,0 +1,76 @@
/*
* double_buffer.h
*
* Created on: Aug 1, 2017
* Author: Elmar
*/
#ifndef APP_DOUBLE_BUFFER_H_
#define APP_DOUBLE_BUFFER_H_
#include <stdint.h>
namespace rijnfel {
template<typename BufferType>
class cDoubleBuffer {
public:
cDoubleBuffer(int i_size) :
m_size(i_size) {
m_writeIndex = 0;
m_bufferIndex = 0;
m_buf = new BufferType*[2];
m_buf[0] = new BufferType[m_size];
m_buf[1] = new BufferType[m_size];
}
void Resize(int i_newSize) {
m_size = i_newSize;
delete m_buf[0];
delete m_buf[1];
m_buf[0] = new BufferType[m_size];
m_buf[1] = new BufferType[m_size];
}
void Reset() {
m_bufferIndex = !m_bufferIndex;
m_writeIndex = 0;
}
bool AddValue(BufferType i_val) {
m_buf[m_bufferIndex][m_writeIndex] = i_val;
m_writeIndex++;
if (m_writeIndex >= m_size) {
Reset();
return true;
}
return false;
}
BufferType * GetReadyBuffer() {
return m_buf[(m_bufferIndex == 0) ? 1 : 0];
}
BufferType * GetBuffer(int i_index) {
return m_buf[i_index];
}
int GetSize() {
return m_size;
}
virtual ~cDoubleBuffer() {
delete[] m_buf[0];
delete[] m_buf[1];
delete[] m_buf;
}
private:
int m_size;
int m_writeIndex;
int m_bufferIndex;
BufferType ** m_buf;
};
} /* namespace rijnfel */
#endif /* APP_DOUBLE_BUFFER_H_ */

24
software/include/rijnfel_core/helper_structs.h

@ -0,0 +1,24 @@
/*
* helper_structs.h
*
* Created on: Aug 22, 2017
* Author: Elmar
*/
#ifndef APP_HELPER_STRUCTS_H_
#define APP_HELPER_STRUCTS_H_
namespace rijnfel {
struct sSizedArray {
size_t size;
union {
uint32_t * u_array;
int32_t * i_array;
void * p_array;
};
};
}
#endif /* APP_HELPER_STRUCTS_H_ */

53
software/include/rijnfel_core/provider_averager.h

@ -0,0 +1,53 @@
/*
* provider_averager.h
*
* Created on: Aug 29, 2017
* Author: Elmar
*/
#ifndef APP_PROVIDER_AVERAGER_H_
#define APP_PROVIDER_AVERAGER_H_
#include "data_provider.h"
namespace rijnfel {
template<typename DataType, typename MaxType>
class cProviderAverager: public cDataSink {
public:
cProviderAverager(uint32_t i_averageSize = 250) :
m_input(this) {
m_averageSize = i_averageSize;
m_counter = 0;
}
virtual void ReceiveCallback(void * i_data, cDataReceiver * i_receiver) {
m_outcome += *static_cast<DataType*>(i_data);
m_counter++;
if (m_counter >= m_averageSize ) {
if (m_averageSize == 0) {
//TODO log message
return;
}
m_outcome = m_outcome / m_counter;
m_output.Push(&m_outcome);
Reset();
}
}
void Reset() {
m_outcome = 0;
m_counter = 0;
}
virtual ~cProviderAverager() {
}
cDataReceiver m_input;
cDataProvider m_output;
private:
uint32_t m_averageSize;
uint32_t m_counter;
MaxType m_outcome;
};
} /* namespace rijnfel */
#endif /* APP_PROVIDER_AVERAGER_H_ */

52
software/include/rijnfel_core/provider_buffer.h

@ -0,0 +1,52 @@
/*
* provider_buffer.h
*
* Created on: Aug 29, 2017
* Author: Elmar
*/
#ifndef APP_PROVIDER_BUFFER_H_
#define APP_PROVIDER_BUFFER_H_
#include "data_provider.h"
#include "helper_structs.h"
namespace rijnfel {
template<typename Data>
class cProviderBuffer: public cDataSink {
public:
cProviderBuffer(size_t i_bufferSize) :
m_input(this) {
m_bufferSize = i_bufferSize;
m_counter = 0;
m_array = new Data[i_bufferSize];
m_sizedArray.p_array = static_cast<void*>(m_array);
m_sizedArray.size = m_bufferSize;
}
virtual void ReceiveCallback(void * i_data, cDataReceiver * i_receiver) {
m_array[m_counter] = *static_cast<Data*>(i_data);
m_counter++;
if (m_counter == m_bufferSize) {
m_output.Push(static_cast<void*>(&m_sizedArray));
Reset();
}
}
void Reset(){
m_counter = 0;
}
virtual ~cProviderBuffer() {
delete[] m_array;
}
cDataReceiver m_input;
cDataProvider m_output;
private:
sSizedArray m_sizedArray;
size_t m_bufferSize;
size_t m_counter;
Data * m_array;
};
} /* namespace rijnfel */
#endif /* APP_PROVIDER_BUFFER_H_ */

23
software/include/rijnfel_core/rijnfel_core.h

@ -0,0 +1,23 @@
/*
* core.h
*
* Created on: Aug 23, 2017
* Author: Elmar
*/
#ifndef APP_CORE_CORE_H_
#define APP_CORE_CORE_H_
#include "adc.h"
#include "data_provider.h"
#include "data_receiver.h"
#include "data_sink.h"
#include "double_buffer.h"
#include "provider_averager.h"
#include "provider_buffer.h"
#include "helper_structs.h"
#include "sensor_settings.h"
#endif /* APP_CORE_CORE_H_ */

38
software/include/rijnfel_core/sensor.h

@ -0,0 +1,38 @@
/*
* sensor.h
*
* Created on: Aug 1, 2017
* Author: Elmar
*/
#ifndef APP_SENSOR_H_
#define APP_SENSOR_H_
#include <stddef.h>
namespace rijnfel {
template<typename Sample>
class cSensor {
public:
cSensor() {
m_callback = NULL;
}
Sample GetLatestSample(void) {
return m_latestSample;
}
void SetOnSampleCallBack(void (*i_callback)(Sample & o_sample)) {
m_callback = i_callback;
}
virtual void WaitSample(void) = 0;
virtual bool IsReady(void) = 0;
virtual Sample RawSample(void) = 0;
virtual ~cSensor() {
}
protected:
Sample m_latestSample;
void (*m_callback)(Sample & o_sample);
};
}
#endif /* APP_SENSOR_H_ */

48
software/include/rijnfel_core/sensor_settings.h

@ -0,0 +1,48 @@
/*
* sensor_settings.h
*
* Created on: Aug 1, 2017
* Author: Elmar
*/
#ifndef APP_SENSOR_SETTINGS_H_
#define APP_SENSOR_SETTINGS_H_
#include "data_provider.h"
#include "double_buffer.h"
namespace rijnfel {
//timebase, in miliseconds.
//Example, period = 10 (ms) timebase = 250(ms)
//Callback will be called after 250/10 = 25 samples
template<typename BufferType>
class cSensorSettings {
public:
cSensorSettings(uint32_t i_timeBase, uint32_t i_period) :
m_periodTimer(0), m_period(i_period), m_buffer(0) {
m_buffer.Resize((int) (i_timeBase / m_period));
}
void Reset() {
m_periodTimer = 0;
m_buffer.Reset();
}
bool ShouldSample(uint32_t i_updatePeriod) {
m_periodTimer += i_updatePeriod;
if (m_periodTimer >= m_period) {
m_periodTimer -= m_period;
return true;
}
return false;
}
cDataProvider m_samplesProvider;
cDoubleBuffer<BufferType> m_buffer;
private:
uint32_t m_periodTimer;
uint32_t m_period;
};
}
#endif /* APP_SENSOR_SETTINGS_H_ */

16
software/include/signal_processing.h

@ -0,0 +1,16 @@
//----------------------------------------------------------------------------------------------------------------------------
// Project: Uppsense
// Name: signal_processing.h
// Author: Maximilian Stiefel
// Date: 27.08.2017
//
// Description:
//
//----------------------------------------------------------------------------------------------------------------------------
#ifndef APP_SIGNAL_PROCESSING_H_
#define APP_SIGNAL_PROCESSING_H_
const uint16_t SAMPLES = 128;
#endif /* APP_SIGNAL_PROCESING_H_ */

45
software/include/user_config.h

@ -0,0 +1,45 @@
#ifndef __USER_CONFIG_H__
#define __USER_CONFIG_H__
#ifdef __cplusplus
extern "C" {
#endif
// UART config
#define SERIAL_BAUD_RATE COM_SPEED_SERIAL
// ESP SDK config
#define LWIP_OPEN_SRC
#define USE_US_TIMER
// Default types
#define __CORRECT_ISO_CPP_STDLIB_H_PROTO
#include <limits.h>
#include <stdint.h>
// Override c_types.h include and remove buggy espconn
#define _C_TYPES_H_
#define _NO_ESPCON_
// Updated, compatible version of c_types.h
// Just removed types declared in <stdint.h>
#include <espinc/c_types_compatible.h>
// System API declarations
#include <esp_systemapi.h>
// C++ Support
#include <esp_cplusplus.h>
// Extended string conversion for compatibility
#include <stringconversion.h>
// Network base API
#include <espinc/lwip_includes.h>
// Beta boards
#define BOARD_ESP01
#ifdef __cplusplus
}
#endif
#endif

184
software/libs/arduinoFFT/arduinoFFT.cpp

@ -0,0 +1,184 @@
/*
FFT libray
Copyright (C) 2010 Didier Longueville
Copyright (C) 2014 Enrique Condes
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "arduinoFFT.h"
arduinoFFT::arduinoFFT(void)
{
/* Constructor */
}
arduinoFFT::~arduinoFFT(void)
{
/* Destructor */
}
uint8_t arduinoFFT::Revision(void)
{
return(FFT_LIB_REV);
}
void arduinoFFT::Compute(double *vReal, double *vImag, uint16_t samples, uint8_t dir)
{
Compute(vReal, vImag, samples, Exponent(samples), dir);
}
void arduinoFFT::Compute(double *vReal, double *vImag, uint16_t samples, uint8_t power, uint8_t dir)
{
/* Computes in-place complex-to-complex FFT */
/* Reverse bits */
uint16_t j = 0;
for (uint16_t i = 0; i < (samples - 1); i++) {
if (i < j) {
Swap(&vReal[i], &vReal[j]);
Swap(&vImag[i], &vImag[j]);
}
uint16_t k = (samples >> 1);
while (k <= j) {
j -= k;
k >>= 1;
}
j += k;
}
/* Compute the FFT */
double c1 = -1.0;
double c2 = 0.0;
uint16_t l2 = 1;
for (uint8_t l = 0; (l < power); l++) {
uint16_t l1 = l2;
l2 <<= 1;
double u1 = 1.0;
double u2 = 0.0;
for (j = 0; j < l1; j++) {
for (uint16_t i = j; i < samples; i += l2) {
uint16_t i1 = i + l1;
double t1 = u1 * vReal[i1] - u2 * vImag[i1];
double t2 = u1 * vImag[i1] + u2 * vReal[i1];
vReal[i1] = vReal[i] - t1;
vImag[i1] = vImag[i] - t2;
vReal[i] += t1;
vImag[i] += t2;
}
double z = ((u1 * c1) - (u2 * c2));
u2 = ((u1 * c2) + (u2 * c1));
u1 = z;
}
c2 = sqrt((1.0 - c1) / 2.0);
if (dir == FFT_FORWARD) {
c2 = -c2;
}
c1 = sqrt((1.0 + c1) / 2.0);
}
/* Scaling for reverse transform */
if (dir != FFT_FORWARD) {
for (uint16_t i = 0; i < samples; i++) {
vReal[i] /= samples;
vImag[i] /= samples;
}
}
}
void arduinoFFT::ComplexToMagnitude(double *vReal, double *vImag, uint16_t samples)
{
/* vM is half the size of vReal and vImag */
for (uint16_t i = 0; i < samples; i++) {
vReal[i] = sqrt(sq(vReal[i]) + sq(vImag[i]));
}
}
void arduinoFFT::Windowing(double *vData, uint16_t samples, uint8_t windowType, uint8_t dir)
{
/* Weighing factors are computed once before multiple use of FFT */
/* The weighing function is symetric; half the weighs are recorded */
double samplesMinusOne = (double(samples) - 1.0);
for (uint16_t i = 0; i < (samples >> 1); i++) {
double indexMinusOne = double(i);
double ratio = (indexMinusOne / samplesMinusOne);
double weighingFactor = 1.0;
/* Compute and record weighting factor */
switch (windowType) {
case FFT_WIN_TYP_RECTANGLE: /* rectangle (box car) */
weighingFactor = 1.0;
break;
case FFT_WIN_TYP_HAMMING: /* hamming */
weighingFactor = 0.54 - (0.46 * cos(twoPi * ratio));
break;
case FFT_WIN_TYP_HANN: /* hann */
weighingFactor = 0.54 * (1.0 - cos(twoPi * ratio));
break;
case FFT_WIN_TYP_TRIANGLE: /* triangle (Bartlett) */
weighingFactor = 1.0 - ((2.0 * abs(indexMinusOne - (samplesMinusOne / 2.0))) / samplesMinusOne);
break;
case FFT_WIN_TYP_BLACKMAN: /* blackmann */
weighingFactor = 0.42323 - (0.49755 * (cos(twoPi * ratio))) + (0.07922 * (cos(fourPi * ratio)));
break;
case FFT_WIN_TYP_FLT_TOP: /* flat top */
weighingFactor = 0.2810639 - (0.5208972 * cos(twoPi * ratio)) + (0.1980399 * cos(fourPi * ratio));
break;
case FFT_WIN_TYP_WELCH: /* welch */
weighingFactor = 1.0 - sq((indexMinusOne - samplesMinusOne / 2.0) / (samplesMinusOne / 2.0));
break;
}
if (dir == FFT_FORWARD) {
vData[i] *= weighingFactor;
vData[samples - (i + 1)] *= weighingFactor;
}
else {
vData[i] /= weighingFactor;
vData[samples - (i + 1)] /= weighingFactor;
}
}
}
double arduinoFFT::MajorPeak(double *vD, uint16_t samples, double samplingFrequency)
{
double maxY = 0;
uint16_t IndexOfMaxY = 0;
for (uint16_t i = 1; i < ((samples >> 1) - 1); i++) {
if ((vD[i-1] < vD[i]) && (vD[i] > vD[i+1])) {
if (vD[i] > maxY) {
maxY = vD[i];
IndexOfMaxY = i;
}
}
}
double delta = 0.5 * ((vD[IndexOfMaxY-1] - vD[IndexOfMaxY+1]) / (vD[IndexOfMaxY-1] - (2.0 * vD[IndexOfMaxY]) + vD[IndexOfMaxY+1]));
double interpolatedX = ((IndexOfMaxY + delta) * samplingFrequency) / (samples-1);
/* retuned value: interpolated frequency peak apex */
return(interpolatedX);
}
/* Private functions */
void arduinoFFT::Swap(double *x, double *y)
{
double temp = *x;
*x = *y;
*y = temp;
}
uint8_t arduinoFFT::Exponent(uint16_t value)
{
/* Calculates the base 2 logarithm of a value */
uint8_t result = 0;
while (((value >> result) & 1) != 1) result++;
return(result);
}

76
software/libs/arduinoFFT/arduinoFFT.h

@ -0,0 +1,76 @@
/*
FFT libray
Copyright (C) 2010 Didier Longueville
Copyright (C) 2014 Enrique Condes
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef arduinoFFT_h /* Prevent loading library twice */
#define arduinoFFT_h
#ifdef ARDUINO
#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h" /* This is where the standard Arduino code lies */
#endif
#else
#include <stdlib.h>
#include <stdio.h>
#include <avr/io.h>
#include <math.h>
#include "defs.h"
#include "types.h"
#endif
#define FFT_LIB_REV 0x02c
/* Custom constants */
#define FFT_FORWARD 0x01
#define FFT_REVERSE 0x00
/* Windowing type */
#define FFT_WIN_TYP_RECTANGLE 0x00 /* rectangle (Box car) */
#define FFT_WIN_TYP_HAMMING 0x01 /* hamming */
#define FFT_WIN_TYP_HANN 0x02 /* hann */
#define FFT_WIN_TYP_TRIANGLE 0x03 /* triangle (Bartlett) */
#define FFT_WIN_TYP_BLACKMAN 0x04 /* blackmann */
#define FFT_WIN_TYP_FLT_TOP 0x05 /* flat top */
#define FFT_WIN_TYP_WELCH 0x06 /* welch */
/*Mathematial constants*/
#define twoPi 6.28318531
#define fourPi 12.56637061
class arduinoFFT {
public:
/* Constructor */
arduinoFFT(void);
/* Destructor */
~arduinoFFT(void);
/* Functions */
void ComplexToMagnitude(double *vReal, double *vImag, uint16_t samples);
void Compute(double *vReal, double *vImag, uint16_t samples, uint8_t dir);
void Compute(double *vReal, double *vImag, uint16_t samples, uint8_t power, uint8_t dir);
double MajorPeak(double *vD, uint16_t samples, double samplingFrequency);
uint8_t Revision(void);
void Windowing(double *vData, uint16_t samples, uint8_t windowType, uint8_t dir);
uint8_t Exponent(uint16_t value);
private:
/* Functions */
void Swap(double *x, double *y);
};
#endif

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save