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"
config LED_BUILTIN
int "LED IO Pin"
default 15
help
LED IO pin
config ESP_WIFI_SSID
string "WiFi SSID"
default "myssid"
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
string "WiFi Password"
default "mypassword"
help
WiFi password.
Default SSID password. You can change this onece connected via the web interface.
endmenu

View File

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

View File

@@ -452,6 +452,9 @@ document.getElementById('resetBtn').addEventListener('click', () => {
localStorage.clear();
window.location.reload();
});
document.getElementById('powerOff').addEventListener('click', () => {
navigator.sendBeacon("/poweroff");
});
setParams();
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 "driver/gpio.h"
#include "driver/ledc.h"
@@ -5,20 +11,16 @@
#include "esp_event.h"
#include "esp_http_server.h"
#include "esp_log.h"
#include "esp_sleep.h"
#include "esp_system.h"
#include "esp_wifi.h"
#include "freertos/FreeRTOS.h"
#include "freertos/event_groups.h"
#include "freertos/task.h"
#include "nvs_flash.h"
#include <inttypes.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
// Tag for logging
static const char *TAG = "ESP-SCOPE";
static const char* TAG = "ESP-SCOPE";
// WiFi configuration from Kconfig
/* See untracked wifi-credentials.h */
@@ -65,7 +67,6 @@ static httpd_handle_t s_server = NULL;
static adc_continuous_handle_t adc_handle = NULL;
// Single client support for simplicity, or use a list for multiple
static int s_ws_client_fd = -1;
@@ -78,15 +79,15 @@ static uint16_t s_test_hz = 100;
// Forward declarations
static void wifi_init_sta(void);
static void continuous_adc_init(adc_channel_t *channel, uint8_t channel_num,
adc_continuous_handle_t *out_handle);
static esp_err_t ws_handler(httpd_req_t *req);
static void continuous_adc_init(adc_channel_t* channel, uint8_t channel_num,
adc_continuous_handle_t* out_handle);
static esp_err_t ws_handler(httpd_req_t* req);
// Forward declarations
static void wifi_init_sta(void);
static void continuous_adc_init(adc_channel_t *channel, uint8_t channel_num,
adc_continuous_handle_t *out_handle);
static esp_err_t ws_handler(httpd_req_t *req);
static void continuous_adc_init(adc_channel_t* channel, uint8_t channel_num,
adc_continuous_handle_t* out_handle);
static esp_err_t ws_handler(httpd_req_t* req);
// 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) {
@@ -104,14 +105,12 @@ static uint32_t get_optimal_buffer_size(uint32_t sample_rate) {
/*
* 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;
uint32_t ret_num = 0;
uint8_t result[ADC_READ_LEN] = {0};
memset(result, 0xcc, ADC_READ_LEN);
// ADC Init (Moved from app_main)
// 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.
@@ -157,7 +156,6 @@ static void adc_read_task(void *arg) {
if (ret == ESP_OK) {
// ESP_LOGI(TAG, "ret is %x, ret_num is %"PRIu32" bytes", ret, ret_num);
// OPTIMIZED BATCH SENDING
// We have `ret_num` bytes of data in `result`.
// 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.
if (s_ws_client_fd != -1) {
// 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.
// 256 * 2 bytes = 512 bytes output. Stack safe.
@@ -174,7 +171,7 @@ static void adc_read_task(void *arg) {
int out_idx = 0;
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);
out_buf[out_idx++] = (uint16_t)val;
}
@@ -184,9 +181,8 @@ static void adc_read_task(void *arg) {
.final = true,
.fragmented = false,
.type = HTTPD_WS_TYPE_BINARY,
.payload = (uint8_t *)out_buf,
.len = out_idx * sizeof(uint16_t)
};
.payload = (uint8_t*)out_buf,
.len = out_idx * sizeof(uint16_t)};
// Non-blocking send (best effort)
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);
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,
.timer_num = LEDC_TIMER_0,
.freq_hz = hz,
.clk_cfg = LEDC_AUTO_CLK
};
.clk_cfg = LEDC_AUTO_CLK};
ledc_channel_config_t ledc_channel = {
.gpio_num = 1, // GPIO data pin 1
.speed_mode = LEDC_LOW_SPEED_MODE,
.channel = LEDC_CHANNEL_0,
.timer_sel = LEDC_TIMER_0,
.duty = 1 << (ledc_timer.duty_resolution - 1), // 512, // 50% duty cycle (1024 / 2 for 10-bit resolution)
.hpoint = 0
};
.hpoint = 0};
// Initialize the PWM
ledc_timer_config(&ledc_timer);
@@ -295,6 +286,17 @@ static void start_test_signal(uint32_t hz) {
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) {
// Initialize NVS
esp_err_t ret = nvs_flash_init();
@@ -305,17 +307,27 @@ void app_main(void) {
}
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");
/* Board-specific WiFi init (if any) */
// 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),
.mode = GPIO_MODE_OUTPUT,
.pull_up_en = GPIO_PULLUP_DISABLE,
.pull_down_en = GPIO_PULLDOWN_DISABLE,
.intr_type = GPIO_INTR_DISABLE
};
gpio_config(&io_conf);
.intr_type = GPIO_INTR_DISABLE};
gpio_config(&board_io_conf);
// Set GPIO 3 and GPIO 14 to low
gpio_set_level(3, 0);
@@ -323,10 +335,7 @@ void app_main(void) {
/* end board-specific WiFi init (if any) */
wifi_init_sta();
start_test_signal(100);
xTaskCreate(adc_read_task, "adc_read_task", 8192 + ADC_READ_LEN, NULL, 5, NULL);
// Wait for WiFi connection
@@ -337,6 +346,7 @@ void app_main(void) {
if (bits & WIFI_CONNECTED_BIT) {
ESP_LOGI(TAG, "connected to ap SSID:%s", ESP_WIFI_SSID);
start_webserver();
show_status_led();
} else if (bits & WIFI_FAIL_BIT) {
ESP_LOGI(TAG, "Failed to connect to SSID:%s", ESP_WIFI_SSID);
} else {
@@ -344,8 +354,8 @@ void app_main(void) {
}
}
static void event_handler(void *arg, esp_event_base_t event_base,
int32_t event_id, void *event_data) {
static void event_handler(void* arg, esp_event_base_t event_base,
int32_t event_id, void* event_data) {
if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
esp_wifi_connect();
} 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");
} 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));
s_retry_num = 0;
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.");
}
/*
* 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) {
// Handshake
return ESP_OK;
}
httpd_ws_frame_t ws_pkt;
uint8_t *buf = NULL;
uint8_t* buf = NULL;
memset(&ws_pkt, 0, sizeof(httpd_ws_frame_t));
ws_pkt.type = HTTPD_WS_TYPE_TEXT;
@@ -435,7 +443,7 @@ static esp_err_t ws_handler(httpd_req_t *req) {
// Check for "hello"
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));
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)
*/
static esp_err_t params_handler(httpd_req_t *req) {
static esp_err_t params_handler(httpd_req_t* req) {
char buf[256];
int ret, remaining = req->content_len;
if (remaining >= sizeof(buf)) {
@@ -460,24 +468,24 @@ static esp_err_t params_handler(httpd_req_t *req) {
return ESP_FAIL;
buf[ret] = '\0';
cJSON *root = cJSON_Parse(buf);
cJSON* root = cJSON_Parse(buf);
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) {
s_reconfig_needed = true;
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) {
s_reconfig_needed = true;
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) {
s_reconfig_needed = true;
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 (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,
.user_ctx = NULL};
/* 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_hdr(req, "Content-Type", "text/html; charset=utf-8");
uint32_t len = index_html_end - index_html_start;
// Workaround for some build systems adding null byte
while (len && index_js_start[len-1] == 0) len--;
httpd_resp_send(req, (const char *)index_html_start, len);
while (len && index_js_start[len - 1] == 0) len--;
httpd_resp_send(req, (const char*)index_html_start, len);
return ESP_OK;
}
@@ -524,19 +530,32 @@ static const httpd_uri_t uri_index = {
.uri = "/", .method = HTTP_GET, .handler = index_handler, .user_ctx = NULL};
/* 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_hdr(req, "Content-Type", "text/javascript; charset=utf-8");
uint32_t len = index_js_end - index_js_start;
// Workaround for some build systems adding null byte
while (len && index_js_start[len-1] == 0) len--;
httpd_resp_send(req, (const char *)index_js_start, len);
while (len && index_js_start[len - 1] == 0) len--;
httpd_resp_send(req, (const char*)index_js_start, len);
return ESP_OK;
}
static const httpd_uri_t uri_index_js = {
.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) {
httpd_config_t config = HTTPD_DEFAULT_CONFIG();
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_ws);
httpd_register_uri_handler(s_server, &uri_params);
httpd_register_uri_handler(s_server, &uri_power);
} else {
ESP_LOGI(TAG, "Error starting server!");
}