Add poweroff function & status LED. Include 3D files for Seeed XIAO

This commit is contained in:
Matt
2025-12-13 17:38:18 +00:00
parent c762e0d632
commit 00c3c85c67
6 changed files with 4258 additions and 118 deletions

661
3D/Base.step Normal file
View File

@@ -0,0 +1,661 @@
ISO-10303-21;
HEADER;
/* Generated by software containing ST-Developer
* from STEP Tools, Inc. (www.steptools.com)
*/
FILE_DESCRIPTION(
/* description */ (''),
/* implementation_level */ '2;1');
FILE_NAME(
/* name */ 'Base.step',
/* time_stamp */ '2025-12-13T15:33:07Z',
/* author */ (''),
/* organization */ (''),
/* preprocessor_version */ 'ST-DEVELOPER v20.1',
/* originating_system */ 'Autodesk Translation Framework v14.21.0.0',
/* authorisation */ '');
FILE_SCHEMA (('AUTOMOTIVE_DESIGN { 1 0 10303 214 3 1 1 }'));
ENDSEC;
DATA;
#10=MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#13),#583);
#11=SHAPE_REPRESENTATION_RELATIONSHIP('SRR','None',#590,#12);
#12=ADVANCED_BREP_SHAPE_REPRESENTATION('',(#14),#582);
#13=STYLED_ITEM('',(#599),#14);
#14=MANIFOLD_SOLID_BREP('Body3',#355);
#15=PLANE('',#375);
#16=PLANE('',#376);
#17=PLANE('',#377);
#18=PLANE('',#378);
#19=PLANE('',#379);
#20=PLANE('',#380);
#21=PLANE('',#381);
#22=PLANE('',#382);
#23=PLANE('',#383);
#24=PLANE('',#384);
#25=PLANE('',#385);
#26=PLANE('',#386);
#27=PLANE('',#387);
#28=PLANE('',#388);
#29=PLANE('',#389);
#30=PLANE('',#390);
#31=FACE_OUTER_BOUND('',#49,.T.);
#32=FACE_OUTER_BOUND('',#50,.T.);
#33=FACE_OUTER_BOUND('',#51,.T.);
#34=FACE_OUTER_BOUND('',#52,.T.);
#35=FACE_OUTER_BOUND('',#53,.T.);
#36=FACE_OUTER_BOUND('',#54,.T.);
#37=FACE_OUTER_BOUND('',#55,.T.);
#38=FACE_OUTER_BOUND('',#56,.T.);
#39=FACE_OUTER_BOUND('',#57,.T.);
#40=FACE_OUTER_BOUND('',#58,.T.);
#41=FACE_OUTER_BOUND('',#59,.T.);
#42=FACE_OUTER_BOUND('',#60,.T.);
#43=FACE_OUTER_BOUND('',#61,.T.);
#44=FACE_OUTER_BOUND('',#62,.T.);
#45=FACE_OUTER_BOUND('',#63,.T.);
#46=FACE_OUTER_BOUND('',#64,.T.);
#47=FACE_OUTER_BOUND('',#65,.T.);
#48=FACE_OUTER_BOUND('',#66,.T.);
#49=EDGE_LOOP('',(#239,#240,#241,#242));
#50=EDGE_LOOP('',(#243,#244,#245,#246));
#51=EDGE_LOOP('',(#247,#248,#249,#250));
#52=EDGE_LOOP('',(#251,#252,#253,#254,#255,#256,#257,#258));
#53=EDGE_LOOP('',(#259,#260,#261,#262,#263,#264,#265,#266));
#54=EDGE_LOOP('',(#267,#268,#269,#270,#271,#272,#273,#274));
#55=EDGE_LOOP('',(#275,#276,#277,#278));
#56=EDGE_LOOP('',(#279,#280,#281,#282));
#57=EDGE_LOOP('',(#283,#284,#285,#286));
#58=EDGE_LOOP('',(#287,#288,#289,#290,#291,#292,#293,#294));
#59=EDGE_LOOP('',(#295,#296,#297,#298));
#60=EDGE_LOOP('',(#299,#300,#301,#302));
#61=EDGE_LOOP('',(#303,#304,#305,#306,#307,#308,#309,#310));
#62=EDGE_LOOP('',(#311,#312,#313,#314));
#63=EDGE_LOOP('',(#315,#316,#317,#318));
#64=EDGE_LOOP('',(#319,#320,#321,#322));
#65=EDGE_LOOP('',(#323,#324,#325,#326,#327,#328,#329,#330));
#66=EDGE_LOOP('',(#331,#332,#333,#334));
#67=LINE('',#487,#111);
#68=LINE('',#490,#112);
#69=LINE('',#496,#113);
#70=LINE('',#499,#114);
#71=LINE('',#501,#115);
#72=LINE('',#502,#116);
#73=LINE('',#505,#117);
#74=LINE('',#507,#118);
#75=LINE('',#509,#119);
#76=LINE('',#511,#120);
#77=LINE('',#513,#121);
#78=LINE('',#515,#122);
#79=LINE('',#516,#123);
#80=LINE('',#519,#124);
#81=LINE('',#521,#125);
#82=LINE('',#523,#126);
#83=LINE('',#525,#127);
#84=LINE('',#527,#128);
#85=LINE('',#529,#129);
#86=LINE('',#530,#130);
#87=LINE('',#533,#131);
#88=LINE('',#535,#132);
#89=LINE('',#536,#133);
#90=LINE('',#539,#134);
#91=LINE('',#541,#135);
#92=LINE('',#542,#136);
#93=LINE('',#545,#137);
#94=LINE('',#547,#138);
#95=LINE('',#548,#139);
#96=LINE('',#550,#140);
#97=LINE('',#551,#141);
#98=LINE('',#554,#142);
#99=LINE('',#556,#143);
#100=LINE('',#557,#144);
#101=LINE('',#561,#145);
#102=LINE('',#562,#146);
#103=LINE('',#563,#147);
#104=LINE('',#566,#148);
#105=LINE('',#568,#149);
#106=LINE('',#569,#150);
#107=LINE('',#571,#151);
#108=LINE('',#572,#152);
#109=LINE('',#576,#153);
#110=LINE('',#578,#154);
#111=VECTOR('',#397,10.);
#112=VECTOR('',#400,10.);
#113=VECTOR('',#405,10.);
#114=VECTOR('',#408,10.);
#115=VECTOR('',#411,10.);
#116=VECTOR('',#412,10.);
#117=VECTOR('',#415,10.);
#118=VECTOR('',#416,10.);
#119=VECTOR('',#417,10.);
#120=VECTOR('',#418,10.);
#121=VECTOR('',#419,10.);
#122=VECTOR('',#420,10.);
#123=VECTOR('',#421,10.);
#124=VECTOR('',#424,10.);
#125=VECTOR('',#425,10.);
#126=VECTOR('',#426,10.);
#127=VECTOR('',#427,10.);
#128=VECTOR('',#428,10.);
#129=VECTOR('',#429,10.);
#130=VECTOR('',#430,10.);
#131=VECTOR('',#433,10.);
#132=VECTOR('',#434,10.);
#133=VECTOR('',#435,10.);
#134=VECTOR('',#438,10.);
#135=VECTOR('',#439,10.);
#136=VECTOR('',#440,10.);
#137=VECTOR('',#443,10.);
#138=VECTOR('',#444,10.);
#139=VECTOR('',#445,10.);
#140=VECTOR('',#448,10.);
#141=VECTOR('',#449,10.);
#142=VECTOR('',#452,10.);
#143=VECTOR('',#453,10.);
#144=VECTOR('',#454,10.);
#145=VECTOR('',#457,10.);
#146=VECTOR('',#458,10.);
#147=VECTOR('',#459,10.);
#148=VECTOR('',#462,10.);
#149=VECTOR('',#463,10.);
#150=VECTOR('',#464,10.);
#151=VECTOR('',#467,10.);
#152=VECTOR('',#468,10.);
#153=VECTOR('',#475,10.);
#154=VECTOR('',#478,10.);
#155=CIRCLE('',#370,1.45);
#156=CIRCLE('',#371,1.45);
#157=CIRCLE('',#373,1.45);
#158=CIRCLE('',#374,1.45);
#159=VERTEX_POINT('',#483);
#160=VERTEX_POINT('',#484);
#161=VERTEX_POINT('',#486);
#162=VERTEX_POINT('',#488);
#163=VERTEX_POINT('',#492);
#164=VERTEX_POINT('',#493);
#165=VERTEX_POINT('',#495);
#166=VERTEX_POINT('',#497);
#167=VERTEX_POINT('',#504);
#168=VERTEX_POINT('',#506);
#169=VERTEX_POINT('',#508);
#170=VERTEX_POINT('',#510);
#171=VERTEX_POINT('',#512);
#172=VERTEX_POINT('',#514);
#173=VERTEX_POINT('',#518);
#174=VERTEX_POINT('',#520);
#175=VERTEX_POINT('',#522);
#176=VERTEX_POINT('',#524);
#177=VERTEX_POINT('',#526);
#178=VERTEX_POINT('',#528);
#179=VERTEX_POINT('',#532);
#180=VERTEX_POINT('',#534);
#181=VERTEX_POINT('',#538);
#182=VERTEX_POINT('',#540);
#183=VERTEX_POINT('',#544);
#184=VERTEX_POINT('',#546);
#185=VERTEX_POINT('',#553);
#186=VERTEX_POINT('',#555);
#187=VERTEX_POINT('',#559);
#188=VERTEX_POINT('',#560);
#189=VERTEX_POINT('',#565);
#190=VERTEX_POINT('',#567);
#191=EDGE_CURVE('',#159,#160,#155,.T.);
#192=EDGE_CURVE('',#161,#159,#67,.T.);
#193=EDGE_CURVE('',#162,#161,#156,.T.);
#194=EDGE_CURVE('',#160,#162,#68,.T.);
#195=EDGE_CURVE('',#163,#164,#157,.T.);
#196=EDGE_CURVE('',#165,#163,#69,.T.);
#197=EDGE_CURVE('',#166,#165,#158,.T.);
#198=EDGE_CURVE('',#166,#164,#70,.T.);
#199=EDGE_CURVE('',#164,#159,#71,.T.);
#200=EDGE_CURVE('',#161,#166,#72,.T.);
#201=EDGE_CURVE('',#163,#167,#73,.T.);
#202=EDGE_CURVE('',#167,#168,#74,.T.);
#203=EDGE_CURVE('',#168,#169,#75,.T.);
#204=EDGE_CURVE('',#169,#170,#76,.T.);
#205=EDGE_CURVE('',#170,#171,#77,.T.);
#206=EDGE_CURVE('',#171,#172,#78,.T.);
#207=EDGE_CURVE('',#172,#165,#79,.T.);
#208=EDGE_CURVE('',#162,#173,#80,.T.);
#209=EDGE_CURVE('',#173,#174,#81,.T.);
#210=EDGE_CURVE('',#174,#175,#82,.T.);
#211=EDGE_CURVE('',#175,#176,#83,.T.);
#212=EDGE_CURVE('',#176,#177,#84,.T.);
#213=EDGE_CURVE('',#177,#178,#85,.T.);
#214=EDGE_CURVE('',#178,#160,#86,.T.);
#215=EDGE_CURVE('',#172,#179,#87,.T.);
#216=EDGE_CURVE('',#180,#179,#88,.T.);
#217=EDGE_CURVE('',#173,#180,#89,.T.);
#218=EDGE_CURVE('',#170,#181,#90,.T.);
#219=EDGE_CURVE('',#182,#169,#91,.T.);
#220=EDGE_CURVE('',#182,#181,#92,.T.);
#221=EDGE_CURVE('',#181,#183,#93,.T.);
#222=EDGE_CURVE('',#184,#182,#94,.T.);
#223=EDGE_CURVE('',#184,#183,#95,.T.);
#224=EDGE_CURVE('',#183,#175,#96,.T.);
#225=EDGE_CURVE('',#176,#184,#97,.T.);
#226=EDGE_CURVE('',#168,#185,#98,.T.);
#227=EDGE_CURVE('',#186,#185,#99,.T.);
#228=EDGE_CURVE('',#177,#186,#100,.T.);
#229=EDGE_CURVE('',#187,#188,#101,.T.);
#230=EDGE_CURVE('',#188,#186,#102,.T.);
#231=EDGE_CURVE('',#185,#187,#103,.T.);
#232=EDGE_CURVE('',#179,#189,#104,.T.);
#233=EDGE_CURVE('',#189,#190,#105,.T.);
#234=EDGE_CURVE('',#190,#180,#106,.T.);
#235=EDGE_CURVE('',#178,#188,#107,.T.);
#236=EDGE_CURVE('',#167,#187,#108,.T.);
#237=EDGE_CURVE('',#174,#190,#109,.T.);
#238=EDGE_CURVE('',#171,#189,#110,.T.);
#239=ORIENTED_EDGE('',*,*,#191,.F.);
#240=ORIENTED_EDGE('',*,*,#192,.F.);
#241=ORIENTED_EDGE('',*,*,#193,.F.);
#242=ORIENTED_EDGE('',*,*,#194,.F.);
#243=ORIENTED_EDGE('',*,*,#195,.F.);
#244=ORIENTED_EDGE('',*,*,#196,.F.);
#245=ORIENTED_EDGE('',*,*,#197,.F.);
#246=ORIENTED_EDGE('',*,*,#198,.T.);
#247=ORIENTED_EDGE('',*,*,#199,.F.);
#248=ORIENTED_EDGE('',*,*,#198,.F.);
#249=ORIENTED_EDGE('',*,*,#200,.F.);
#250=ORIENTED_EDGE('',*,*,#192,.T.);
#251=ORIENTED_EDGE('',*,*,#196,.T.);
#252=ORIENTED_EDGE('',*,*,#201,.T.);
#253=ORIENTED_EDGE('',*,*,#202,.T.);
#254=ORIENTED_EDGE('',*,*,#203,.T.);
#255=ORIENTED_EDGE('',*,*,#204,.T.);
#256=ORIENTED_EDGE('',*,*,#205,.T.);
#257=ORIENTED_EDGE('',*,*,#206,.T.);
#258=ORIENTED_EDGE('',*,*,#207,.T.);
#259=ORIENTED_EDGE('',*,*,#194,.T.);
#260=ORIENTED_EDGE('',*,*,#208,.T.);
#261=ORIENTED_EDGE('',*,*,#209,.T.);
#262=ORIENTED_EDGE('',*,*,#210,.T.);
#263=ORIENTED_EDGE('',*,*,#211,.T.);
#264=ORIENTED_EDGE('',*,*,#212,.T.);
#265=ORIENTED_EDGE('',*,*,#213,.T.);
#266=ORIENTED_EDGE('',*,*,#214,.T.);
#267=ORIENTED_EDGE('',*,*,#193,.T.);
#268=ORIENTED_EDGE('',*,*,#200,.T.);
#269=ORIENTED_EDGE('',*,*,#197,.T.);
#270=ORIENTED_EDGE('',*,*,#207,.F.);
#271=ORIENTED_EDGE('',*,*,#215,.T.);
#272=ORIENTED_EDGE('',*,*,#216,.F.);
#273=ORIENTED_EDGE('',*,*,#217,.F.);
#274=ORIENTED_EDGE('',*,*,#208,.F.);
#275=ORIENTED_EDGE('',*,*,#218,.F.);
#276=ORIENTED_EDGE('',*,*,#204,.F.);
#277=ORIENTED_EDGE('',*,*,#219,.F.);
#278=ORIENTED_EDGE('',*,*,#220,.T.);
#279=ORIENTED_EDGE('',*,*,#221,.F.);
#280=ORIENTED_EDGE('',*,*,#220,.F.);
#281=ORIENTED_EDGE('',*,*,#222,.F.);
#282=ORIENTED_EDGE('',*,*,#223,.T.);
#283=ORIENTED_EDGE('',*,*,#224,.F.);
#284=ORIENTED_EDGE('',*,*,#223,.F.);
#285=ORIENTED_EDGE('',*,*,#225,.F.);
#286=ORIENTED_EDGE('',*,*,#211,.F.);
#287=ORIENTED_EDGE('',*,*,#225,.T.);
#288=ORIENTED_EDGE('',*,*,#222,.T.);
#289=ORIENTED_EDGE('',*,*,#219,.T.);
#290=ORIENTED_EDGE('',*,*,#203,.F.);
#291=ORIENTED_EDGE('',*,*,#226,.T.);
#292=ORIENTED_EDGE('',*,*,#227,.F.);
#293=ORIENTED_EDGE('',*,*,#228,.F.);
#294=ORIENTED_EDGE('',*,*,#212,.F.);
#295=ORIENTED_EDGE('',*,*,#229,.T.);
#296=ORIENTED_EDGE('',*,*,#230,.T.);
#297=ORIENTED_EDGE('',*,*,#227,.T.);
#298=ORIENTED_EDGE('',*,*,#231,.T.);
#299=ORIENTED_EDGE('',*,*,#232,.T.);
#300=ORIENTED_EDGE('',*,*,#233,.T.);
#301=ORIENTED_EDGE('',*,*,#234,.T.);
#302=ORIENTED_EDGE('',*,*,#216,.T.);
#303=ORIENTED_EDGE('',*,*,#191,.T.);
#304=ORIENTED_EDGE('',*,*,#214,.F.);
#305=ORIENTED_EDGE('',*,*,#235,.T.);
#306=ORIENTED_EDGE('',*,*,#229,.F.);
#307=ORIENTED_EDGE('',*,*,#236,.F.);
#308=ORIENTED_EDGE('',*,*,#201,.F.);
#309=ORIENTED_EDGE('',*,*,#195,.T.);
#310=ORIENTED_EDGE('',*,*,#199,.T.);
#311=ORIENTED_EDGE('',*,*,#202,.F.);
#312=ORIENTED_EDGE('',*,*,#236,.T.);
#313=ORIENTED_EDGE('',*,*,#231,.F.);
#314=ORIENTED_EDGE('',*,*,#226,.F.);
#315=ORIENTED_EDGE('',*,*,#213,.F.);
#316=ORIENTED_EDGE('',*,*,#228,.T.);
#317=ORIENTED_EDGE('',*,*,#230,.F.);
#318=ORIENTED_EDGE('',*,*,#235,.F.);
#319=ORIENTED_EDGE('',*,*,#209,.F.);
#320=ORIENTED_EDGE('',*,*,#217,.T.);
#321=ORIENTED_EDGE('',*,*,#234,.F.);
#322=ORIENTED_EDGE('',*,*,#237,.F.);
#323=ORIENTED_EDGE('',*,*,#224,.T.);
#324=ORIENTED_EDGE('',*,*,#210,.F.);
#325=ORIENTED_EDGE('',*,*,#237,.T.);
#326=ORIENTED_EDGE('',*,*,#233,.F.);
#327=ORIENTED_EDGE('',*,*,#238,.F.);
#328=ORIENTED_EDGE('',*,*,#205,.F.);
#329=ORIENTED_EDGE('',*,*,#218,.T.);
#330=ORIENTED_EDGE('',*,*,#221,.T.);
#331=ORIENTED_EDGE('',*,*,#206,.F.);
#332=ORIENTED_EDGE('',*,*,#238,.T.);
#333=ORIENTED_EDGE('',*,*,#232,.F.);
#334=ORIENTED_EDGE('',*,*,#215,.F.);
#335=CYLINDRICAL_SURFACE('',#369,1.45);
#336=CYLINDRICAL_SURFACE('',#372,1.45);
#337=ADVANCED_FACE('',(#31),#335,.F.);
#338=ADVANCED_FACE('',(#32),#336,.F.);
#339=ADVANCED_FACE('',(#33),#15,.F.);
#340=ADVANCED_FACE('',(#34),#16,.F.);
#341=ADVANCED_FACE('',(#35),#17,.F.);
#342=ADVANCED_FACE('',(#36),#18,.T.);
#343=ADVANCED_FACE('',(#37),#19,.F.);
#344=ADVANCED_FACE('',(#38),#20,.F.);
#345=ADVANCED_FACE('',(#39),#21,.F.);
#346=ADVANCED_FACE('',(#40),#22,.T.);
#347=ADVANCED_FACE('',(#41),#23,.F.);
#348=ADVANCED_FACE('',(#42),#24,.T.);
#349=ADVANCED_FACE('',(#43),#25,.T.);
#350=ADVANCED_FACE('',(#44),#26,.T.);
#351=ADVANCED_FACE('',(#45),#27,.T.);
#352=ADVANCED_FACE('',(#46),#28,.T.);
#353=ADVANCED_FACE('',(#47),#29,.T.);
#354=ADVANCED_FACE('',(#48),#30,.T.);
#355=CLOSED_SHELL('',(#337,#338,#339,#340,#341,#342,#343,#344,#345,#346,
#347,#348,#349,#350,#351,#352,#353,#354));
#356=DERIVED_UNIT_ELEMENT(#358,1.);
#357=DERIVED_UNIT_ELEMENT(#585,-3.);
#358=(
MASS_UNIT()
NAMED_UNIT(*)
SI_UNIT(.KILO.,.GRAM.)
);
#359=DERIVED_UNIT((#356,#357));
#360=MEASURE_REPRESENTATION_ITEM('density measure',
POSITIVE_RATIO_MEASURE(7850.),#359);
#361=PROPERTY_DEFINITION_REPRESENTATION(#366,#363);
#362=PROPERTY_DEFINITION_REPRESENTATION(#367,#364);
#363=REPRESENTATION('material name',(#365),#582);
#364=REPRESENTATION('density',(#360),#582);
#365=DESCRIPTIVE_REPRESENTATION_ITEM('Steel','Steel');
#366=PROPERTY_DEFINITION('material property','material name',#592);
#367=PROPERTY_DEFINITION('material property','density of part',#592);
#368=AXIS2_PLACEMENT_3D('',#481,#391,#392);
#369=AXIS2_PLACEMENT_3D('',#482,#393,#394);
#370=AXIS2_PLACEMENT_3D('',#485,#395,#396);
#371=AXIS2_PLACEMENT_3D('',#489,#398,#399);
#372=AXIS2_PLACEMENT_3D('',#491,#401,#402);
#373=AXIS2_PLACEMENT_3D('',#494,#403,#404);
#374=AXIS2_PLACEMENT_3D('',#498,#406,#407);
#375=AXIS2_PLACEMENT_3D('',#500,#409,#410);
#376=AXIS2_PLACEMENT_3D('',#503,#413,#414);
#377=AXIS2_PLACEMENT_3D('',#517,#422,#423);
#378=AXIS2_PLACEMENT_3D('',#531,#431,#432);
#379=AXIS2_PLACEMENT_3D('',#537,#436,#437);
#380=AXIS2_PLACEMENT_3D('',#543,#441,#442);
#381=AXIS2_PLACEMENT_3D('',#549,#446,#447);
#382=AXIS2_PLACEMENT_3D('',#552,#450,#451);
#383=AXIS2_PLACEMENT_3D('',#558,#455,#456);
#384=AXIS2_PLACEMENT_3D('',#564,#460,#461);
#385=AXIS2_PLACEMENT_3D('',#570,#465,#466);
#386=AXIS2_PLACEMENT_3D('',#573,#469,#470);
#387=AXIS2_PLACEMENT_3D('',#574,#471,#472);
#388=AXIS2_PLACEMENT_3D('',#575,#473,#474);
#389=AXIS2_PLACEMENT_3D('',#577,#476,#477);
#390=AXIS2_PLACEMENT_3D('',#579,#479,#480);
#391=DIRECTION('axis',(0.,0.,1.));
#392=DIRECTION('refdir',(1.,0.,0.));
#393=DIRECTION('center_axis',(-1.,0.,0.));
#394=DIRECTION('ref_axis',(0.,1.,7.65671051465626E-16));
#395=DIRECTION('center_axis',(1.,0.,0.));
#396=DIRECTION('ref_axis',(0.,1.,7.65671051465626E-16));
#397=DIRECTION('',(-1.,0.,0.));
#398=DIRECTION('center_axis',(-1.,0.,5.18795807615523E-17));
#399=DIRECTION('ref_axis',(0.,1.,7.65671051465626E-16));
#400=DIRECTION('',(1.,0.,0.));
#401=DIRECTION('center_axis',(-1.,0.,0.));
#402=DIRECTION('ref_axis',(0.,7.65671051465626E-16,-1.));
#403=DIRECTION('center_axis',(1.,0.,0.));
#404=DIRECTION('ref_axis',(0.,7.65671051465626E-16,-1.));
#405=DIRECTION('',(-1.,0.,0.));
#406=DIRECTION('center_axis',(-1.,0.,5.18795807615523E-17));
#407=DIRECTION('ref_axis',(0.,7.65671051465626E-16,-1.));
#408=DIRECTION('',(-1.,0.,0.));
#409=DIRECTION('center_axis',(0.,1.,1.03436927760108E-15));
#410=DIRECTION('ref_axis',(-1.04646628663102E-32,1.03436927760108E-15,-1.));
#411=DIRECTION('',(0.,-1.03436927760108E-15,1.));
#412=DIRECTION('',(-5.18795807615523E-17,1.03436927760108E-15,-1.));
#413=DIRECTION('center_axis',(0.,1.,0.));
#414=DIRECTION('ref_axis',(0.,0.,1.));
#415=DIRECTION('',(0.,0.,-1.));
#416=DIRECTION('',(-1.,0.,0.));
#417=DIRECTION('',(0.,0.,1.));
#418=DIRECTION('',(-1.,0.,0.));
#419=DIRECTION('',(0.,0.,-1.));
#420=DIRECTION('',(1.,0.,0.));
#421=DIRECTION('',(5.18795807615523E-17,0.,1.));
#422=DIRECTION('center_axis',(0.,1.,0.));
#423=DIRECTION('ref_axis',(0.,0.,1.));
#424=DIRECTION('',(5.18795807615523E-17,0.,1.));
#425=DIRECTION('',(-1.,0.,0.));
#426=DIRECTION('',(0.,0.,-1.));
#427=DIRECTION('',(1.,0.,0.));
#428=DIRECTION('',(0.,0.,1.));
#429=DIRECTION('',(1.,0.,0.));
#430=DIRECTION('',(0.,0.,-1.));
#431=DIRECTION('center_axis',(1.,0.,-5.18795807615523E-17));
#432=DIRECTION('ref_axis',(-5.18795807615523E-17,0.,-1.));
#433=DIRECTION('',(0.,1.,0.));
#434=DIRECTION('',(-5.18795807615523E-17,0.,-1.));
#435=DIRECTION('',(0.,1.,0.));
#436=DIRECTION('center_axis',(0.,0.,-1.));
#437=DIRECTION('ref_axis',(0.,-1.,0.));
#438=DIRECTION('',(0.,1.,0.));
#439=DIRECTION('',(0.,-1.,0.));
#440=DIRECTION('',(-1.,0.,0.));
#441=DIRECTION('center_axis',(0.,1.,0.));
#442=DIRECTION('ref_axis',(0.,0.,-1.));
#443=DIRECTION('',(0.,0.,1.));
#444=DIRECTION('',(0.,0.,-1.));
#445=DIRECTION('',(-1.,0.,0.));
#446=DIRECTION('center_axis',(0.,0.,1.));
#447=DIRECTION('ref_axis',(0.,1.,0.));
#448=DIRECTION('',(0.,-1.,0.));
#449=DIRECTION('',(0.,1.,0.));
#450=DIRECTION('center_axis',(1.,0.,0.));
#451=DIRECTION('ref_axis',(0.,0.,-1.));
#452=DIRECTION('',(0.,1.,0.));
#453=DIRECTION('',(0.,0.,-1.));
#454=DIRECTION('',(0.,1.,0.));
#455=DIRECTION('center_axis',(0.,1.,0.));
#456=DIRECTION('ref_axis',(0.,0.,1.));
#457=DIRECTION('',(0.,0.,1.));
#458=DIRECTION('',(-1.,0.,0.));
#459=DIRECTION('',(1.,0.,0.));
#460=DIRECTION('center_axis',(0.,1.,0.));
#461=DIRECTION('ref_axis',(0.,0.,1.));
#462=DIRECTION('',(-1.,0.,0.));
#463=DIRECTION('',(0.,0.,1.));
#464=DIRECTION('',(1.,0.,0.));
#465=DIRECTION('center_axis',(-1.,0.,0.));
#466=DIRECTION('ref_axis',(0.,0.,1.));
#467=DIRECTION('',(0.,1.,0.));
#468=DIRECTION('',(0.,1.,0.));
#469=DIRECTION('center_axis',(0.,0.,1.));
#470=DIRECTION('ref_axis',(1.,0.,0.));
#471=DIRECTION('center_axis',(0.,0.,-1.));
#472=DIRECTION('ref_axis',(-1.,0.,0.));
#473=DIRECTION('center_axis',(0.,0.,1.));
#474=DIRECTION('ref_axis',(1.,0.,0.));
#475=DIRECTION('',(0.,1.,0.));
#476=DIRECTION('center_axis',(-1.,0.,0.));
#477=DIRECTION('ref_axis',(0.,0.,1.));
#478=DIRECTION('',(0.,1.,0.));
#479=DIRECTION('center_axis',(0.,0.,-1.));
#480=DIRECTION('ref_axis',(-1.,0.,0.));
#481=CARTESIAN_POINT('',(0.,0.,0.));
#482=CARTESIAN_POINT('Origin',(1.69999998882413,2.74999998509883,3.23139995541251));
#483=CARTESIAN_POINT('',(0.499999988824129,4.19999998509883,3.23139995541251));
#484=CARTESIAN_POINT('',(0.499999988824129,2.86139135040288,4.67711499086579));
#485=CARTESIAN_POINT('Origin',(0.499999988824129,2.74999998509883,3.23139995541251));
#486=CARTESIAN_POINT('',(1.69999998882413,4.19999998509883,3.23139995541251));
#487=CARTESIAN_POINT('',(1.69999998882413,4.19999998509883,3.23139995541251));
#488=CARTESIAN_POINT('',(1.69999998882413,2.86139135040288,4.67711499086579));
#489=CARTESIAN_POINT('Origin',(1.69999998882413,2.74999998509883,3.23139995541251));
#490=CARTESIAN_POINT('',(1.69999998882413,2.86139135040288,4.67711499086579));
#491=CARTESIAN_POINT('Origin',(1.69999998882413,2.74999998509884,-3.20860004458749));
#492=CARTESIAN_POINT('',(0.499999988824129,2.86139135040288,-4.65431508004078));
#493=CARTESIAN_POINT('',(0.499999988824129,4.19999998509884,-3.20860004458749));
#494=CARTESIAN_POINT('Origin',(0.499999988824129,2.74999998509884,-3.20860004458749));
#495=CARTESIAN_POINT('',(1.69999998882413,2.86139135040288,-4.65431508004078));
#496=CARTESIAN_POINT('',(1.69999998882413,2.86139135040288,-4.65431508004078));
#497=CARTESIAN_POINT('',(1.69999998882413,4.19999998509884,-3.20860004458749));
#498=CARTESIAN_POINT('Origin',(1.69999998882413,2.74999998509884,-3.20860004458749));
#499=CARTESIAN_POINT('',(1.69999998882413,4.19999998509884,-3.20860004458749));
#500=CARTESIAN_POINT('Origin',(1.69999998882413,4.19999998509883,3.23139995541251));
#501=CARTESIAN_POINT('',(0.499999988824129,4.19999998509884,-3.13429991612297));
#502=CARTESIAN_POINT('',(1.69999998882413,4.19999998509883,6.96570004848677));
#503=CARTESIAN_POINT('Origin',(-29.2500004451722,2.86139135040288,1.76951289176941E-7));
#504=CARTESIAN_POINT('',(0.499999988824129,2.86139135040288,-9.49999978765845));
#505=CARTESIAN_POINT('',(0.499999988824129,2.86139135040288,-4.74999980535358));
#506=CARTESIAN_POINT('',(-59.0000008791685,2.86139135040288,-9.49999978765845));
#507=CARTESIAN_POINT('',(-44.1250006621704,2.86139135040288,-9.49999978765845));
#508=CARTESIAN_POINT('',(-59.0000008791685,2.86139135040288,-3.78104420037607));
#509=CARTESIAN_POINT('',(-59.0000008791685,2.86139135040288,4.75000015925616));
#510=CARTESIAN_POINT('',(-60.2000008791685,2.86139135040288,-3.78104420037607));
#511=CARTESIAN_POINT('',(-44.1250006621704,2.86139135040288,-3.78104420037607));
#512=CARTESIAN_POINT('',(-60.2000008791685,2.86139135040288,-10.6999997876585));
#513=CARTESIAN_POINT('',(-60.2000008791685,2.86139135040288,-5.34999980535358));
#514=CARTESIAN_POINT('',(1.69999998882413,2.86139135040288,-10.6999997876585));
#515=CARTESIAN_POINT('',(-13.775000228174,2.86139135040288,-10.6999997876585));
#516=CARTESIAN_POINT('',(1.69999998882413,2.86139135040288,5.35000015925616));
#517=CARTESIAN_POINT('Origin',(-29.2500004451722,2.86139135040288,1.76951289176941E-7));
#518=CARTESIAN_POINT('',(1.69999998882413,2.86139135040288,10.700000141561));
#519=CARTESIAN_POINT('',(1.69999998882413,2.86139135040288,5.35000015925616));
#520=CARTESIAN_POINT('',(-60.2000008791685,2.86139135040288,10.700000141561));
#521=CARTESIAN_POINT('',(-44.7250006621704,2.86139135040288,10.700000141561));
#522=CARTESIAN_POINT('',(-60.2000008791685,2.86139135040288,3.91895579962393));
#523=CARTESIAN_POINT('',(-60.2000008791685,2.86139135040288,-5.34999980535358));
#524=CARTESIAN_POINT('',(-59.0000008791685,2.86139135040288,3.91895579962393));
#525=CARTESIAN_POINT('',(-44.1250006621704,2.86139135040288,3.91895579962393));
#526=CARTESIAN_POINT('',(-59.0000008791685,2.86139135040288,9.50000014156103));
#527=CARTESIAN_POINT('',(-59.0000008791685,2.86139135040288,4.75000015925616));
#528=CARTESIAN_POINT('',(0.499999988824129,2.86139135040288,9.50000014156103));
#529=CARTESIAN_POINT('',(-14.375000228174,2.86139135040288,9.50000014156103));
#530=CARTESIAN_POINT('',(0.499999988824129,2.86139135040288,-4.74999980535358));
#531=CARTESIAN_POINT('Origin',(1.69999998882413,2.86139135040288,10.700000141561));
#532=CARTESIAN_POINT('',(1.69999998882413,28.3613913504029,-10.6999997876585));
#533=CARTESIAN_POINT('',(1.69999998882413,2.86139135040288,-10.6999997876585));
#534=CARTESIAN_POINT('',(1.69999998882413,28.3613913504029,10.700000141561));
#535=CARTESIAN_POINT('',(1.69999998882413,28.3613913504029,5.35000015925616));
#536=CARTESIAN_POINT('',(1.69999998882413,2.86139135040288,10.700000141561));
#537=CARTESIAN_POINT('Origin',(-59.0000008791685,5.46139135040288,-3.78104420037607));
#538=CARTESIAN_POINT('',(-60.2000008791685,5.46139135040288,-3.78104420037607));
#539=CARTESIAN_POINT('',(-60.2000008791685,4.16139135040288,-3.78104420037607));
#540=CARTESIAN_POINT('',(-59.0000008791685,5.46139135040288,-3.78104420037607));
#541=CARTESIAN_POINT('',(-59.0000008791685,4.16139135040288,-3.78104420037607));
#542=CARTESIAN_POINT('',(-59.0000008791685,5.46139135040288,-3.78104420037607));
#543=CARTESIAN_POINT('Origin',(-59.0000008791685,5.46139135040288,3.91895579962393));
#544=CARTESIAN_POINT('',(-60.2000008791685,5.46139135040288,3.91895579962393));
#545=CARTESIAN_POINT('',(-60.2000008791685,5.46139135040288,-3.39052199401726));
#546=CARTESIAN_POINT('',(-59.0000008791685,5.46139135040288,3.91895579962393));
#547=CARTESIAN_POINT('',(-59.0000008791685,5.46139135040288,6.70947797059248));
#548=CARTESIAN_POINT('',(-59.0000008791685,5.46139135040288,3.91895579962393));
#549=CARTESIAN_POINT('Origin',(-59.0000008791685,2.86139135040288,3.91895579962393));
#550=CARTESIAN_POINT('',(-60.2000008791685,2.86139135040288,3.91895579962393));
#551=CARTESIAN_POINT('',(-59.0000008791685,2.86139135040288,3.91895579962393));
#552=CARTESIAN_POINT('Origin',(-59.0000008791685,2.86139135040288,9.50000014156103));
#553=CARTESIAN_POINT('',(-59.0000008791685,26.8613913504029,-9.49999978765845));
#554=CARTESIAN_POINT('',(-59.0000008791685,2.86139135040288,-9.49999978765845));
#555=CARTESIAN_POINT('',(-59.0000008791685,26.8613913504029,9.50000014156103));
#556=CARTESIAN_POINT('',(-59.0000008791685,26.8613913504029,4.75000015925616));
#557=CARTESIAN_POINT('',(-59.0000008791685,2.86139135040288,9.50000014156103));
#558=CARTESIAN_POINT('Origin',(-29.2500004451722,26.8613913504029,1.76951289176941E-7));
#559=CARTESIAN_POINT('',(0.499999988824129,26.8613913504029,-9.49999978765845));
#560=CARTESIAN_POINT('',(0.499999988824129,26.8613913504029,9.50000014156103));
#561=CARTESIAN_POINT('',(0.499999988824129,26.8613913504029,-4.74999980535358));
#562=CARTESIAN_POINT('',(-14.375000228174,26.8613913504029,9.50000014156103));
#563=CARTESIAN_POINT('',(-44.1250006621704,26.8613913504029,-9.49999978765845));
#564=CARTESIAN_POINT('Origin',(-29.2500004451722,28.3613913504029,1.76951289176941E-7));
#565=CARTESIAN_POINT('',(-60.2000008791685,28.3613913504029,-10.6999997876585));
#566=CARTESIAN_POINT('',(-13.775000228174,28.3613913504029,-10.6999997876585));
#567=CARTESIAN_POINT('',(-60.2000008791685,28.3613913504029,10.700000141561));
#568=CARTESIAN_POINT('',(-60.2000008791685,28.3613913504029,-5.34999980535358));
#569=CARTESIAN_POINT('',(-44.7250006621704,28.3613913504029,10.700000141561));
#570=CARTESIAN_POINT('Origin',(0.499999988824129,2.86139135040288,-9.49999978765845));
#571=CARTESIAN_POINT('',(0.499999988824129,2.86139135040288,9.50000014156103));
#572=CARTESIAN_POINT('',(0.499999988824129,2.86139135040288,-9.49999978765845));
#573=CARTESIAN_POINT('Origin',(-59.0000008791685,2.86139135040288,-9.49999978765845));
#574=CARTESIAN_POINT('Origin',(0.499999988824129,2.86139135040288,9.50000014156103));
#575=CARTESIAN_POINT('Origin',(-60.2000008791685,2.86139135040288,10.700000141561));
#576=CARTESIAN_POINT('',(-60.2000008791685,2.86139135040288,10.700000141561));
#577=CARTESIAN_POINT('Origin',(-60.2000008791685,2.86139135040288,-10.6999997876585));
#578=CARTESIAN_POINT('',(-60.2000008791685,2.86139135040288,-10.6999997876585));
#579=CARTESIAN_POINT('Origin',(1.69999998882413,2.86139135040288,-10.6999997876585));
#580=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.01),#584,
'DISTANCE_ACCURACY_VALUE',
'Maximum model space distance between geometric entities at asserted c
onnectivities');
#581=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.01),#584,
'DISTANCE_ACCURACY_VALUE',
'Maximum model space distance between geometric entities at asserted c
onnectivities');
#582=(
GEOMETRIC_REPRESENTATION_CONTEXT(3)
GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#580))
GLOBAL_UNIT_ASSIGNED_CONTEXT((#584,#586,#587))
REPRESENTATION_CONTEXT('','3D')
);
#583=(
GEOMETRIC_REPRESENTATION_CONTEXT(3)
GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#581))
GLOBAL_UNIT_ASSIGNED_CONTEXT((#584,#586,#587))
REPRESENTATION_CONTEXT('','3D')
);
#584=(
LENGTH_UNIT()
NAMED_UNIT(*)
SI_UNIT(.MILLI.,.METRE.)
);
#585=(
LENGTH_UNIT()
NAMED_UNIT(*)
SI_UNIT($,.METRE.)
);
#586=(
NAMED_UNIT(*)
PLANE_ANGLE_UNIT()
SI_UNIT($,.RADIAN.)
);
#587=(
NAMED_UNIT(*)
SI_UNIT($,.STERADIAN.)
SOLID_ANGLE_UNIT()
);
#588=SHAPE_DEFINITION_REPRESENTATION(#589,#590);
#589=PRODUCT_DEFINITION_SHAPE('',$,#592);
#590=SHAPE_REPRESENTATION('',(#368),#582);
#591=PRODUCT_DEFINITION_CONTEXT('part definition',#596,'design');
#592=PRODUCT_DEFINITION('Base','Base',#593,#591);
#593=PRODUCT_DEFINITION_FORMATION('',$,#598);
#594=PRODUCT_RELATED_PRODUCT_CATEGORY('Base','Base',(#598));
#595=APPLICATION_PROTOCOL_DEFINITION('international standard',
'automotive_design',2009,#596);
#596=APPLICATION_CONTEXT(
'Core Data for Automotive Mechanical Design Process');
#597=PRODUCT_CONTEXT('part definition',#596,'mechanical');
#598=PRODUCT('Base','Base',$,(#597));
#599=PRESENTATION_STYLE_ASSIGNMENT((#600));
#600=SURFACE_STYLE_USAGE(.BOTH.,#601);
#601=SURFACE_SIDE_STYLE('',(#602));
#602=SURFACE_STYLE_FILL_AREA(#603);
#603=FILL_AREA_STYLE('Steel - Satin',(#604));
#604=FILL_AREA_STYLE_COLOUR('Steel - Satin',#605);
#605=COLOUR_RGB('Steel - Satin',0.627450980392157,0.627450980392157,0.627450980392157);
ENDSEC;
END-ISO-10303-21;

3450
3D/Lid.step Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,15 +1,20 @@
menu "espScope Configuration" menu "espScope Configuration"
config LED_BUILTIN
int "LED IO Pin"
default 15
help
LED IO pin
config ESP_WIFI_SSID config ESP_WIFI_SSID
string "WiFi SSID" string "WiFi SSID"
default "myssid" default "myssid"
help help
SSID (network name) to connect to. Default SSID (network name) to connect to. You can change this onece connected via the web interface.
config ESP_WIFI_PASSWORD config ESP_WIFI_PASSWORD
string "WiFi Password" string "WiFi Password"
default "mypassword" default "mypassword"
help help
WiFi password. Default SSID password. You can change this onece connected via the web interface.
endmenu endmenu

View File

@@ -111,13 +111,14 @@
direction: rtl; direction: rtl;
} }
#resetBtn { #resetBtn, #powerOff {
background: #222; background: #222;
color: #e66; color: #e66;
border: 1px solid; border: 1px solid;
font-size: 0.8rem; font-size: 0.8rem;
height: 4em; height: 4em;
width: 6em; width: 6em;
vertical-align: middle;
} }
</style> </style>
</head> </head>
@@ -168,7 +169,10 @@
<input type="number" id="testHz" value="100" min="1" max="10000"> <input type="number" id="testHz" value="100" min="1" max="10000">
</div> </div>
</div> </div>
<div>
<button id="resetBtn">Reset</button> <button id="resetBtn">Reset</button>
<button id="powerOff">Power off</button>
</div>
</form> </form>
</div> </div>

View File

@@ -452,6 +452,9 @@ document.getElementById('resetBtn').addEventListener('click', () => {
localStorage.clear(); localStorage.clear();
window.location.reload(); window.location.reload();
}); });
document.getElementById('powerOff').addEventListener('click', () => {
navigator.sendBeacon("/poweroff");
});
setParams(); setParams();
connect(); connect();

View File

@@ -1,3 +1,9 @@
#include <inttypes.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include "cJSON.h" #include "cJSON.h"
#include "driver/gpio.h" #include "driver/gpio.h"
#include "driver/ledc.h" #include "driver/ledc.h"
@@ -5,20 +11,16 @@
#include "esp_event.h" #include "esp_event.h"
#include "esp_http_server.h" #include "esp_http_server.h"
#include "esp_log.h" #include "esp_log.h"
#include "esp_sleep.h"
#include "esp_system.h" #include "esp_system.h"
#include "esp_wifi.h" #include "esp_wifi.h"
#include "freertos/FreeRTOS.h" #include "freertos/FreeRTOS.h"
#include "freertos/event_groups.h" #include "freertos/event_groups.h"
#include "freertos/task.h" #include "freertos/task.h"
#include "nvs_flash.h" #include "nvs_flash.h"
#include <inttypes.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
// Tag for logging // Tag for logging
static const char *TAG = "ESP-SCOPE"; static const char* TAG = "ESP-SCOPE";
// WiFi configuration from Kconfig // WiFi configuration from Kconfig
/* See untracked wifi-credentials.h */ /* See untracked wifi-credentials.h */
@@ -65,7 +67,6 @@ static httpd_handle_t s_server = NULL;
static adc_continuous_handle_t adc_handle = NULL; static adc_continuous_handle_t adc_handle = NULL;
// Single client support for simplicity, or use a list for multiple // Single client support for simplicity, or use a list for multiple
static int s_ws_client_fd = -1; static int s_ws_client_fd = -1;
@@ -78,15 +79,15 @@ static uint16_t s_test_hz = 100;
// Forward declarations // Forward declarations
static void wifi_init_sta(void); static void wifi_init_sta(void);
static void continuous_adc_init(adc_channel_t *channel, uint8_t channel_num, static void continuous_adc_init(adc_channel_t* channel, uint8_t channel_num,
adc_continuous_handle_t *out_handle); adc_continuous_handle_t* out_handle);
static esp_err_t ws_handler(httpd_req_t *req); static esp_err_t ws_handler(httpd_req_t* req);
// Forward declarations // Forward declarations
static void wifi_init_sta(void); static void wifi_init_sta(void);
static void continuous_adc_init(adc_channel_t *channel, uint8_t channel_num, static void continuous_adc_init(adc_channel_t* channel, uint8_t channel_num,
adc_continuous_handle_t *out_handle); adc_continuous_handle_t* out_handle);
static esp_err_t ws_handler(httpd_req_t *req); static esp_err_t ws_handler(httpd_req_t* req);
// Helper to calculate optimal buffer size (approx 50ms latency, max 4096, aligned to 4) // Helper to calculate optimal buffer size (approx 50ms latency, max 4096, aligned to 4)
static uint32_t get_optimal_buffer_size(uint32_t sample_rate) { static uint32_t get_optimal_buffer_size(uint32_t sample_rate) {
@@ -104,14 +105,12 @@ static uint32_t get_optimal_buffer_size(uint32_t sample_rate) {
/* /*
* Task to read from ADC Continuous driver * Task to read from ADC Continuous driver
*/ */
static void adc_read_task(void *arg) { static void adc_read_task(void* arg) {
esp_err_t ret; esp_err_t ret;
uint32_t ret_num = 0; uint32_t ret_num = 0;
uint8_t result[ADC_READ_LEN] = {0}; uint8_t result[ADC_READ_LEN] = {0};
memset(result, 0xcc, ADC_READ_LEN); memset(result, 0xcc, ADC_READ_LEN);
// ADC Init (Moved from app_main) // ADC Init (Moved from app_main)
// TODO: Make this configurable or find a good default pin. // TODO: Make this configurable or find a good default pin.
// For ESP32C6 ADC1 Channel 0 is usually GPIO 0. Let's use Channel 0 for now. // For ESP32C6 ADC1 Channel 0 is usually GPIO 0. Let's use Channel 0 for now.
@@ -157,7 +156,6 @@ static void adc_read_task(void *arg) {
if (ret == ESP_OK) { if (ret == ESP_OK) {
// ESP_LOGI(TAG, "ret is %x, ret_num is %"PRIu32" bytes", ret, ret_num); // ESP_LOGI(TAG, "ret is %x, ret_num is %"PRIu32" bytes", ret, ret_num);
// OPTIMIZED BATCH SENDING // OPTIMIZED BATCH SENDING
// We have `ret_num` bytes of data in `result`. // We have `ret_num` bytes of data in `result`.
// It contains `adc_digi_output_data_t` structs (4 bytes each). // It contains `adc_digi_output_data_t` structs (4 bytes each).
@@ -166,7 +164,6 @@ static void adc_read_task(void *arg) {
// So we have 1/2 the size. // So we have 1/2 the size.
if (s_ws_client_fd != -1) { if (s_ws_client_fd != -1) {
// Allocate a small temp buffer on stack or static to avoid malloc in loop // Allocate a small temp buffer on stack or static to avoid malloc in loop
// ret_num is up to ADC_READ_LEN (1024). 1024 / 4 = 256 samples. // ret_num is up to ADC_READ_LEN (1024). 1024 / 4 = 256 samples.
// 256 * 2 bytes = 512 bytes output. Stack safe. // 256 * 2 bytes = 512 bytes output. Stack safe.
@@ -174,7 +171,7 @@ static void adc_read_task(void *arg) {
int out_idx = 0; int out_idx = 0;
for (int i = 0; i < ret_num; i += sizeof(adc_digi_output_data_t)) { for (int i = 0; i < ret_num; i += sizeof(adc_digi_output_data_t)) {
adc_digi_output_data_t *p = (adc_digi_output_data_t *)&result[i]; adc_digi_output_data_t* p = (adc_digi_output_data_t*)&result[i];
uint32_t val = ADC_GET_DATA(p); uint32_t val = ADC_GET_DATA(p);
out_buf[out_idx++] = (uint16_t)val; out_buf[out_idx++] = (uint16_t)val;
} }
@@ -184,9 +181,8 @@ static void adc_read_task(void *arg) {
.final = true, .final = true,
.fragmented = false, .fragmented = false,
.type = HTTPD_WS_TYPE_BINARY, .type = HTTPD_WS_TYPE_BINARY,
.payload = (uint8_t *)out_buf, .payload = (uint8_t*)out_buf,
.len = out_idx * sizeof(uint16_t) .len = out_idx * sizeof(uint16_t)};
};
// Non-blocking send (best effort) // Non-blocking send (best effort)
esp_err_t ret_ws = httpd_ws_send_frame_async(s_server, s_ws_client_fd, &ws_frame); esp_err_t ret_ws = httpd_ws_send_frame_async(s_server, s_ws_client_fd, &ws_frame);
@@ -213,11 +209,8 @@ static void adc_read_task(void *arg) {
} }
} }
static void continuous_adc_init(adc_channel_t* channel, uint8_t channel_num,
adc_continuous_handle_t* out_handle) {
static void continuous_adc_init(adc_channel_t *channel, uint8_t channel_num,
adc_continuous_handle_t *out_handle) {
uint32_t frame_size = get_optimal_buffer_size(s_sample_rate); uint32_t frame_size = get_optimal_buffer_size(s_sample_rate);
ESP_LOGI(TAG, "Dynamic Buffer Size: %lu bytes", frame_size); ESP_LOGI(TAG, "Dynamic Buffer Size: %lu bytes", frame_size);
@@ -275,16 +268,14 @@ static void start_test_signal(uint32_t hz) {
.duty_resolution = LEDC_TIMER_14_BIT, .duty_resolution = LEDC_TIMER_14_BIT,
.timer_num = LEDC_TIMER_0, .timer_num = LEDC_TIMER_0,
.freq_hz = hz, .freq_hz = hz,
.clk_cfg = LEDC_AUTO_CLK .clk_cfg = LEDC_AUTO_CLK};
};
ledc_channel_config_t ledc_channel = { ledc_channel_config_t ledc_channel = {
.gpio_num = 1, // GPIO data pin 1 .gpio_num = 1, // GPIO data pin 1
.speed_mode = LEDC_LOW_SPEED_MODE, .speed_mode = LEDC_LOW_SPEED_MODE,
.channel = LEDC_CHANNEL_0, .channel = LEDC_CHANNEL_0,
.timer_sel = LEDC_TIMER_0, .timer_sel = LEDC_TIMER_0,
.duty = 1 << (ledc_timer.duty_resolution - 1), // 512, // 50% duty cycle (1024 / 2 for 10-bit resolution) .duty = 1 << (ledc_timer.duty_resolution - 1), // 512, // 50% duty cycle (1024 / 2 for 10-bit resolution)
.hpoint = 0 .hpoint = 0};
};
// Initialize the PWM // Initialize the PWM
ledc_timer_config(&ledc_timer); ledc_timer_config(&ledc_timer);
@@ -295,6 +286,17 @@ static void start_test_signal(uint32_t hz) {
ledc_inited = true; ledc_inited = true;
} }
static void show_status_led() {
#ifdef CONFIG_LED_BUILTIN
while (true) {
vTaskDelay(pdMS_TO_TICKS(100));
gpio_set_level(CONFIG_LED_BUILTIN, 1);
vTaskDelay(pdMS_TO_TICKS(s_ws_client_fd == -1 ? 900 : 200));
gpio_set_level(CONFIG_LED_BUILTIN, 0);
}
#endif
}
void app_main(void) { void app_main(void) {
// Initialize NVS // Initialize NVS
esp_err_t ret = nvs_flash_init(); esp_err_t ret = nvs_flash_init();
@@ -305,17 +307,27 @@ void app_main(void) {
} }
ESP_ERROR_CHECK(ret); ESP_ERROR_CHECK(ret);
#ifdef CONFIG_LED_BUILTIN
gpio_config_t led_io_conf = {
.pin_bit_mask = (1ULL << CONFIG_LED_BUILTIN),
.mode = GPIO_MODE_OUTPUT,
.pull_up_en = GPIO_PULLUP_DISABLE,
.pull_down_en = GPIO_PULLDOWN_DISABLE,
.intr_type = GPIO_INTR_DISABLE};
gpio_config(&led_io_conf);
gpio_set_level(CONFIG_LED_BUILTIN, 0);
#endif
ESP_LOGI(TAG, "ESP_WIFI_MODE_STA"); ESP_LOGI(TAG, "ESP_WIFI_MODE_STA");
/* Board-specific WiFi init (if any) */ /* Board-specific WiFi init (if any) */
// Seeed XIAO ESP32C6: Configure GPIO 3 and GPIO 14 as outputs // Seeed XIAO ESP32C6: Configure GPIO 3 and GPIO 14 as outputs
gpio_config_t io_conf = { gpio_config_t board_io_conf = {
.pin_bit_mask = (1ULL << 3) | (1ULL << 14), .pin_bit_mask = (1ULL << 3) | (1ULL << 14),
.mode = GPIO_MODE_OUTPUT, .mode = GPIO_MODE_OUTPUT,
.pull_up_en = GPIO_PULLUP_DISABLE, .pull_up_en = GPIO_PULLUP_DISABLE,
.pull_down_en = GPIO_PULLDOWN_DISABLE, .pull_down_en = GPIO_PULLDOWN_DISABLE,
.intr_type = GPIO_INTR_DISABLE .intr_type = GPIO_INTR_DISABLE};
}; gpio_config(&board_io_conf);
gpio_config(&io_conf);
// Set GPIO 3 and GPIO 14 to low // Set GPIO 3 and GPIO 14 to low
gpio_set_level(3, 0); gpio_set_level(3, 0);
@@ -323,10 +335,7 @@ void app_main(void) {
/* end board-specific WiFi init (if any) */ /* end board-specific WiFi init (if any) */
wifi_init_sta(); wifi_init_sta();
start_test_signal(100); start_test_signal(100);
xTaskCreate(adc_read_task, "adc_read_task", 8192 + ADC_READ_LEN, NULL, 5, NULL); xTaskCreate(adc_read_task, "adc_read_task", 8192 + ADC_READ_LEN, NULL, 5, NULL);
// Wait for WiFi connection // Wait for WiFi connection
@@ -337,6 +346,7 @@ void app_main(void) {
if (bits & WIFI_CONNECTED_BIT) { if (bits & WIFI_CONNECTED_BIT) {
ESP_LOGI(TAG, "connected to ap SSID:%s", ESP_WIFI_SSID); ESP_LOGI(TAG, "connected to ap SSID:%s", ESP_WIFI_SSID);
start_webserver(); start_webserver();
show_status_led();
} else if (bits & WIFI_FAIL_BIT) { } else if (bits & WIFI_FAIL_BIT) {
ESP_LOGI(TAG, "Failed to connect to SSID:%s", ESP_WIFI_SSID); ESP_LOGI(TAG, "Failed to connect to SSID:%s", ESP_WIFI_SSID);
} else { } else {
@@ -344,8 +354,8 @@ void app_main(void) {
} }
} }
static void event_handler(void *arg, esp_event_base_t event_base, static void event_handler(void* arg, esp_event_base_t event_base,
int32_t event_id, void *event_data) { int32_t event_id, void* event_data) {
if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) { if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
esp_wifi_connect(); esp_wifi_connect();
} else if (event_base == WIFI_EVENT && } else if (event_base == WIFI_EVENT &&
@@ -359,7 +369,7 @@ static void event_handler(void *arg, esp_event_base_t event_base,
} }
ESP_LOGI(TAG, "connect to the AP fail"); ESP_LOGI(TAG, "connect to the AP fail");
} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) { } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
ip_event_got_ip_t *event = (ip_event_got_ip_t *)event_data; ip_event_got_ip_t* event = (ip_event_got_ip_t*)event_data;
ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip)); ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip));
s_retry_num = 0; s_retry_num = 0;
xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT); xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);
@@ -401,19 +411,17 @@ static void wifi_init_sta(void) {
ESP_LOGI(TAG, "wifi_init_sta finished."); ESP_LOGI(TAG, "wifi_init_sta finished.");
} }
/* /*
* WebSocket Handler * WebSocket Handler
*/ */
static esp_err_t ws_handler(httpd_req_t *req) { static esp_err_t ws_handler(httpd_req_t* req) {
if (req->method == HTTP_GET) { if (req->method == HTTP_GET) {
// Handshake // Handshake
return ESP_OK; return ESP_OK;
} }
httpd_ws_frame_t ws_pkt; httpd_ws_frame_t ws_pkt;
uint8_t *buf = NULL; uint8_t* buf = NULL;
memset(&ws_pkt, 0, sizeof(httpd_ws_frame_t)); memset(&ws_pkt, 0, sizeof(httpd_ws_frame_t));
ws_pkt.type = HTTPD_WS_TYPE_TEXT; ws_pkt.type = HTTPD_WS_TYPE_TEXT;
@@ -435,7 +443,7 @@ static esp_err_t ws_handler(httpd_req_t *req) {
// Check for "hello" // Check for "hello"
if (ws_pkt.type == HTTPD_WS_TYPE_TEXT && if (ws_pkt.type == HTTPD_WS_TYPE_TEXT &&
strcmp((char *)ws_pkt.payload, "hello") == 0) { strcmp((char*)ws_pkt.payload, "hello") == 0) {
ESP_LOGI(TAG, "New WS client connected, fd=%d", httpd_req_to_sockfd(req)); ESP_LOGI(TAG, "New WS client connected, fd=%d", httpd_req_to_sockfd(req));
s_ws_client_fd = httpd_req_to_sockfd(req); s_ws_client_fd = httpd_req_to_sockfd(req);
} }
@@ -447,7 +455,7 @@ static esp_err_t ws_handler(httpd_req_t *req) {
/* /*
* Control Params Handler (POST /params) * Control Params Handler (POST /params)
*/ */
static esp_err_t params_handler(httpd_req_t *req) { static esp_err_t params_handler(httpd_req_t* req) {
char buf[256]; char buf[256];
int ret, remaining = req->content_len; int ret, remaining = req->content_len;
if (remaining >= sizeof(buf)) { if (remaining >= sizeof(buf)) {
@@ -460,24 +468,24 @@ static esp_err_t params_handler(httpd_req_t *req) {
return ESP_FAIL; return ESP_FAIL;
buf[ret] = '\0'; buf[ret] = '\0';
cJSON *root = cJSON_Parse(buf); cJSON* root = cJSON_Parse(buf);
if (root) { if (root) {
cJSON *sample_rate = cJSON_GetObjectItem(root, "sample_rate"); cJSON* sample_rate = cJSON_GetObjectItem(root, "sample_rate");
if (sample_rate && s_sample_rate != sample_rate->valueint) { if (sample_rate && s_sample_rate != sample_rate->valueint) {
s_reconfig_needed = true; s_reconfig_needed = true;
s_sample_rate = sample_rate->valueint; s_sample_rate = sample_rate->valueint;
} }
cJSON *atten = cJSON_GetObjectItem(root, "atten"); cJSON* atten = cJSON_GetObjectItem(root, "atten");
if (atten && s_atten != (adc_atten_t)atten->valueint) { if (atten && s_atten != (adc_atten_t)atten->valueint) {
s_reconfig_needed = true; s_reconfig_needed = true;
s_atten = (adc_atten_t)atten->valueint; s_atten = (adc_atten_t)atten->valueint;
} }
cJSON *bit_width = cJSON_GetObjectItem(root, "bit_width"); cJSON* bit_width = cJSON_GetObjectItem(root, "bit_width");
if (bit_width && s_bit_width != (adc_bitwidth_t)bit_width->valueint) { if (bit_width && s_bit_width != (adc_bitwidth_t)bit_width->valueint) {
s_reconfig_needed = true; s_reconfig_needed = true;
s_bit_width = (adc_bitwidth_t)bit_width->valueint; s_bit_width = (adc_bitwidth_t)bit_width->valueint;
} }
cJSON *test_hz = cJSON_GetObjectItem(root, "test_hz"); cJSON* test_hz = cJSON_GetObjectItem(root, "test_hz");
if (test_hz) { if (test_hz) {
if (s_test_hz != (adc_bitwidth_t)test_hz->valueint) { if (s_test_hz != (adc_bitwidth_t)test_hz->valueint) {
s_test_hz = (adc_bitwidth_t)test_hz->valueint; s_test_hz = (adc_bitwidth_t)test_hz->valueint;
@@ -507,16 +515,14 @@ static const httpd_uri_t uri_params = {.uri = "/params",
.handler = params_handler, .handler = params_handler,
.user_ctx = NULL}; .user_ctx = NULL};
/* Handler for serving index.html */ /* Handler for serving index.html */
static esp_err_t index_handler(httpd_req_t *req) { static esp_err_t index_handler(httpd_req_t* req) {
httpd_resp_set_type(req, "text/html"); httpd_resp_set_type(req, "text/html");
httpd_resp_set_hdr(req, "Content-Type", "text/html; charset=utf-8"); httpd_resp_set_hdr(req, "Content-Type", "text/html; charset=utf-8");
uint32_t len = index_html_end - index_html_start; uint32_t len = index_html_end - index_html_start;
// Workaround for some build systems adding null byte // Workaround for some build systems adding null byte
while (len && index_js_start[len-1] == 0) len--; while (len && index_js_start[len - 1] == 0) len--;
httpd_resp_send(req, (const char *)index_html_start, len); httpd_resp_send(req, (const char*)index_html_start, len);
return ESP_OK; return ESP_OK;
} }
@@ -524,19 +530,32 @@ static const httpd_uri_t uri_index = {
.uri = "/", .method = HTTP_GET, .handler = index_handler, .user_ctx = NULL}; .uri = "/", .method = HTTP_GET, .handler = index_handler, .user_ctx = NULL};
/* Handler for serving index.js */ /* Handler for serving index.js */
static esp_err_t index_js_handler(httpd_req_t *req) { static esp_err_t index_js_handler(httpd_req_t* req) {
httpd_resp_set_type(req, "text/javascript"); httpd_resp_set_type(req, "text/javascript");
httpd_resp_set_hdr(req, "Content-Type", "text/javascript; charset=utf-8"); httpd_resp_set_hdr(req, "Content-Type", "text/javascript; charset=utf-8");
uint32_t len = index_js_end - index_js_start; uint32_t len = index_js_end - index_js_start;
// Workaround for some build systems adding null byte // Workaround for some build systems adding null byte
while (len && index_js_start[len-1] == 0) len--; while (len && index_js_start[len - 1] == 0) len--;
httpd_resp_send(req, (const char *)index_js_start, len); httpd_resp_send(req, (const char*)index_js_start, len);
return ESP_OK; return ESP_OK;
} }
static const httpd_uri_t uri_index_js = { static const httpd_uri_t uri_index_js = {
.uri = "/index.js", .method = HTTP_GET, .handler = index_js_handler, .user_ctx = NULL}; .uri = "/index.js", .method = HTTP_GET, .handler = index_js_handler, .user_ctx = NULL};
static esp_err_t power_handler(httpd_req_t* req) {
#ifdef CONFIG_LED_BUILTIN
gpio_set_level(CONFIG_LED_BUILTIN, 0);
#endif
esp_sleep_enable_timer_wakeup(30L * 24L * 60L * 60L * 1000000ULL); // One month
esp_deep_sleep_start();
return ESP_OK;
}
static const httpd_uri_t uri_power = {
.uri = "/poweroff", .method = HTTP_POST, .handler = power_handler, .user_ctx = NULL};
static void start_webserver(void) { static void start_webserver(void) {
httpd_config_t config = HTTPD_DEFAULT_CONFIG(); httpd_config_t config = HTTPD_DEFAULT_CONFIG();
config.lru_purge_enable = true; config.lru_purge_enable = true;
@@ -548,9 +567,7 @@ static void start_webserver(void) {
httpd_register_uri_handler(s_server, &uri_index_js); httpd_register_uri_handler(s_server, &uri_index_js);
httpd_register_uri_handler(s_server, &uri_ws); httpd_register_uri_handler(s_server, &uri_ws);
httpd_register_uri_handler(s_server, &uri_params); httpd_register_uri_handler(s_server, &uri_params);
httpd_register_uri_handler(s_server, &uri_power);
} else { } else {
ESP_LOGI(TAG, "Error starting server!"); ESP_LOGI(TAG, "Error starting server!");
} }