Compare commits
49 Commits
master
...
software_f
102 changed files with 18621 additions and 10522 deletions
@ -0,0 +1,4 @@ |
|||||
|
__Previews/ |
||||
|
History/ |
||||
|
Project Logs for uppsense/ |
||||
|
Project Outputs for uppsense |
Binary file not shown.
@ -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,0 +1,4 @@ |
|||||
|
__Previews/ |
||||
|
History/ |
||||
|
Project Logs for uppsense/ |
||||
|
Project Outputs for uppsense |
@ -0,0 +1,3 @@ |
|||||
|
*.SchDoc.Zip |
||||
|
*.PcbDoc.Zip |
||||
|
*.PrjPcb.Zip |
@ -0,0 +1 @@ |
|||||
|
*.LOG |
@ -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) > 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> |
Binary file not shown.
File diff suppressed because it is too large
@ -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* |
@ -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* |
@ -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* |
File diff suppressed because it is too large
File diff suppressed because it is too large
@ -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* |
@ -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* |
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
@ -0,0 +1 @@ |
|||||
|
Record=TopLevelDocument|FileName=uppsense.SchDoc |
Binary file not shown.
@ -1,8 +1,30 @@ |
|||||
(module BPW34FA (layer F.Cu) (tedit 58FDD900) |
(module BPW34FA (layer F.Cu) (tedit 58FDDC7C) |
||||
(fp_text reference REF** (at 0 0.5) (layer F.SilkS) |
(fp_text reference REF** (at 0 3.81) (layer F.SilkS) |
||||
(effects (font (size 1 1) (thickness 0.15))) |
(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))) |
(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)) |
||||
) |
) |
||||
|
@ -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++ |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
@ -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 |
|
@ -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 |
|
File diff suppressed because it is too large
@ -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 |
@ -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); |
||||
|
} |
@ -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_ */ |
@ -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 |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} |
@ -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_ */ |
@ -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 */ |
||||
|
|
@ -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_ */ |
@ -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(); |
||||
|
} |
||||
|
|
@ -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 ); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
@ -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_ */ |
@ -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); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
@ -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_ */ |
@ -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 */ |
@ -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_ */ |
@ -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 */ |
||||
|
|
@ -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_ */ |
@ -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 */ |
@ -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_ */ |
@ -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_ */ |
@ -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); |
||||
|
} |
||||
|
} |
@ -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_ */ |
@ -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 */ |
||||
|
|
@ -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_ */ |
Binary file not shown.
@ -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> </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> |
@ -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); |
||||
|
}); |
@ -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> </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> |
@ -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); |
||||
|
} |
Binary file not shown.
@ -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_ */ |
@ -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_ */ |
@ -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_ */ |
@ -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_ */ |
@ -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_ */ |
@ -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_ */ |
@ -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_ */ |
@ -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_ */ |
@ -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_ */ |
@ -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_ */ |
@ -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_ */ |
@ -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_ */ |
@ -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_ */ |
@ -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_ */ |
@ -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_ */ |
@ -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 |
@ -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); |
||||
|
} |
@ -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…
Reference in new issue