[{"data":1,"prerenderedAt":1190},["ShallowReactive",2],{"manifest":3,"hreflang-alternates":901,"doc-pl-bloki-logiczne\u002Fprocess\u002Fmotor_axis":904},{"site":4,"branding":6,"contact":8,"organization_schema":10,"languages":54,"website":62,"docs":187,"blog":867},{"title":5},"Voldeno",{"logo":7,"company_name":5},"\u002Fimages\u002Flogo\u002Flogo_310.png",{"email":9},"contact@voldeno.com",{"schema_name":5,"legal_name":11,"founding_date":12,"tax_id":13,"identifiers":14,"address":21,"primary_email":9,"knows_about":26,"contact_points":39,"contact_point_available_languages":51},"Voldeno sp. z o.o.","2024","PL7252346262",[15,18],{"name":16,"value":17},"KRS","0001123648",{"name":19,"value":20},"REGON","52946949200000",{"street_address":22,"address_locality":23,"postal_code":24,"address_country":25},"Ogrodowa 8, Lobby B, 3p.","Łódź","91-062","PL",{"en":27,"pl":34},[28,29,30,31,32,33],"Smart Home","Smart Home Systems","Smart Home Automation","Building Automation","IoT","Home Automation System",[35,28,36,37,32,38],"Inteligentny dom","System Smart Home","Automatyka budynkowa","System automatyki domowej",[40,43,46,49],{"email":41,"contact_type":42},"support@voldeno.com","technical support",{"email":44,"contact_type":45},"sales@voldeno.com","sales",{"email":47,"contact_type":48},"partners@voldeno.com","partnerships",{"email":9,"contact_type":50},"customer service",[52,53],"Polish","English",[55,59],{"code":56,"name":57,"default":58},"pl","Polski",true,{"code":60,"name":53,"default":61},"en",false,{"enabled":58,"navigation":63,"path_keys":158,"section_index_slugs":180},{"en":64,"pl":117},[65,71,77,82,91,96,101,112],{"title":66,"slug":67,"path":68,"order":69,"template":70},"Voldeno: Smart Home, Building Automation","index","en\u002Findex",0,"home",{"title":72,"slug":73,"path":74,"order":75,"template":76},"Your Home","your-home","en\u002Fyour-home",1,"homeowners",{"title":78,"slug":79,"path":80,"order":81,"template":79},"For Professionals","professionals","en\u002Fprofessionals",2,{"title":83,"slug":84,"path":85,"order":86,"children":87},"Products","products","en\u002Fproducts",3,[88],{"title":89,"slug":67,"path":90,"order":75,"template":84},"Smart Home Products​ from Voldeno","en\u002Fproducts\u002Findex",{"title":92,"slug":93,"path":94,"order":95,"template":93},"Contact","contact","en\u002Fcontact",4,{"title":97,"slug":98,"path":99,"order":100,"template":98},"About Us","about","en\u002Fabout",5,{"title":102,"slug":103,"path":104,"order":105,"children":106},"Legal","legal","en\u002Flegal",6,[107],{"title":108,"slug":109,"path":110,"order":75,"template":111},"Privacy Policy","privacy-policy","en\u002Flegal\u002Fprivacy-policy","page",{"title":113,"slug":114,"path":115,"order":116},"Projects","projects","en\u002Fprojects",999,[118,121,125,129,137,141,145,154],{"title":119,"slug":67,"path":120,"order":69,"template":70},"Smart Home, Automatyka budynkowa - Voldeno","pl\u002Findex",{"title":122,"slug":123,"path":124,"order":75,"template":76},"Twój Dom","twoj-dom","pl\u002Ftwoj-dom",{"title":126,"slug":127,"path":128,"order":81,"template":79},"Dla Profesjonalistów","dla-profesjonalistow","pl\u002Fdla-profesjonalistow",{"title":130,"slug":131,"path":132,"order":86,"children":133},"Produkty","produkty","pl\u002Fprodukty",[134],{"title":135,"slug":67,"path":136,"order":75,"template":84},"Inteligentne produkty​ Smart Home Voldeno","pl\u002Fprodukty\u002Findex",{"title":138,"slug":139,"path":140,"order":95,"template":93},"Kontakt","kontakt","pl\u002Fkontakt",{"title":142,"slug":143,"path":144,"order":100,"template":98},"O nas","o-nas","pl\u002Fo-nas",{"title":146,"slug":147,"path":148,"order":105,"children":149},"Prawne","prawne","pl\u002Fprawne",[150],{"title":151,"slug":152,"path":153,"order":75,"template":111},"Polityka prywatności","polityka-prywatnosci","pl\u002Fprawne\u002Fpolityka-prywatnosci",{"title":155,"slug":156,"path":157,"order":116},"Realizacje","realizacje","pl\u002Frealizacje",{"module_hub":159,"module_analog_input":162,"module_io":165,"privacy":168,"module_relay":171,"downloads":174,"module_1wire":177},{"pl":160,"en":161},"produkty\u002Fhub","products\u002Fhub",{"pl":163,"en":164},"produkty\u002Fanalog-input","products\u002Fanalog-input",{"en":166,"pl":167},"products\u002Fio","produkty\u002Fio",{"pl":169,"en":170},"prawne\u002Fpolityka-prywatnosci","legal\u002Fprivacy-policy",{"en":172,"pl":173},"products\u002Frelay","produkty\u002Frelay",{"pl":175,"en":176},"pobieranie","downloads",{"en":178,"pl":179},"products\u002F1wire","produkty\u002F1wire",{"pl":181,"en":184},{"produkty":182,"realizacje":183},"produkty\u002Findex","realizacje\u002Findex",{"projects":185,"products":186},"projects\u002Findex","products\u002Findex",{"enabled":58,"navigation":188,"section_redirects":842},{"pl":189,"en":610},[190,203,228,241,558,572,585,595,605],{"title":191,"slug":192,"path":193,"order":75,"children":194},"Pierwsze kroki","pierwsze-kroki","pl\u002Fdocs\u002Fpierwsze-kroki",[195,199],{"title":196,"slug":197,"path":198,"order":75},"Podstawowe pojęcia i terminologia","pojecia","pl\u002Fdocs\u002Fpierwsze-kroki\u002Fpojecia",{"title":200,"slug":201,"path":202,"order":81},"Przegląd systemu dla instalatorów","przeglad-systemu","pl\u002Fdocs\u002Fpierwsze-kroki\u002Fprzeglad-systemu",{"title":204,"slug":205,"path":206,"order":81,"children":207},"Moduły i peryferia","moduly","pl\u002Fdocs\u002Fmoduly",[208,212,216,220,224],{"title":209,"slug":210,"path":211,"order":75},"Okablowanie modułu HUB","okablowanie-hub","pl\u002Fdocs\u002Fmoduly\u002Fokablowanie-hub",{"title":213,"slug":214,"path":215,"order":81},"Okablowanie modułu I\u002FO","okablowanie-io","pl\u002Fdocs\u002Fmoduly\u002Fokablowanie-io",{"title":217,"slug":218,"path":219,"order":86},"Okablowanie modułu RELAY","okablowanie-relay","pl\u002Fdocs\u002Fmoduly\u002Fokablowanie-relay",{"title":221,"slug":222,"path":223,"order":95},"Okablowanie modułu 1-Wire","okablowanie-1wire","pl\u002Fdocs\u002Fmoduly\u002Fokablowanie-1wire",{"title":225,"slug":226,"path":227,"order":100},"Okablowanie modułu Analog Input","okablowanie-analog-input","pl\u002Fdocs\u002Fmoduly\u002Fokablowanie-analog-input",{"title":229,"slug":230,"path":231,"order":86,"children":232},"Wytyczne okablowania","okablowanie","pl\u002Fdocs\u002Fokablowanie",[233,237],{"title":234,"slug":235,"path":236,"order":75},"Topologia i okablowanie magistrali","topologia-magistrali","pl\u002Fdocs\u002Fokablowanie\u002Ftopologia-magistrali",{"title":238,"slug":239,"path":240,"order":81},"Dobór i dystrybucja zasilania","zasilanie","pl\u002Fdocs\u002Fokablowanie\u002Fzasilanie",{"title":242,"slug":243,"path":244,"order":95,"children":245},"Bloki logiczne","bloki-logiczne","pl\u002Fdocs\u002Fbloki-logiczne",[246,252,303,543],{"title":247,"slug":248,"path":249,"order":69,"template":250,"translation_key":251},"Przegląd","przeglad","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprzeglad","logic-block-index","logic-blocks-overview",{"title":253,"slug":254,"path":255,"order":75,"children":256},"Wejścia","input","pl\u002Fdocs\u002Fbloki-logiczne\u002Finput",[257,263,268,273,278,283,288,293,298],{"title":258,"slug":259,"path":260,"order":69,"template":261,"translation_key":262},"Binary input","binary_input","pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fbinary_input","logic-block","logic-block-binary_input",{"title":264,"slug":265,"path":266,"order":69,"template":261,"translation_key":267},"Boolean constant","boolean_constant","pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fboolean_constant","logic-block-boolean_constant",{"title":269,"slug":270,"path":271,"order":69,"template":261,"translation_key":272},"Numeric constant","numeric_constant","pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fnumeric_constant","logic-block-numeric_constant",{"title":274,"slug":275,"path":276,"order":69,"template":261,"translation_key":277},"Numeric input","numeric_input","pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fnumeric_input","logic-block-numeric_input",{"title":279,"slug":280,"path":281,"order":69,"template":261,"translation_key":282},"Mode monitor","operation_mode_monitor","pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Foperation_mode_monitor","logic-block-operation_mode_monitor",{"title":284,"slug":285,"path":286,"order":69,"template":261,"translation_key":287},"PulseAt","pulse_at","pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fpulse_at","logic-block-pulse_at",{"title":289,"slug":290,"path":291,"order":69,"template":261,"translation_key":292},"Schedule","schedule","pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fschedule","logic-block-schedule",{"title":294,"slug":295,"path":296,"order":69,"template":261,"translation_key":297},"String constant","string_constant","pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fstring_constant","logic-block-string_constant",{"title":299,"slug":300,"path":301,"order":69,"template":261,"translation_key":302},"Switch","switch","pl\u002Fdocs\u002Fbloki-logiczne\u002Finput\u002Fswitch","logic-block-switch",{"title":304,"slug":305,"path":306,"order":81,"children":307},"Przetwarzanie","process","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess",[308,313,318,323,328,333,338,343,348,353,358,363,368,373,378,383,388,393,398,403,408,413,418,423,428,433,438,443,448,453,458,463,468,473,478,483,488,493,498,503,508,513,518,523,528,533,538],{"title":309,"slug":310,"path":311,"order":69,"template":261,"translation_key":312},"Binary limiter","binary_limiter","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fbinary_limiter","logic-block-binary_limiter",{"title":314,"slug":315,"path":316,"order":69,"template":261,"translation_key":317},"Boolean to string","boolean_to_string","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fboolean_to_string","logic-block-boolean_to_string",{"title":319,"slug":320,"path":321,"order":69,"template":261,"translation_key":322},"Climate regulator","climate_regulator","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fclimate_regulator","logic-block-climate_regulator",{"title":324,"slug":325,"path":326,"order":69,"template":261,"translation_key":327},"Climate regulator hub","climate_regulator_hub","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fclimate_regulator_hub","logic-block-climate_regulator_hub",{"title":329,"slug":330,"path":331,"order":69,"template":261,"translation_key":332},"Delay","delay","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fdelay","logic-block-delay",{"title":334,"slug":335,"path":336,"order":69,"template":261,"translation_key":337},"Delayed Pulse","delayed_pulse","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fdelayed_pulse","logic-block-delayed_pulse",{"title":339,"slug":340,"path":341,"order":69,"template":261,"translation_key":342},"Door, window","door_window_monitor","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fdoor_window_monitor","logic-block-door_window_monitor",{"title":344,"slug":345,"path":346,"order":69,"template":261,"translation_key":347},"Edge detector","edge_detector","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fedge_detector","logic-block-edge_detector",{"title":349,"slug":350,"path":351,"order":69,"template":261,"translation_key":352},"HTTP Request","http_request","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fhttp_request","logic-block-http_request",{"title":354,"slug":355,"path":356,"order":69,"template":261,"translation_key":357},"Hysteresis","hysteresis","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fhysteresis","logic-block-hysteresis",{"title":359,"slug":360,"path":361,"order":69,"template":261,"translation_key":362},"Irrigation","irrigation","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Firrigation","logic-block-irrigation",{"title":364,"slug":365,"path":366,"order":69,"template":261,"translation_key":367},"JSON Get Boolean","json_get_boolean","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fjson_get_boolean","logic-block-json_get_boolean",{"title":369,"slug":370,"path":371,"order":69,"template":261,"translation_key":372},"JSON Get Number","json_get_number","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fjson_get_number","logic-block-json_get_number",{"title":374,"slug":375,"path":376,"order":69,"template":261,"translation_key":377},"JSON Get String","json_get_string","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fjson_get_string","logic-block-json_get_string",{"title":379,"slug":380,"path":381,"order":69,"template":261,"translation_key":382},"Level to pulse","level_to_pulse","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Flevel_to_pulse","logic-block-level_to_pulse",{"title":384,"slug":385,"path":386,"order":69,"template":261,"translation_key":387},"Logic::And","logic_and","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Flogic_and","logic-block-logic_and",{"title":389,"slug":390,"path":391,"order":69,"template":261,"translation_key":392},"Logic::Not","logic_not","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Flogic_not","logic-block-logic_not",{"title":394,"slug":395,"path":396,"order":69,"template":261,"translation_key":397},"Logic::Or","logic_or","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Flogic_or","logic-block-logic_or",{"title":399,"slug":400,"path":401,"order":69,"template":261,"translation_key":402},"Math::Abs","math_abs","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_abs","logic-block-math_abs",{"title":404,"slug":405,"path":406,"order":69,"template":261,"translation_key":407},"Math::Add","math_add","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_add","logic-block-math_add",{"title":409,"slug":410,"path":411,"order":69,"template":261,"translation_key":412},"Math::Average","math_average","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_average","logic-block-math_average",{"title":414,"slug":415,"path":416,"order":69,"template":261,"translation_key":417},"Math::Ceil","math_ceil","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_ceil","logic-block-math_ceil",{"title":419,"slug":420,"path":421,"order":69,"template":261,"translation_key":422},"Math::Divide","math_divide","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_divide","logic-block-math_divide",{"title":424,"slug":425,"path":426,"order":69,"template":261,"translation_key":427},"Math::Floor","math_floor","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_floor","logic-block-math_floor",{"title":429,"slug":430,"path":431,"order":69,"template":261,"translation_key":432},"Math::Max","math_max","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_max","logic-block-math_max",{"title":434,"slug":435,"path":436,"order":69,"template":261,"translation_key":437},"Math::Min","math_min","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_min","logic-block-math_min",{"title":439,"slug":440,"path":441,"order":69,"template":261,"translation_key":442},"Math::Modulo","math_modulo","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_modulo","logic-block-math_modulo",{"title":444,"slug":445,"path":446,"order":69,"template":261,"translation_key":447},"Math::Multiply","math_multiply","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_multiply","logic-block-math_multiply",{"title":449,"slug":450,"path":451,"order":69,"template":261,"translation_key":452},"Math::Random","math_random","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_random","logic-block-math_random",{"title":454,"slug":455,"path":456,"order":69,"template":261,"translation_key":457},"Math::Round","math_round","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_round","logic-block-math_round",{"title":459,"slug":460,"path":461,"order":69,"template":261,"translation_key":462},"Math::Subtract","math_subtract","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmath_subtract","logic-block-math_subtract",{"title":464,"slug":465,"path":466,"order":69,"template":261,"translation_key":467},"Motor axis","motor_axis","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmotor_axis","logic-block-motor_axis",{"title":469,"slug":470,"path":471,"order":69,"template":261,"translation_key":472},"Moving average","moving_average","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmoving_average","logic-block-moving_average",{"title":474,"slug":475,"path":476,"order":69,"template":261,"translation_key":477},"Number to string","number_to_string","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fnumber_to_string","logic-block-number_to_string",{"title":479,"slug":480,"path":481,"order":69,"template":261,"translation_key":482},"Numeric latch","numeric_latch","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fnumeric_latch","logic-block-numeric_latch",{"title":484,"slug":485,"path":486,"order":69,"template":261,"translation_key":487},"Numeric predicate","numeric_predicate","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fnumeric_predicate","logic-block-numeric_predicate",{"title":489,"slug":490,"path":491,"order":69,"template":261,"translation_key":492},"Numeric throttle","numeric_throttle","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fnumeric_throttle","logic-block-numeric_throttle",{"title":494,"slug":495,"path":496,"order":69,"template":261,"translation_key":497},"PubSub::Publish","pubsub","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fpubsub","logic-block-pubsub",{"title":499,"slug":500,"path":501,"order":69,"template":261,"translation_key":502},"Pulse counter","pulse_counter","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fpulse_counter","logic-block-pulse_counter",{"title":504,"slug":505,"path":506,"order":69,"template":261,"translation_key":507},"Pulse gate","pulse_gate","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fpulse_gate","logic-block-pulse_gate",{"title":509,"slug":510,"path":511,"order":69,"template":261,"translation_key":512},"Pulse throttle","pulse_throttle","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fpulse_throttle","logic-block-pulse_throttle",{"title":514,"slug":515,"path":516,"order":69,"template":261,"translation_key":517},"Sequencer","sequencer","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fsequencer","logic-block-sequencer",{"title":519,"slug":520,"path":521,"order":69,"template":261,"translation_key":522},"Shading","shading","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fshading","logic-block-shading",{"title":524,"slug":525,"path":526,"order":69,"template":261,"translation_key":527},"String format","string_format","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fstring_format","logic-block-string_format",{"title":529,"slug":530,"path":531,"order":69,"template":261,"translation_key":532},"String latch","string_latch","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fstring_latch","logic-block-string_latch",{"title":534,"slug":535,"path":536,"order":69,"template":261,"translation_key":537},"Toggle","toggle","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Ftoggle","logic-block-toggle",{"title":539,"slug":540,"path":541,"order":69,"template":261,"translation_key":542},"Variable Delayed Pulse","variable_delayed_pulse","pl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fvariable_delayed_pulse","logic-block-variable_delayed_pulse",{"title":544,"slug":545,"path":546,"order":86,"children":547},"Wyjścia","output","pl\u002Fdocs\u002Fbloki-logiczne\u002Foutput",[548,553],{"title":549,"slug":550,"path":551,"order":69,"template":261,"translation_key":552},"Mode controller","operation_mode_controller","pl\u002Fdocs\u002Fbloki-logiczne\u002Foutput\u002Foperation_mode_controller","logic-block-operation_mode_controller",{"title":554,"slug":555,"path":556,"order":69,"template":261,"translation_key":557},"Relay","relay","pl\u002Fdocs\u002Fbloki-logiczne\u002Foutput\u002Frelay","logic-block-relay",{"title":559,"slug":560,"path":561,"order":100,"children":562},"Język programowania Volang","volang","pl\u002Fdocs\u002Fvolang",[563,567],{"title":564,"slug":565,"path":566,"order":75},"Język Volang","jezyk","pl\u002Fdocs\u002Fvolang\u002Fjezyk",{"title":568,"slug":569,"path":570,"order":81,"template":571},"Biblioteka standardowa","biblioteka-standardowa","pl\u002Fdocs\u002Fvolang\u002Fbiblioteka-standardowa","api-reference",{"title":573,"slug":574,"path":575,"order":105,"children":576},"Oprogramowanie","oprogramowanie","pl\u002Fdocs\u002Foprogramowanie",[577,581],{"title":578,"slug":579,"path":580,"order":75},"Voldeno Studio – Instalacja i przewodnik","studio","pl\u002Fdocs\u002Foprogramowanie\u002Fstudio",{"title":582,"slug":583,"path":584,"order":81},"Voldeno Studio – Harmonogramy","schedules","pl\u002Fdocs\u002Foprogramowanie\u002Fschedules",{"title":586,"slug":587,"path":588,"order":589,"children":590},"Poradniki","poradniki","pl\u002Fdocs\u002Fporadniki",7,[591],{"title":592,"slug":593,"path":594,"order":75},"System nawadniania","nawadnianie","pl\u002Fdocs\u002Fporadniki\u002Fnawadnianie",{"title":596,"slug":597,"path":598,"order":599,"children":600},"Diagnostyka i rozwiązywanie problemów","diagnostyka","pl\u002Fdocs\u002Fdiagnostyka",8,[601],{"title":602,"slug":603,"path":604,"order":75},"Rozwiązywanie problemów z komunikacją magistrali","komunikacja-magistrali","pl\u002Fdocs\u002Fdiagnostyka\u002Fkomunikacja-magistrali",{"title":606,"slug":607,"path":608,"order":609},"Często zadawane pytania","faq","pl\u002Fdocs\u002Ffaq",9,[611,624,649,662,799,811,822,830,839],{"title":612,"slug":613,"path":614,"order":75,"children":615},"Getting Started","getting-started","en\u002Fdocs\u002Fgetting-started",[616,620],{"title":617,"slug":618,"path":619,"order":75},"Core Concepts and Terminology","concepts","en\u002Fdocs\u002Fgetting-started\u002Fconcepts",{"title":621,"slug":622,"path":623,"order":81},"System Overview for Installers","system-overview","en\u002Fdocs\u002Fgetting-started\u002Fsystem-overview",{"title":625,"slug":626,"path":627,"order":81,"children":628},"Modules & Peripherals","modules","en\u002Fdocs\u002Fmodules",[629,633,637,641,645],{"title":630,"slug":631,"path":632,"order":75},"Hub Module Wiring","hub-wiring","en\u002Fdocs\u002Fmodules\u002Fhub-wiring",{"title":634,"slug":635,"path":636,"order":81},"I\u002FO Module Wiring","io-wiring","en\u002Fdocs\u002Fmodules\u002Fio-wiring",{"title":638,"slug":639,"path":640,"order":86},"Relay Module Wiring","relay-wiring","en\u002Fdocs\u002Fmodules\u002Frelay-wiring",{"title":642,"slug":643,"path":644,"order":95},"1-Wire Module Wiring","1wire-wiring","en\u002Fdocs\u002Fmodules\u002F1wire-wiring",{"title":646,"slug":647,"path":648,"order":100},"Analog Input Module Wiring","analog-input-wiring","en\u002Fdocs\u002Fmodules\u002Fanalog-input-wiring",{"title":650,"slug":651,"path":652,"order":86,"children":653},"Wiring Guidelines","wiring","en\u002Fdocs\u002Fwiring",[654,658],{"title":655,"slug":656,"path":657,"order":75},"Bus Topology & Wiring","bus-topology","en\u002Fdocs\u002Fwiring\u002Fbus-topology",{"title":659,"slug":660,"path":661,"order":81},"Power Supply Sizing and Distribution","power-supply","en\u002Fdocs\u002Fwiring\u002Fpower-supply",{"title":663,"slug":664,"path":665,"order":95,"children":666},"Logic Blocks","logic-blocks","en\u002Fdocs\u002Flogic-blocks",[667,671,693,791],{"title":668,"slug":669,"path":670,"order":69,"template":250,"translation_key":251},"Overview","overview","en\u002Fdocs\u002Flogic-blocks\u002Foverview",{"title":672,"slug":254,"path":673,"order":75,"children":674},"Input","en\u002Fdocs\u002Flogic-blocks\u002Finput",[675,677,679,681,683,685,687,689,691],{"title":258,"slug":259,"path":676,"order":69,"template":261,"translation_key":262},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fbinary_input",{"title":264,"slug":265,"path":678,"order":69,"template":261,"translation_key":267},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fboolean_constant",{"title":269,"slug":270,"path":680,"order":69,"template":261,"translation_key":272},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fnumeric_constant",{"title":274,"slug":275,"path":682,"order":69,"template":261,"translation_key":277},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fnumeric_input",{"title":279,"slug":280,"path":684,"order":69,"template":261,"translation_key":282},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Foperation_mode_monitor",{"title":284,"slug":285,"path":686,"order":69,"template":261,"translation_key":287},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fpulse_at",{"title":289,"slug":290,"path":688,"order":69,"template":261,"translation_key":292},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fschedule",{"title":294,"slug":295,"path":690,"order":69,"template":261,"translation_key":297},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fstring_constant",{"title":299,"slug":300,"path":692,"order":69,"template":261,"translation_key":302},"en\u002Fdocs\u002Flogic-blocks\u002Finput\u002Fswitch",{"title":694,"slug":305,"path":695,"order":81,"children":696},"Process","en\u002Fdocs\u002Flogic-blocks\u002Fprocess",[697,699,701,703,705,707,709,711,713,715,717,719,721,723,725,727,729,731,733,735,737,739,741,743,745,747,749,751,753,755,757,759,761,763,765,767,769,771,773,775,777,779,781,783,785,787,789],{"title":309,"slug":310,"path":698,"order":69,"template":261,"translation_key":312},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fbinary_limiter",{"title":314,"slug":315,"path":700,"order":69,"template":261,"translation_key":317},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fboolean_to_string",{"title":319,"slug":320,"path":702,"order":69,"template":261,"translation_key":322},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fclimate_regulator",{"title":324,"slug":325,"path":704,"order":69,"template":261,"translation_key":327},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fclimate_regulator_hub",{"title":329,"slug":330,"path":706,"order":69,"template":261,"translation_key":332},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fdelay",{"title":334,"slug":335,"path":708,"order":69,"template":261,"translation_key":337},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fdelayed_pulse",{"title":339,"slug":340,"path":710,"order":69,"template":261,"translation_key":342},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fdoor_window_monitor",{"title":344,"slug":345,"path":712,"order":69,"template":261,"translation_key":347},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fedge_detector",{"title":349,"slug":350,"path":714,"order":69,"template":261,"translation_key":352},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fhttp_request",{"title":354,"slug":355,"path":716,"order":69,"template":261,"translation_key":357},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fhysteresis",{"title":359,"slug":360,"path":718,"order":69,"template":261,"translation_key":362},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Firrigation",{"title":364,"slug":365,"path":720,"order":69,"template":261,"translation_key":367},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fjson_get_boolean",{"title":369,"slug":370,"path":722,"order":69,"template":261,"translation_key":372},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fjson_get_number",{"title":374,"slug":375,"path":724,"order":69,"template":261,"translation_key":377},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fjson_get_string",{"title":379,"slug":380,"path":726,"order":69,"template":261,"translation_key":382},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Flevel_to_pulse",{"title":384,"slug":385,"path":728,"order":69,"template":261,"translation_key":387},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Flogic_and",{"title":389,"slug":390,"path":730,"order":69,"template":261,"translation_key":392},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Flogic_not",{"title":394,"slug":395,"path":732,"order":69,"template":261,"translation_key":397},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Flogic_or",{"title":399,"slug":400,"path":734,"order":69,"template":261,"translation_key":402},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_abs",{"title":404,"slug":405,"path":736,"order":69,"template":261,"translation_key":407},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_add",{"title":409,"slug":410,"path":738,"order":69,"template":261,"translation_key":412},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_average",{"title":414,"slug":415,"path":740,"order":69,"template":261,"translation_key":417},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_ceil",{"title":419,"slug":420,"path":742,"order":69,"template":261,"translation_key":422},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_divide",{"title":424,"slug":425,"path":744,"order":69,"template":261,"translation_key":427},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_floor",{"title":429,"slug":430,"path":746,"order":69,"template":261,"translation_key":432},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_max",{"title":434,"slug":435,"path":748,"order":69,"template":261,"translation_key":437},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_min",{"title":439,"slug":440,"path":750,"order":69,"template":261,"translation_key":442},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_modulo",{"title":444,"slug":445,"path":752,"order":69,"template":261,"translation_key":447},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_multiply",{"title":449,"slug":450,"path":754,"order":69,"template":261,"translation_key":452},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_random",{"title":454,"slug":455,"path":756,"order":69,"template":261,"translation_key":457},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_round",{"title":459,"slug":460,"path":758,"order":69,"template":261,"translation_key":462},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmath_subtract",{"title":464,"slug":465,"path":760,"order":69,"template":261,"translation_key":467},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmotor_axis",{"title":469,"slug":470,"path":762,"order":69,"template":261,"translation_key":472},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmoving_average",{"title":474,"slug":475,"path":764,"order":69,"template":261,"translation_key":477},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fnumber_to_string",{"title":479,"slug":480,"path":766,"order":69,"template":261,"translation_key":482},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fnumeric_latch",{"title":484,"slug":485,"path":768,"order":69,"template":261,"translation_key":487},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fnumeric_predicate",{"title":489,"slug":490,"path":770,"order":69,"template":261,"translation_key":492},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fnumeric_throttle",{"title":494,"slug":495,"path":772,"order":69,"template":261,"translation_key":497},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fpubsub",{"title":499,"slug":500,"path":774,"order":69,"template":261,"translation_key":502},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fpulse_counter",{"title":504,"slug":505,"path":776,"order":69,"template":261,"translation_key":507},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fpulse_gate",{"title":509,"slug":510,"path":778,"order":69,"template":261,"translation_key":512},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fpulse_throttle",{"title":514,"slug":515,"path":780,"order":69,"template":261,"translation_key":517},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fsequencer",{"title":519,"slug":520,"path":782,"order":69,"template":261,"translation_key":522},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fshading",{"title":524,"slug":525,"path":784,"order":69,"template":261,"translation_key":527},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fstring_format",{"title":529,"slug":530,"path":786,"order":69,"template":261,"translation_key":532},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fstring_latch",{"title":534,"slug":535,"path":788,"order":69,"template":261,"translation_key":537},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Ftoggle",{"title":539,"slug":540,"path":790,"order":69,"template":261,"translation_key":542},"en\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fvariable_delayed_pulse",{"title":792,"slug":545,"path":793,"order":86,"children":794},"Output","en\u002Fdocs\u002Flogic-blocks\u002Foutput",[795,797],{"title":549,"slug":550,"path":796,"order":69,"template":261,"translation_key":552},"en\u002Fdocs\u002Flogic-blocks\u002Foutput\u002Foperation_mode_controller",{"title":554,"slug":555,"path":798,"order":69,"template":261,"translation_key":557},"en\u002Fdocs\u002Flogic-blocks\u002Foutput\u002Frelay",{"title":800,"slug":560,"path":801,"order":100,"children":802},"Volang Programming Language","en\u002Fdocs\u002Fvolang",[803,807],{"title":804,"slug":805,"path":806,"order":75},"The Volang Language","language","en\u002Fdocs\u002Fvolang\u002Flanguage",{"title":808,"slug":809,"path":810,"order":81,"template":571},"Standard Library","stdlib","en\u002Fdocs\u002Fvolang\u002Fstdlib",{"title":812,"slug":813,"path":814,"order":105,"children":815},"Software & Tools","software","en\u002Fdocs\u002Fsoftware",[816,819],{"title":817,"slug":579,"path":818,"order":75},"Voldeno Studio – Installation and Walkthrough","en\u002Fdocs\u002Fsoftware\u002Fstudio",{"title":820,"slug":583,"path":821,"order":81},"Voldeno Studio – Schedules","en\u002Fdocs\u002Fsoftware\u002Fschedules",{"title":823,"slug":824,"path":825,"order":589,"children":826},"How-to Guides & Recipes","how-to","en\u002Fdocs\u002Fhow-to",[827],{"title":828,"slug":360,"path":829,"order":75},"Irrigation System","en\u002Fdocs\u002Fhow-to\u002Firrigation",{"title":831,"slug":832,"path":833,"order":599,"children":834},"Troubleshooting & Diagnostics","troubleshooting","en\u002Fdocs\u002Ftroubleshooting",[835],{"title":836,"slug":837,"path":838,"order":75},"Bus Communication Troubleshooting","bus-communication","en\u002Fdocs\u002Ftroubleshooting\u002Fbus-communication",{"title":840,"slug":607,"path":841,"order":609},"Frequently Asked Questions","en\u002Fdocs\u002Ffaq",{"pl":843,"en":855},{"bloki-logiczne\u002Fprocess":844,"bloki-logiczne\u002Finput":845,"diagnostyka":846,"okablowanie":847,"moduly":848,"bloki-logiczne\u002Foutput":849,"oprogramowanie":850,"pierwsze-kroki":851,"poradniki":852,"bloki-logiczne":853,"volang":854},"bloki-logiczne\u002Fprocess\u002Fbinary_limiter","bloki-logiczne\u002Finput\u002Fbinary_input","diagnostyka\u002Fkomunikacja-magistrali","okablowanie\u002Ftopologia-magistrali","moduly\u002Fokablowanie-hub","bloki-logiczne\u002Foutput\u002Foperation_mode_controller","oprogramowanie\u002Fstudio","pierwsze-kroki\u002Fpojecia","poradniki\u002Fnawadnianie","bloki-logiczne\u002Fprzeglad","volang\u002Fjezyk",{"getting-started":856,"logic-blocks\u002Foutput":857,"troubleshooting":858,"logic-blocks":859,"volang":860,"logic-blocks\u002Fprocess":861,"logic-blocks\u002Finput":862,"modules":863,"software":864,"how-to":865,"wiring":866},"getting-started\u002Fconcepts","logic-blocks\u002Foutput\u002Foperation_mode_controller","troubleshooting\u002Fbus-communication","logic-blocks\u002Foverview","volang\u002Flanguage","logic-blocks\u002Fprocess\u002Fbinary_limiter","logic-blocks\u002Finput\u002Fbinary_input","modules\u002Fhub-wiring","software\u002Fstudio","how-to\u002Firrigation","wiring\u002Fbus-topology",{"enabled":58,"navigation":868},{"en":869,"pl":888},[870,876,882],{"title":871,"slug":872,"path":873,"order":69,"date":874,"translation_key":875},"We are ready! Hundreds of Voldeno modules prepared for smart home deployment.","we-are-ready","en\u002Fblog\u002Fwe-are-ready","2025-08-17","2025_08_17_we_are_ready",{"title":877,"slug":878,"path":879,"order":69,"date":880,"translation_key":881},"New Voldeno 1-Wire Temperature Sensor - Compact, Reliable, and Built for Large-Scale Installations","new-voldeno-1-wire-temperature-sensor-compact-reliable-and-built-for-large-scale-installations","en\u002Fblog\u002Fnew-voldeno-1-wire-temperature-sensor-compact-reliable-and-built-for-large-scale-installations","2025-04-25","2025_04_25_new_voldeno_1wire_temperature_sensor",{"title":883,"slug":884,"path":885,"order":69,"date":886,"translation_key":887},"Discover the Future of Smart Homes with Voldeno","future_of_smart_homes","en\u002Fblog\u002Ffuture_of_smart_homes","2024-10-18","2024_10_18_future_of_smart_homes",[889,893,897],{"title":890,"slug":891,"path":892,"order":69,"date":874,"translation_key":875},"Jesteśmy gotowi! Setki modułów Voldeno przygotowanych do wdrożenia w inteligentnych domach.","jestesmy-gotowi-setki-modulow-voldeno-przygotowanych-do-wdrozenia-w-inteligentnych-domach","pl\u002Fblog\u002Fjestesmy-gotowi-setki-modulow-voldeno-przygotowanych-do-wdrozenia-w-inteligentnych-domach",{"title":894,"slug":895,"path":896,"order":69,"date":880,"translation_key":881},"Nowy czujnik temperatury Voldeno 1-Wire - kompaktowy, niezawodny i stworzony do dużych instalacji","nowy-czujnik-temperatury-1-wire-voldeno-kompaktowy-niezawodny-i-zaprojektowany-do-instalacji-na-duza-skale","pl\u002Fblog\u002Fnowy-czujnik-temperatury-1-wire-voldeno-kompaktowy-niezawodny-i-zaprojektowany-do-instalacji-na-duza-skale",{"title":898,"slug":899,"path":900,"order":69,"date":886,"translation_key":887},"Odkryj przyszłość inteligentnych domów z Voldeno","odkryj-przyszlosc-inteligentnych-domow-z-voldeno","pl\u002Fblog\u002Fodkryj-przyszlosc-inteligentnych-domow-z-voldeno",{"pl":902,"en":903,"xDefault":902},"https:\u002F\u002Fvoldeno.com\u002Fpl\u002Fdocs\u002Fbloki-logiczne\u002Fprocess\u002Fmotor_axis","https:\u002F\u002Fvoldeno.com\u002Fen\u002Fdocs\u002Flogic-blocks\u002Fprocess\u002Fmotor_axis",{"slug":465,"title":464,"description":905,"tags":906,"content_html":907,"headings":908,"template":261,"extra":922},"Poznaj działanie bloku logicznego Motor axis - zasada działania, opcje konfiguracji i przykłady zastosowań w Voldeno.",[664,305,465],"\u003Ch1 id=\"motor-axis\">\u003Ca href=\"#motor-axis\" class=\"anchor\">#\u003C\u002Fa> Motor axis\u003C\u002Fh1>\n\u003Cdiv class=\"block-meta\">\n  \u003Cspan class=\"badge badge-group badge-group-process\">Przetwarzanie\u003C\u002Fspan>\n\u003C\u002Fdiv>\n\n\u003Cp class=\"block-description\">Jednosiowy sterownik silnika z obsługą bazowania. Napędza silnik do pozycji docelowej za pomocą zliczania impulsów enkodera lub sterowania czasowego.\u003C\u002Fp>\n\u003C!-- BLOCK_DIAGRAM -->\n\u003Ch2 id=\"source-code\">\u003Ca href=\"#source-code\" class=\"anchor\">#\u003C\u002Fa> Kod źródłowy\u003C\u002Fh2>\n\u003Cdetails class=\"code-details\">\u003Csummary>Pokaż kod Volang\u003C\u002Fsummary>\n\u003Cdiv class=\"code-block\" data-lang=\"volang\">\n\u003Cpre>\u003Ccode class=\"language-volang\">\u003Cspan class=\"variable\">channel\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">input::channel\u003C\u002Fspan>()\n\u003Cspan class=\"variable\">value\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">input::value\u003C\u002Fspan>()\n\n\u003Cspan class=\"keyword\">fn\u003C\u002Fspan> \u003Cspan class=\"function\">stop_motors\u003C\u002Fspan>() {\n    \u003Cspan class=\"stdlib\">callback::clear\u003C\u002Fspan>()\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">output\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"forward\"\u003C\u002Fspan>) \u003Cspan class=\"keyword\">or\u003C\u002Fspan> \u003Cspan class=\"variable\">output\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"reverse\"\u003C\u002Fspan>)) {\n        \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"was_forward\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">output\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"forward\"\u003C\u002Fspan>))\n        \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"last_stop_time\"\u003C\u002Fspan>, \u003Cspan class=\"stdlib\">time::uptime\u003C\u002Fspan>())\n    }\n    \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"forward\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">false\u003C\u002Fspan>)\n    \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"reverse\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">false\u003C\u002Fspan>)\n    \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"moving\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">false\u003C\u002Fspan>)\n    \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"rpm\"\u003C\u002Fspan>, \u003Cspan class=\"number\">0\u003C\u002Fspan>)\n    \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"last_encoder_pulse_time\"\u003C\u002Fspan>, \u003Cspan class=\"number\">0\u003C\u002Fspan>)\n}\n\n\u003Cspan class=\"keyword\">fn\u003C\u002Fspan> \u003Cspan class=\"function\">start_forward\u003C\u002Fspan>() {\n    \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"forward\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">true\u003C\u002Fspan>)\n    \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"reverse\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">false\u003C\u002Fspan>)\n    \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"moving\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">true\u003C\u002Fspan>)\n}\n\n\u003Cspan class=\"keyword\">fn\u003C\u002Fspan> \u003Cspan class=\"function\">start_reverse\u003C\u002Fspan>() {\n    \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"forward\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">false\u003C\u002Fspan>)\n    \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"reverse\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">true\u003C\u002Fspan>)\n    \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"moving\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">true\u003C\u002Fspan>)\n}\n\n\u003Cspan class=\"keyword\">fn\u003C\u002Fspan> \u003Cspan class=\"function\">set_position\u003C\u002Fspan>(\u003Cspan class=\"variable\">pos\u003C\u002Fspan>) {\n    \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"position\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">pos\u003C\u002Fspan>)\n    \u003Cspan class=\"variable\">full\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">config\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"full_travel_steps\"\u003C\u002Fspan>)\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">full\u003C\u002Fspan> \u003Cspan class=\"operator\">&gt;\u003C\u002Fspan> \u003Cspan class=\"number\">0\u003C\u002Fspan>) {\n        \u003Cspan class=\"variable\">pct\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">pos\u003C\u002Fspan> \u003Cspan class=\"operator\">*\u003C\u002Fspan> \u003Cspan class=\"number\">100.0\u003C\u002Fspan> \u003Cspan class=\"operator\">\u002F\u003C\u002Fspan> \u003Cspan class=\"variable\">full\u003C\u002Fspan>\n        \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">pct\u003C\u002Fspan> \u003Cspan class=\"operator\">&lt;\u003C\u002Fspan> \u003Cspan class=\"number\">0\u003C\u002Fspan>) {\n            \u003Cspan class=\"variable\">pct\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"number\">0\u003C\u002Fspan>\n        }\n        \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">pct\u003C\u002Fspan> \u003Cspan class=\"operator\">&gt;\u003C\u002Fspan> \u003Cspan class=\"number\">100\u003C\u002Fspan>) {\n            \u003Cspan class=\"variable\">pct\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"number\">100\u003C\u002Fspan>\n        }\n        \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"position_pct\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">pct\u003C\u002Fspan>)\n    }\n}\n\n\u003Cspan class=\"keyword\">fn\u003C\u002Fspan> \u003Cspan class=\"function\">set_rpm\u003C\u002Fspan>(\u003Cspan class=\"variable\">pulses_per_second\u003C\u002Fspan>) {\n    \u003Cspan class=\"variable\">spr\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">config\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"steps_per_revolution\"\u003C\u002Fspan>)\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">spr\u003C\u002Fspan> \u003Cspan class=\"operator\">&gt;\u003C\u002Fspan> \u003Cspan class=\"number\">0\u003C\u002Fspan>) {\n        \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"rpm\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">pulses_per_second\u003C\u002Fspan> \u003Cspan class=\"operator\">*\u003C\u002Fspan> \u003Cspan class=\"number\">60.0\u003C\u002Fspan> \u003Cspan class=\"operator\">\u002F\u003C\u002Fspan> \u003Cspan class=\"variable\">spr\u003C\u002Fspan>)\n    }\n}\n\n\u003Cspan class=\"keyword\">extern\u003C\u002Fspan> \u003Cspan class=\"keyword\">fn\u003C\u002Fspan> \u003Cspan class=\"function\">onStep\u003C\u002Fspan>(\u003Cspan class=\"variable\">v\u003C\u002Fspan>) {\n    \u003Cspan class=\"variable\">start_time\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"move_start_time\"\u003C\u002Fspan>)\n    \u003Cspan class=\"variable\">start_pos\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"move_start_position\"\u003C\u002Fspan>)\n    \u003Cspan class=\"variable\">target\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"move_target\"\u003C\u002Fspan>)\n    \u003Cspan class=\"variable\">is_forward\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">output\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"forward\"\u003C\u002Fspan>)\n\n    \u003Cspan class=\"variable\">pulse_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"number\">0\u003C\u002Fspan>\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">is_forward\u003C\u002Fspan>) {\n        \u003Cspan class=\"variable\">pulse_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">math::round\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"pulse_time_forward\"\u003C\u002Fspan>) \u003Cspan class=\"operator\">*\u003C\u002Fspan> \u003Cspan class=\"number\">1000\u003C\u002Fspan>)\n    } \u003Cspan class=\"keyword\">else\u003C\u002Fspan> {\n        \u003Cspan class=\"variable\">pulse_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">math::round\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"pulse_time_reverse\"\u003C\u002Fspan>) \u003Cspan class=\"operator\">*\u003C\u002Fspan> \u003Cspan class=\"number\">1000\u003C\u002Fspan>)\n    }\n\n    \u003Cspan class=\"variable\">total_steps\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">target\u003C\u002Fspan> \u003Cspan class=\"operator\">-\u003C\u002Fspan> \u003Cspan class=\"variable\">start_pos\u003C\u002Fspan>\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">total_steps\u003C\u002Fspan> \u003Cspan class=\"operator\">&lt;\u003C\u002Fspan> \u003Cspan class=\"number\">0\u003C\u002Fspan>) {\n        \u003Cspan class=\"variable\">total_steps\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"number\">0\u003C\u002Fspan> \u003Cspan class=\"operator\">-\u003C\u002Fspan> \u003Cspan class=\"variable\">total_steps\u003C\u002Fspan>\n    }\n    \u003Cspan class=\"variable\">total_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">total_steps\u003C\u002Fspan> \u003Cspan class=\"operator\">*\u003C\u002Fspan> \u003Cspan class=\"variable\">pulse_ms\u003C\u002Fspan>\n    \u003Cspan class=\"variable\">elapsed\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">time::uptime\u003C\u002Fspan>() \u003Cspan class=\"operator\">-\u003C\u002Fspan> \u003Cspan class=\"variable\">start_time\u003C\u002Fspan>\n\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">elapsed\u003C\u002Fspan> \u003Cspan class=\"operator\">&gt;=\u003C\u002Fspan> \u003Cspan class=\"variable\">total_ms\u003C\u002Fspan>) {\n        \u003Cspan class=\"function\">set_position\u003C\u002Fspan>(\u003Cspan class=\"variable\">target\u003C\u002Fspan>)\n        \u003Cspan class=\"function\">stop_motors\u003C\u002Fspan>()\n        \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"at_target\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">true\u003C\u002Fspan>)\n        \u003Cspan class=\"keyword\">return\u003C\u002Fspan>\n    }\n\n    \u003Cspan class=\"variable\">steps_float\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">elapsed\u003C\u002Fspan> \u003Cspan class=\"operator\">\u002F\u003C\u002Fspan> \u003Cspan class=\"variable\">pulse_ms\u003C\u002Fspan>\n    \u003Cspan class=\"variable\">steps_int\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">math::round\u003C\u002Fspan>(\u003Cspan class=\"variable\">steps_float\u003C\u002Fspan>)\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">steps_int\u003C\u002Fspan> \u003Cspan class=\"operator\">*\u003C\u002Fspan> \u003Cspan class=\"variable\">pulse_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">&gt;\u003C\u002Fspan> \u003Cspan class=\"variable\">elapsed\u003C\u002Fspan>) {\n        \u003Cspan class=\"variable\">steps_int\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">steps_int\u003C\u002Fspan> \u003Cspan class=\"operator\">-\u003C\u002Fspan> \u003Cspan class=\"number\">1\u003C\u002Fspan>\n    }\n\n    \u003Cspan class=\"variable\">position\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">start_pos\u003C\u002Fspan>\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">is_forward\u003C\u002Fspan>) {\n        \u003Cspan class=\"variable\">position\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">start_pos\u003C\u002Fspan> \u003Cspan class=\"operator\">+\u003C\u002Fspan> \u003Cspan class=\"variable\">steps_int\u003C\u002Fspan>\n        \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">position\u003C\u002Fspan> \u003Cspan class=\"operator\">&gt;\u003C\u002Fspan> \u003Cspan class=\"variable\">target\u003C\u002Fspan>) {\n            \u003Cspan class=\"variable\">position\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">target\u003C\u002Fspan>\n        }\n    } \u003Cspan class=\"keyword\">else\u003C\u002Fspan> {\n        \u003Cspan class=\"variable\">position\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">start_pos\u003C\u002Fspan> \u003Cspan class=\"operator\">-\u003C\u002Fspan> \u003Cspan class=\"variable\">steps_int\u003C\u002Fspan>\n        \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">position\u003C\u002Fspan> \u003Cspan class=\"operator\">&lt;\u003C\u002Fspan> \u003Cspan class=\"variable\">target\u003C\u002Fspan>) {\n            \u003Cspan class=\"variable\">position\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">target\u003C\u002Fspan>\n        }\n    }\n\n    \u003Cspan class=\"function\">set_position\u003C\u002Fspan>(\u003Cspan class=\"variable\">position\u003C\u002Fspan>)\n\n    \u003Cspan class=\"variable\">remaining_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">total_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">-\u003C\u002Fspan> \u003Cspan class=\"variable\">elapsed\u003C\u002Fspan>\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">remaining_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">&lt;=\u003C\u002Fspan> \u003Cspan class=\"number\">100\u003C\u002Fspan>) {\n        \u003Cspan class=\"stdlib\">callback::set\u003C\u002Fspan>(\u003Cspan class=\"stdlib\">math::round\u003C\u002Fspan>(\u003Cspan class=\"variable\">remaining_ms\u003C\u002Fspan>), \u003Cspan class=\"string\">\"onStep\"\u003C\u002Fspan>, \u003Cspan class=\"number\">0\u003C\u002Fspan>)\n    } \u003Cspan class=\"keyword\">else\u003C\u002Fspan> {\n        \u003Cspan class=\"stdlib\">callback::set\u003C\u002Fspan>(\u003Cspan class=\"number\">100\u003C\u002Fspan>, \u003Cspan class=\"string\">\"onStep\"\u003C\u002Fspan>, \u003Cspan class=\"number\">0\u003C\u002Fspan>)\n    }\n}\n\n\u003Cspan class=\"keyword\">extern\u003C\u002Fspan> \u003Cspan class=\"keyword\">fn\u003C\u002Fspan> \u003Cspan class=\"function\">onFreqFinish\u003C\u002Fspan>(\u003Cspan class=\"variable\">v\u003C\u002Fspan>) {\n    \u003Cspan class=\"variable\">target\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"move_target\"\u003C\u002Fspan>)\n    \u003Cspan class=\"function\">set_position\u003C\u002Fspan>(\u003Cspan class=\"variable\">target\u003C\u002Fspan>)\n    \u003Cspan class=\"function\">stop_motors\u003C\u002Fspan>()\n    \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"at_target\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">true\u003C\u002Fspan>)\n}\n\n\u003Cspan class=\"keyword\">fn\u003C\u002Fspan> \u003Cspan class=\"function\">init_freq_state\u003C\u002Fspan>() {\n    \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"last_freq_time\"\u003C\u002Fspan>, \u003Cspan class=\"stdlib\">time::uptime\u003C\u002Fspan>())\n    \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"avg_pulse_time_ms\"\u003C\u002Fspan>, \u003Cspan class=\"number\">0\u003C\u002Fspan>)\n    \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"freq_sample_count\"\u003C\u002Fspan>, \u003Cspan class=\"number\">0\u003C\u002Fspan>)\n    \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"freq_finishing\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">false\u003C\u002Fspan>)\n    \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"fractional_pulses\"\u003C\u002Fspan>, \u003Cspan class=\"number\">0\u003C\u002Fspan>)\n}\n\n\u003Cspan class=\"keyword\">fn\u003C\u002Fspan> \u003Cspan class=\"function\">evaluate_target_now\u003C\u002Fspan>(\u003Cspan class=\"variable\">target\u003C\u002Fspan>, \u003Cspan class=\"variable\">position\u003C\u002Fspan>) {\n    \u003Cspan class=\"variable\">tolerance\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">config\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"position_tolerance\"\u003C\u002Fspan>)\n    \u003Cspan class=\"variable\">diff\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">target\u003C\u002Fspan> \u003Cspan class=\"operator\">-\u003C\u002Fspan> \u003Cspan class=\"variable\">position\u003C\u002Fspan>\n\n    \u003Cspan class=\"variable\">control_mode\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">config\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"control_mode\"\u003C\u002Fspan>)\n\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">diff\u003C\u002Fspan> \u003Cspan class=\"operator\">&gt;\u003C\u002Fspan> \u003Cspan class=\"variable\">tolerance\u003C\u002Fspan>) {\n        \u003Cspan class=\"function\">start_forward\u003C\u002Fspan>()\n        \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"at_target\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">false\u003C\u002Fspan>)\n        \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">control_mode\u003C\u002Fspan> \u003Cspan class=\"operator\">==\u003C\u002Fspan> \u003Cspan class=\"number\">1\u003C\u002Fspan>) {\n            \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"move_start_time\"\u003C\u002Fspan>, \u003Cspan class=\"stdlib\">time::uptime\u003C\u002Fspan>())\n            \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"move_start_position\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">position\u003C\u002Fspan>)\n            \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"move_target\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">target\u003C\u002Fspan>)\n            \u003Cspan class=\"variable\">steps\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">math::round\u003C\u002Fspan>(\u003Cspan class=\"variable\">diff\u003C\u002Fspan>)\n            \u003Cspan class=\"variable\">pulse_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">math::round\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"pulse_time_forward\"\u003C\u002Fspan>) \u003Cspan class=\"operator\">*\u003C\u002Fspan> \u003Cspan class=\"number\">1000\u003C\u002Fspan>)\n            \u003Cspan class=\"function\">set_rpm\u003C\u002Fspan>(\u003Cspan class=\"number\">1000.0\u003C\u002Fspan> \u003Cspan class=\"operator\">\u002F\u003C\u002Fspan> \u003Cspan class=\"variable\">pulse_ms\u003C\u002Fspan>)\n            \u003Cspan class=\"variable\">total_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">steps\u003C\u002Fspan> \u003Cspan class=\"operator\">*\u003C\u002Fspan> \u003Cspan class=\"variable\">pulse_ms\u003C\u002Fspan>\n            \u003Cspan class=\"variable\">first_cb\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"number\">100\u003C\u002Fspan>\n            \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">total_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">&lt;\u003C\u002Fspan> \u003Cspan class=\"variable\">first_cb\u003C\u002Fspan>) {\n                \u003Cspan class=\"variable\">first_cb\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">total_ms\u003C\u002Fspan>\n            }\n            \u003Cspan class=\"stdlib\">callback::set\u003C\u002Fspan>(\u003Cspan class=\"variable\">first_cb\u003C\u002Fspan>, \u003Cspan class=\"string\">\"onStep\"\u003C\u002Fspan>, \u003Cspan class=\"number\">0\u003C\u002Fspan>)\n        }\n        \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">control_mode\u003C\u002Fspan> \u003Cspan class=\"operator\">==\u003C\u002Fspan> \u003Cspan class=\"number\">2\u003C\u002Fspan>) {\n            \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"move_target\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">target\u003C\u002Fspan>)\n            \u003Cspan class=\"function\">init_freq_state\u003C\u002Fspan>()\n            \u003Cspan class=\"variable\">pulse_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">math::round\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"pulse_time_forward\"\u003C\u002Fspan>) \u003Cspan class=\"operator\">*\u003C\u002Fspan> \u003Cspan class=\"number\">1000\u003C\u002Fspan>)\n            \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"avg_pulse_time_ms\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">pulse_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">*\u003C\u002Fspan> \u003Cspan class=\"number\">1.0\u003C\u002Fspan>)\n            \u003Cspan class=\"variable\">total_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">math::round\u003C\u002Fspan>(\u003Cspan class=\"variable\">diff\u003C\u002Fspan>) \u003Cspan class=\"operator\">*\u003C\u002Fspan> \u003Cspan class=\"variable\">pulse_ms\u003C\u002Fspan>\n            \u003Cspan class=\"stdlib\">callback::set\u003C\u002Fspan>(\u003Cspan class=\"stdlib\">math::round\u003C\u002Fspan>(\u003Cspan class=\"variable\">total_ms\u003C\u002Fspan>), \u003Cspan class=\"string\">\"onFreqFinish\"\u003C\u002Fspan>, \u003Cspan class=\"number\">0\u003C\u002Fspan>)\n        }\n    } \u003Cspan class=\"keyword\">else\u003C\u002Fspan> \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">diff\u003C\u002Fspan> \u003Cspan class=\"operator\">&lt;\u003C\u002Fspan> (\u003Cspan class=\"number\">0\u003C\u002Fspan> \u003Cspan class=\"operator\">-\u003C\u002Fspan> \u003Cspan class=\"variable\">tolerance\u003C\u002Fspan>)) {\n        \u003Cspan class=\"function\">start_reverse\u003C\u002Fspan>()\n        \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"at_target\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">false\u003C\u002Fspan>)\n        \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">control_mode\u003C\u002Fspan> \u003Cspan class=\"operator\">==\u003C\u002Fspan> \u003Cspan class=\"number\">1\u003C\u002Fspan>) {\n            \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"move_start_time\"\u003C\u002Fspan>, \u003Cspan class=\"stdlib\">time::uptime\u003C\u002Fspan>())\n            \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"move_start_position\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">position\u003C\u002Fspan>)\n            \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"move_target\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">target\u003C\u002Fspan>)\n            \u003Cspan class=\"variable\">steps\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">math::round\u003C\u002Fspan>(\u003Cspan class=\"number\">0\u003C\u002Fspan> \u003Cspan class=\"operator\">-\u003C\u002Fspan> \u003Cspan class=\"variable\">diff\u003C\u002Fspan>)\n            \u003Cspan class=\"variable\">pulse_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">math::round\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"pulse_time_reverse\"\u003C\u002Fspan>) \u003Cspan class=\"operator\">*\u003C\u002Fspan> \u003Cspan class=\"number\">1000\u003C\u002Fspan>)\n            \u003Cspan class=\"function\">set_rpm\u003C\u002Fspan>(\u003Cspan class=\"number\">1000.0\u003C\u002Fspan> \u003Cspan class=\"operator\">\u002F\u003C\u002Fspan> \u003Cspan class=\"variable\">pulse_ms\u003C\u002Fspan>)\n            \u003Cspan class=\"variable\">total_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">steps\u003C\u002Fspan> \u003Cspan class=\"operator\">*\u003C\u002Fspan> \u003Cspan class=\"variable\">pulse_ms\u003C\u002Fspan>\n            \u003Cspan class=\"variable\">first_cb\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"number\">100\u003C\u002Fspan>\n            \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">total_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">&lt;\u003C\u002Fspan> \u003Cspan class=\"variable\">first_cb\u003C\u002Fspan>) {\n                \u003Cspan class=\"variable\">first_cb\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">total_ms\u003C\u002Fspan>\n            }\n            \u003Cspan class=\"stdlib\">callback::set\u003C\u002Fspan>(\u003Cspan class=\"variable\">first_cb\u003C\u002Fspan>, \u003Cspan class=\"string\">\"onStep\"\u003C\u002Fspan>, \u003Cspan class=\"number\">0\u003C\u002Fspan>)\n        }\n        \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">control_mode\u003C\u002Fspan> \u003Cspan class=\"operator\">==\u003C\u002Fspan> \u003Cspan class=\"number\">2\u003C\u002Fspan>) {\n            \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"move_target\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">target\u003C\u002Fspan>)\n            \u003Cspan class=\"function\">init_freq_state\u003C\u002Fspan>()\n            \u003Cspan class=\"variable\">pulse_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">math::round\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"pulse_time_reverse\"\u003C\u002Fspan>) \u003Cspan class=\"operator\">*\u003C\u002Fspan> \u003Cspan class=\"number\">1000\u003C\u002Fspan>)\n            \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"avg_pulse_time_ms\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">pulse_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">*\u003C\u002Fspan> \u003Cspan class=\"number\">1.0\u003C\u002Fspan>)\n            \u003Cspan class=\"variable\">total_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">math::round\u003C\u002Fspan>(\u003Cspan class=\"number\">0\u003C\u002Fspan> \u003Cspan class=\"operator\">-\u003C\u002Fspan> \u003Cspan class=\"variable\">diff\u003C\u002Fspan>) \u003Cspan class=\"operator\">*\u003C\u002Fspan> \u003Cspan class=\"variable\">pulse_ms\u003C\u002Fspan>\n            \u003Cspan class=\"stdlib\">callback::set\u003C\u002Fspan>(\u003Cspan class=\"stdlib\">math::round\u003C\u002Fspan>(\u003Cspan class=\"variable\">total_ms\u003C\u002Fspan>), \u003Cspan class=\"string\">\"onFreqFinish\"\u003C\u002Fspan>, \u003Cspan class=\"number\">0\u003C\u002Fspan>)\n        }\n    } \u003Cspan class=\"keyword\">else\u003C\u002Fspan> {\n        \u003Cspan class=\"function\">stop_motors\u003C\u002Fspan>()\n        \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"at_target\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">true\u003C\u002Fspan>)\n    }\n}\n\n\u003Cspan class=\"keyword\">extern\u003C\u002Fspan> \u003Cspan class=\"keyword\">fn\u003C\u002Fspan> \u003Cspan class=\"function\">onMotorLock\u003C\u002Fspan>(\u003Cspan class=\"variable\">v\u003C\u002Fspan>) {\n    \u003Cspan class=\"function\">evaluate_target_now\u003C\u002Fspan>(\u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"lock_target\"\u003C\u002Fspan>), \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"lock_position\"\u003C\u002Fspan>))\n}\n\n\u003Cspan class=\"keyword\">fn\u003C\u002Fspan> \u003Cspan class=\"function\">evaluate_target\u003C\u002Fspan>(\u003Cspan class=\"variable\">target\u003C\u002Fspan>, \u003Cspan class=\"variable\">position\u003C\u002Fspan>) {\n    \u003Cspan class=\"stdlib\">callback::clear\u003C\u002Fspan>()\n    \u003Cspan class=\"variable\">lock_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">math::round\u003C\u002Fspan>(\u003Cspan class=\"variable\">config\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"motor_lock_duration\"\u003C\u002Fspan>) \u003Cspan class=\"operator\">*\u003C\u002Fspan> \u003Cspan class=\"number\">1000\u003C\u002Fspan>)\n\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">lock_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">&lt;=\u003C\u002Fspan> \u003Cspan class=\"number\">0\u003C\u002Fspan>) {\n        \u003Cspan class=\"function\">evaluate_target_now\u003C\u002Fspan>(\u003Cspan class=\"variable\">target\u003C\u002Fspan>, \u003Cspan class=\"variable\">position\u003C\u002Fspan>)\n        \u003Cspan class=\"keyword\">return\u003C\u002Fspan>\n    }\n\n    \u003Cspan class=\"variable\">tolerance\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">config\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"position_tolerance\"\u003C\u002Fspan>)\n    \u003Cspan class=\"variable\">diff\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">target\u003C\u002Fspan> \u003Cspan class=\"operator\">-\u003C\u002Fspan> \u003Cspan class=\"variable\">position\u003C\u002Fspan>\n    \u003Cspan class=\"variable\">going_forward\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">diff\u003C\u002Fspan> \u003Cspan class=\"operator\">&gt;\u003C\u002Fspan> \u003Cspan class=\"variable\">tolerance\u003C\u002Fspan>\n    \u003Cspan class=\"variable\">going_reverse\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">diff\u003C\u002Fspan> \u003Cspan class=\"operator\">&lt;\u003C\u002Fspan> (\u003Cspan class=\"number\">0\u003C\u002Fspan> \u003Cspan class=\"operator\">-\u003C\u002Fspan> \u003Cspan class=\"variable\">tolerance\u003C\u002Fspan>)\n\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"operator\">!\u003C\u002Fspan>\u003Cspan class=\"variable\">going_forward\u003C\u002Fspan> \u003Cspan class=\"keyword\">and\u003C\u002Fspan> \u003Cspan class=\"operator\">!\u003C\u002Fspan>\u003Cspan class=\"variable\">going_reverse\u003C\u002Fspan>) {\n        \u003Cspan class=\"function\">evaluate_target_now\u003C\u002Fspan>(\u003Cspan class=\"variable\">target\u003C\u002Fspan>, \u003Cspan class=\"variable\">position\u003C\u002Fspan>)\n        \u003Cspan class=\"keyword\">return\u003C\u002Fspan>\n    }\n\n    \u003Cspan class=\"variable\">direction_changed\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"boolean\">false\u003C\u002Fspan>\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">going_forward\u003C\u002Fspan> \u003Cspan class=\"keyword\">and\u003C\u002Fspan> \u003Cspan class=\"operator\">!\u003C\u002Fspan>\u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"was_forward\"\u003C\u002Fspan>)) {\n        \u003Cspan class=\"variable\">direction_changed\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"boolean\">true\u003C\u002Fspan>\n    }\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">going_reverse\u003C\u002Fspan> \u003Cspan class=\"keyword\">and\u003C\u002Fspan> \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"was_forward\"\u003C\u002Fspan>)) {\n        \u003Cspan class=\"variable\">direction_changed\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"boolean\">true\u003C\u002Fspan>\n    }\n\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"operator\">!\u003C\u002Fspan>\u003Cspan class=\"variable\">direction_changed\u003C\u002Fspan>) {\n        \u003Cspan class=\"function\">evaluate_target_now\u003C\u002Fspan>(\u003Cspan class=\"variable\">target\u003C\u002Fspan>, \u003Cspan class=\"variable\">position\u003C\u002Fspan>)\n        \u003Cspan class=\"keyword\">return\u003C\u002Fspan>\n    }\n\n    \u003Cspan class=\"variable\">elapsed_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">time::uptime\u003C\u002Fspan>() \u003Cspan class=\"operator\">-\u003C\u002Fspan> \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"last_stop_time\"\u003C\u002Fspan>)\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">elapsed_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">&gt;=\u003C\u002Fspan> \u003Cspan class=\"variable\">lock_ms\u003C\u002Fspan>) {\n        \u003Cspan class=\"function\">evaluate_target_now\u003C\u002Fspan>(\u003Cspan class=\"variable\">target\u003C\u002Fspan>, \u003Cspan class=\"variable\">position\u003C\u002Fspan>)\n        \u003Cspan class=\"keyword\">return\u003C\u002Fspan>\n    }\n\n    \u003Cspan class=\"variable\">remaining_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">lock_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">-\u003C\u002Fspan> \u003Cspan class=\"variable\">elapsed_ms\u003C\u002Fspan>\n    \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"at_target\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">false\u003C\u002Fspan>)\n    \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"lock_target\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">target\u003C\u002Fspan>)\n    \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"lock_position\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">position\u003C\u002Fspan>)\n    \u003Cspan class=\"stdlib\">callback::set\u003C\u002Fspan>(\u003Cspan class=\"stdlib\">math::round\u003C\u002Fspan>(\u003Cspan class=\"variable\">remaining_ms\u003C\u002Fspan>), \u003Cspan class=\"string\">\"onMotorLock\"\u003C\u002Fspan>, \u003Cspan class=\"number\">0\u003C\u002Fspan>)\n}\n\n\u003Cspan class=\"keyword\">fn\u003C\u002Fspan> \u003Cspan class=\"function\">complete_homing\u003C\u002Fspan>() {\n    \u003Cspan class=\"function\">stop_motors\u003C\u002Fspan>()\n    \u003Cspan class=\"function\">set_position\u003C\u002Fspan>(\u003Cspan class=\"number\">0\u003C\u002Fspan>)\n    \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"homed\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">true\u003C\u002Fspan>)\n    \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"is_homing\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">false\u003C\u002Fspan>)\n\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"move_after_home\"\u003C\u002Fspan>)) {\n        \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"move_after_home\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">false\u003C\u002Fspan>)\n        \u003Cspan class=\"variable\">pending_target\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"pending_target\"\u003C\u002Fspan>)\n        \u003Cspan class=\"function\">evaluate_target\u003C\u002Fspan>(\u003Cspan class=\"variable\">pending_target\u003C\u002Fspan>, \u003Cspan class=\"number\">0\u003C\u002Fspan>)\n    } \u003Cspan class=\"keyword\">else\u003C\u002Fspan> {\n        \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"at_target\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">true\u003C\u002Fspan>)\n    }\n}\n\n\u003Cspan class=\"keyword\">fn\u003C\u002Fspan> \u003Cspan class=\"function\">start_homing_sequence\u003C\u002Fspan>() {\n    \u003Cspan class=\"stdlib\">callback::clear\u003C\u002Fspan>()\n    \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"homed\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">false\u003C\u002Fspan>)\n    \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"at_target\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">false\u003C\u002Fspan>)\n    \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"is_homing\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">true\u003C\u002Fspan>)\n\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"stdlib\">input::get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"home_switch\"\u003C\u002Fspan>)) {\n        \u003Cspan class=\"function\">complete_homing\u003C\u002Fspan>()\n    } \u003Cspan class=\"keyword\">else\u003C\u002Fspan> {\n        \u003Cspan class=\"variable\">home_direction\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">config\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"home_direction\"\u003C\u002Fspan>) \u003Cspan class=\"comment\">\u002F\u002F 0=Forward, 1=Reverse\u003C\u002Fspan>\n        \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">home_direction\u003C\u002Fspan> \u003Cspan class=\"operator\">==\u003C\u002Fspan> \u003Cspan class=\"number\">0\u003C\u002Fspan>) {\n            \u003Cspan class=\"function\">start_forward\u003C\u002Fspan>()\n        } \u003Cspan class=\"keyword\">else\u003C\u002Fspan> {\n            \u003Cspan class=\"function\">start_reverse\u003C\u002Fspan>()\n        }\n    }\n}\n\n\u003Cspan class=\"comment\">\u002F\u002F Handle \"stop\" input first (dominant input)\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">channel\u003C\u002Fspan> \u003Cspan class=\"operator\">==\u003C\u002Fspan> \u003Cspan class=\"string\">\"stop\"\u003C\u002Fspan>) {\n    \u003Cspan class=\"variable\">prev_stop\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"prev_stop\"\u003C\u002Fspan>)\n\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">value\u003C\u002Fspan> \u003Cspan class=\"keyword\">and\u003C\u002Fspan> \u003Cspan class=\"operator\">!\u003C\u002Fspan>\u003Cspan class=\"variable\">prev_stop\u003C\u002Fspan>) {\n        \u003Cspan class=\"function\">stop_motors\u003C\u002Fspan>()\n        \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"is_homing\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">false\u003C\u002Fspan>)\n    }\n\n    \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"prev_stop\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">value\u003C\u002Fspan>)\n    \u003Cspan class=\"keyword\">return\u003C\u002Fspan>\n}\n\n\u003Cspan class=\"comment\">\u002F\u002F Check home_switch on every execution during homing (level-triggered)\u003C\u002Fspan>\n\u003Cspan class=\"comment\">\u002F\u002F This ensures homing completes even if the switch was already active\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"is_homing\"\u003C\u002Fspan>) \u003Cspan class=\"keyword\">and\u003C\u002Fspan> \u003Cspan class=\"stdlib\">input::get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"home_switch\"\u003C\u002Fspan>)) {\n    \u003Cspan class=\"function\">complete_homing\u003C\u002Fspan>()\n    \u003Cspan class=\"keyword\">return\u003C\u002Fspan>\n}\n\n\u003Cspan class=\"comment\">\u002F\u002F Handle \"home_switch\" input - stop motor when home switch activates outside homing\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">channel\u003C\u002Fspan> \u003Cspan class=\"operator\">==\u003C\u002Fspan> \u003Cspan class=\"string\">\"home_switch\"\u003C\u002Fspan>) {\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">value\u003C\u002Fspan> \u003Cspan class=\"keyword\">and\u003C\u002Fspan> \u003Cspan class=\"variable\">output\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"moving\"\u003C\u002Fspan>)) {\n        \u003Cspan class=\"function\">stop_motors\u003C\u002Fspan>()\n        \u003Cspan class=\"function\">set_position\u003C\u002Fspan>(\u003Cspan class=\"number\">0\u003C\u002Fspan>)\n        \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"homed\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">true\u003C\u002Fspan>)\n        \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"at_target\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">true\u003C\u002Fspan>)\n    }\n    \u003Cspan class=\"keyword\">return\u003C\u002Fspan>\n}\n\n\u003Cspan class=\"comment\">\u002F\u002F Handle \"home\" input\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">channel\u003C\u002Fspan> \u003Cspan class=\"operator\">==\u003C\u002Fspan> \u003Cspan class=\"string\">\"home\"\u003C\u002Fspan>) {\n    \u003Cspan class=\"variable\">prev_home\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"prev_home\"\u003C\u002Fspan>)\n\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">value\u003C\u002Fspan> \u003Cspan class=\"keyword\">and\u003C\u002Fspan> \u003Cspan class=\"operator\">!\u003C\u002Fspan>\u003Cspan class=\"variable\">prev_home\u003C\u002Fspan>) {\n        \u003Cspan class=\"function\">start_homing_sequence\u003C\u002Fspan>()\n    }\n\n    \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"prev_home\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">value\u003C\u002Fspan>)\n    \u003Cspan class=\"keyword\">return\u003C\u002Fspan>\n}\n\n\u003Cspan class=\"comment\">\u002F\u002F Handle \"encoder\" input\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">channel\u003C\u002Fspan> \u003Cspan class=\"operator\">==\u003C\u002Fspan> \u003Cspan class=\"string\">\"encoder\"\u003C\u002Fspan>) {\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">config\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"control_mode\"\u003C\u002Fspan>) \u003Cspan class=\"operator\">!=\u003C\u002Fspan> \u003Cspan class=\"number\">0\u003C\u002Fspan>) {\n        \u003Cspan class=\"keyword\">return\u003C\u002Fspan>\n    }\n\n    \u003Cspan class=\"variable\">prev_encoder\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"prev_encoder\"\u003C\u002Fspan>)\n\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">value\u003C\u002Fspan> \u003Cspan class=\"keyword\">and\u003C\u002Fspan> \u003Cspan class=\"operator\">!\u003C\u002Fspan>\u003Cspan class=\"variable\">prev_encoder\u003C\u002Fspan>) {\n        \u003Cspan class=\"comment\">\u002F\u002F Rising edge on encoder - count if motor is driving and not homing\u003C\u002Fspan>\n        \u003Cspan class=\"variable\">is_homing\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"is_homing\"\u003C\u002Fspan>)\n        \u003Cspan class=\"variable\">is_forward\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">output\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"forward\"\u003C\u002Fspan>)\n        \u003Cspan class=\"variable\">is_reverse\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">output\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"reverse\"\u003C\u002Fspan>)\n\n        \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"operator\">!\u003C\u002Fspan>\u003Cspan class=\"variable\">is_homing\u003C\u002Fspan> \u003Cspan class=\"keyword\">and\u003C\u002Fspan> (\u003Cspan class=\"variable\">is_forward\u003C\u002Fspan> \u003Cspan class=\"keyword\">or\u003C\u002Fspan> \u003Cspan class=\"variable\">is_reverse\u003C\u002Fspan>)) {\n            \u003Cspan class=\"variable\">position\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">output\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"position\"\u003C\u002Fspan>)\n\n            \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">is_forward\u003C\u002Fspan>) {\n                \u003Cspan class=\"variable\">position\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">position\u003C\u002Fspan> \u003Cspan class=\"operator\">+\u003C\u002Fspan> \u003Cspan class=\"number\">1\u003C\u002Fspan>\n            } \u003Cspan class=\"keyword\">else\u003C\u002Fspan> {\n                \u003Cspan class=\"variable\">position\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">position\u003C\u002Fspan> \u003Cspan class=\"operator\">-\u003C\u002Fspan> \u003Cspan class=\"number\">1\u003C\u002Fspan>\n            }\n\n            \u003Cspan class=\"function\">set_position\u003C\u002Fspan>(\u003Cspan class=\"variable\">position\u003C\u002Fspan>)\n\n            \u003Cspan class=\"variable\">enc_now\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">time::uptime\u003C\u002Fspan>()\n            \u003Cspan class=\"variable\">last_enc\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"last_encoder_pulse_time\"\u003C\u002Fspan>)\n            \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">last_enc\u003C\u002Fspan> \u003Cspan class=\"operator\">&gt;\u003C\u002Fspan> \u003Cspan class=\"number\">0\u003C\u002Fspan>) {\n                \u003Cspan class=\"variable\">enc_elapsed\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">enc_now\u003C\u002Fspan> \u003Cspan class=\"operator\">-\u003C\u002Fspan> \u003Cspan class=\"variable\">last_enc\u003C\u002Fspan>\n                \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">enc_elapsed\u003C\u002Fspan> \u003Cspan class=\"operator\">&gt;\u003C\u002Fspan> \u003Cspan class=\"number\">0\u003C\u002Fspan>) {\n                    \u003Cspan class=\"function\">set_rpm\u003C\u002Fspan>(\u003Cspan class=\"number\">1000.0\u003C\u002Fspan> \u003Cspan class=\"operator\">\u002F\u003C\u002Fspan> \u003Cspan class=\"variable\">enc_elapsed\u003C\u002Fspan>)\n                }\n            }\n            \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"last_encoder_pulse_time\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">enc_now\u003C\u002Fspan>)\n\n            \u003Cspan class=\"comment\">\u002F\u002F Check if at target\u003C\u002Fspan>\n            \u003Cspan class=\"variable\">target\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">input::get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"target\"\u003C\u002Fspan>)\n            \u003Cspan class=\"variable\">tolerance\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">config\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"position_tolerance\"\u003C\u002Fspan>)\n            \u003Cspan class=\"variable\">diff\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">target\u003C\u002Fspan> \u003Cspan class=\"operator\">-\u003C\u002Fspan> \u003Cspan class=\"variable\">position\u003C\u002Fspan>\n\n            \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">diff\u003C\u002Fspan> \u003Cspan class=\"operator\">&gt;=\u003C\u002Fspan> (\u003Cspan class=\"number\">0\u003C\u002Fspan> \u003Cspan class=\"operator\">-\u003C\u002Fspan> \u003Cspan class=\"variable\">tolerance\u003C\u002Fspan>) \u003Cspan class=\"keyword\">and\u003C\u002Fspan> \u003Cspan class=\"variable\">diff\u003C\u002Fspan> \u003Cspan class=\"operator\">&lt;=\u003C\u002Fspan> \u003Cspan class=\"variable\">tolerance\u003C\u002Fspan>) {\n                \u003Cspan class=\"function\">stop_motors\u003C\u002Fspan>()\n                \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"at_target\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">true\u003C\u002Fspan>)\n            }\n        }\n    }\n\n    \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"prev_encoder\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">value\u003C\u002Fspan>)\n    \u003Cspan class=\"keyword\">return\u003C\u002Fspan>\n}\n\n\u003Cspan class=\"comment\">\u002F\u002F Handle \"freq\" input (Frequency control mode)\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">channel\u003C\u002Fspan> \u003Cspan class=\"operator\">==\u003C\u002Fspan> \u003Cspan class=\"string\">\"freq\"\u003C\u002Fspan>) {\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">config\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"control_mode\"\u003C\u002Fspan>) \u003Cspan class=\"operator\">!=\u003C\u002Fspan> \u003Cspan class=\"number\">2\u003C\u002Fspan>) {\n        \u003Cspan class=\"keyword\">return\u003C\u002Fspan>\n    }\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"is_homing\"\u003C\u002Fspan>)) {\n        \u003Cspan class=\"keyword\">return\u003C\u002Fspan>\n    }\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"freq_finishing\"\u003C\u002Fspan>)) {\n        \u003Cspan class=\"keyword\">return\u003C\u002Fspan>\n    }\n\n    \u003Cspan class=\"variable\">is_forward\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">output\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"forward\"\u003C\u002Fspan>)\n    \u003Cspan class=\"variable\">is_reverse\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">output\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"reverse\"\u003C\u002Fspan>)\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"operator\">!\u003C\u002Fspan>\u003Cspan class=\"variable\">is_forward\u003C\u002Fspan> \u003Cspan class=\"keyword\">and\u003C\u002Fspan> \u003Cspan class=\"operator\">!\u003C\u002Fspan>\u003Cspan class=\"variable\">is_reverse\u003C\u002Fspan>) {\n        \u003Cspan class=\"keyword\">return\u003C\u002Fspan>\n    }\n\n    \u003Cspan class=\"stdlib\">callback::clear\u003C\u002Fspan>()\n\n    \u003Cspan class=\"variable\">now\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">time::uptime\u003C\u002Fspan>()\n    \u003Cspan class=\"variable\">last_time\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"last_freq_time\"\u003C\u002Fspan>)\n    \u003Cspan class=\"variable\">elapsed_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">now\u003C\u002Fspan> \u003Cspan class=\"operator\">-\u003C\u002Fspan> \u003Cspan class=\"variable\">last_time\u003C\u002Fspan>\n    \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"last_freq_time\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">now\u003C\u002Fspan>)\n\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">value\u003C\u002Fspan> \u003Cspan class=\"operator\">&lt;=\u003C\u002Fspan> \u003Cspan class=\"number\">0\u003C\u002Fspan> \u003Cspan class=\"keyword\">or\u003C\u002Fspan> \u003Cspan class=\"variable\">elapsed_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">&lt;=\u003C\u002Fspan> \u003Cspan class=\"number\">0\u003C\u002Fspan>) {\n        \u003Cspan class=\"keyword\">return\u003C\u002Fspan>\n    }\n\n    \u003Cspan class=\"variable\">pulse_count\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">value\u003C\u002Fspan> \u003Cspan class=\"operator\">*\u003C\u002Fspan> \u003Cspan class=\"variable\">elapsed_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">\u002F\u003C\u002Fspan> \u003Cspan class=\"number\">1000.0\u003C\u002Fspan> \u003Cspan class=\"operator\">+\u003C\u002Fspan> \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"fractional_pulses\"\u003C\u002Fspan>)\n    \u003Cspan class=\"variable\">whole_steps\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">math::round\u003C\u002Fspan>(\u003Cspan class=\"variable\">pulse_count\u003C\u002Fspan>)\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">pulse_count\u003C\u002Fspan> \u003Cspan class=\"operator\">&lt;\u003C\u002Fspan> \u003Cspan class=\"variable\">whole_steps\u003C\u002Fspan>) {\n        \u003Cspan class=\"variable\">whole_steps\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">whole_steps\u003C\u002Fspan> \u003Cspan class=\"operator\">-\u003C\u002Fspan> \u003Cspan class=\"number\">1.0\u003C\u002Fspan>\n    }\n    \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"fractional_pulses\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">pulse_count\u003C\u002Fspan> \u003Cspan class=\"operator\">-\u003C\u002Fspan> \u003Cspan class=\"variable\">whole_steps\u003C\u002Fspan>)\n\n    \u003Cspan class=\"variable\">pulse_time\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"number\">1000.0\u003C\u002Fspan> \u003Cspan class=\"operator\">\u002F\u003C\u002Fspan> \u003Cspan class=\"variable\">value\u003C\u002Fspan>\n    \u003Cspan class=\"function\">set_rpm\u003C\u002Fspan>(\u003Cspan class=\"variable\">value\u003C\u002Fspan>)\n    \u003Cspan class=\"variable\">sample_count\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"freq_sample_count\"\u003C\u002Fspan>) \u003Cspan class=\"operator\">+\u003C\u002Fspan> \u003Cspan class=\"number\">1\u003C\u002Fspan>\n    \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"freq_sample_count\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">sample_count\u003C\u002Fspan>)\n    \u003Cspan class=\"variable\">avg_pt\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"avg_pulse_time_ms\"\u003C\u002Fspan>)\n    \u003Cspan class=\"variable\">config_pt\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">config\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"pulse_time_forward\"\u003C\u002Fspan>) \u003Cspan class=\"operator\">*\u003C\u002Fspan> \u003Cspan class=\"number\">1000.0\u003C\u002Fspan>\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">is_reverse\u003C\u002Fspan>) {\n        \u003Cspan class=\"variable\">config_pt\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">config\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"pulse_time_reverse\"\u003C\u002Fspan>) \u003Cspan class=\"operator\">*\u003C\u002Fspan> \u003Cspan class=\"number\">1000.0\u003C\u002Fspan>\n    }\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">pulse_time\u003C\u002Fspan> \u003Cspan class=\"operator\">&gt;\u003C\u002Fspan> \u003Cspan class=\"variable\">config_pt\u003C\u002Fspan> \u003Cspan class=\"operator\">\u002F\u003C\u002Fspan> \u003Cspan class=\"number\">2.0\u003C\u002Fspan> \u003Cspan class=\"keyword\">and\u003C\u002Fspan> \u003Cspan class=\"variable\">pulse_time\u003C\u002Fspan> \u003Cspan class=\"operator\">&lt;\u003C\u002Fspan> \u003Cspan class=\"variable\">config_pt\u003C\u002Fspan> \u003Cspan class=\"operator\">*\u003C\u002Fspan> \u003Cspan class=\"number\">2.0\u003C\u002Fspan>) {\n        \u003Cspan class=\"variable\">avg_pt\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">avg_pt\u003C\u002Fspan> \u003Cspan class=\"operator\">+\u003C\u002Fspan> (\u003Cspan class=\"variable\">pulse_time\u003C\u002Fspan> \u003Cspan class=\"operator\">-\u003C\u002Fspan> \u003Cspan class=\"variable\">avg_pt\u003C\u002Fspan>) \u003Cspan class=\"operator\">\u002F\u003C\u002Fspan> (\u003Cspan class=\"variable\">sample_count\u003C\u002Fspan> \u003Cspan class=\"operator\">*\u003C\u002Fspan> \u003Cspan class=\"number\">1.0\u003C\u002Fspan>)\n        \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"avg_pulse_time_ms\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">avg_pt\u003C\u002Fspan>)\n    }\n\n    \u003Cspan class=\"variable\">position\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">output\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"position\"\u003C\u002Fspan>)\n    \u003Cspan class=\"variable\">target\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"move_target\"\u003C\u002Fspan>)\n\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">is_forward\u003C\u002Fspan>) {\n        \u003Cspan class=\"variable\">position\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">position\u003C\u002Fspan> \u003Cspan class=\"operator\">+\u003C\u002Fspan> \u003Cspan class=\"variable\">whole_steps\u003C\u002Fspan>\n        \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">position\u003C\u002Fspan> \u003Cspan class=\"operator\">&gt;=\u003C\u002Fspan> \u003Cspan class=\"variable\">target\u003C\u002Fspan>) {\n            \u003Cspan class=\"variable\">position\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">target\u003C\u002Fspan>\n        }\n    } \u003Cspan class=\"keyword\">else\u003C\u002Fspan> {\n        \u003Cspan class=\"variable\">position\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">position\u003C\u002Fspan> \u003Cspan class=\"operator\">-\u003C\u002Fspan> \u003Cspan class=\"variable\">whole_steps\u003C\u002Fspan>\n        \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">position\u003C\u002Fspan> \u003Cspan class=\"operator\">&lt;=\u003C\u002Fspan> \u003Cspan class=\"variable\">target\u003C\u002Fspan>) {\n            \u003Cspan class=\"variable\">position\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">target\u003C\u002Fspan>\n        }\n    }\n    \u003Cspan class=\"function\">set_position\u003C\u002Fspan>(\u003Cspan class=\"variable\">position\u003C\u002Fspan>)\n\n    \u003Cspan class=\"variable\">remaining\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">target\u003C\u002Fspan> \u003Cspan class=\"operator\">-\u003C\u002Fspan> \u003Cspan class=\"variable\">position\u003C\u002Fspan>\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">remaining\u003C\u002Fspan> \u003Cspan class=\"operator\">&lt;\u003C\u002Fspan> \u003Cspan class=\"number\">0\u003C\u002Fspan>) {\n        \u003Cspan class=\"variable\">remaining\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"number\">0\u003C\u002Fspan> \u003Cspan class=\"operator\">-\u003C\u002Fspan> \u003Cspan class=\"variable\">remaining\u003C\u002Fspan>\n    }\n    \u003Cspan class=\"variable\">tolerance\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">config\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"position_tolerance\"\u003C\u002Fspan>)\n\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">remaining\u003C\u002Fspan> \u003Cspan class=\"operator\">&lt;=\u003C\u002Fspan> \u003Cspan class=\"variable\">tolerance\u003C\u002Fspan>) {\n        \u003Cspan class=\"function\">stop_motors\u003C\u002Fspan>()\n        \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"at_target\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">true\u003C\u002Fspan>)\n        \u003Cspan class=\"keyword\">return\u003C\u002Fspan>\n    }\n\n    \u003Cspan class=\"variable\">remaining_time_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">remaining\u003C\u002Fspan> \u003Cspan class=\"operator\">*\u003C\u002Fspan> \u003Cspan class=\"variable\">avg_pt\u003C\u002Fspan>\n    \u003Cspan class=\"stdlib\">callback::set\u003C\u002Fspan>(\u003Cspan class=\"stdlib\">math::round\u003C\u002Fspan>(\u003Cspan class=\"variable\">remaining_time_ms\u003C\u002Fspan>), \u003Cspan class=\"string\">\"onFreqFinish\"\u003C\u002Fspan>, \u003Cspan class=\"number\">0\u003C\u002Fspan>)\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">remaining_time_ms\u003C\u002Fspan> \u003Cspan class=\"operator\">&lt;\u003C\u002Fspan> \u003Cspan class=\"variable\">elapsed_ms\u003C\u002Fspan>) {\n        \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"freq_finishing\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">true\u003C\u002Fspan>)\n    }\n\n    \u003Cspan class=\"keyword\">return\u003C\u002Fspan>\n}\n\n\u003Cspan class=\"comment\">\u002F\u002F Handle \"target\" input\u003C\u002Fspan>\n\u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">channel\u003C\u002Fspan> \u003Cspan class=\"operator\">==\u003C\u002Fspan> \u003Cspan class=\"string\">\"target\"\u003C\u002Fspan>) {\n    \u003Cspan class=\"variable\">is_homing\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"is_homing\"\u003C\u002Fspan>)\n    \u003Cspan class=\"variable\">home_before_move\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"stdlib\">input::get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"home_before_move\"\u003C\u002Fspan>)\n\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">config\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"control_mode\"\u003C\u002Fspan>) \u003Cspan class=\"operator\">!=\u003C\u002Fspan> \u003Cspan class=\"number\">0\u003C\u002Fspan> \u003Cspan class=\"keyword\">and\u003C\u002Fspan> \u003Cspan class=\"variable\">output\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"moving\"\u003C\u002Fspan>)) {\n        \u003Cspan class=\"function\">stop_motors\u003C\u002Fspan>()\n        \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"is_homing\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">false\u003C\u002Fspan>)\n        \u003Cspan class=\"variable\">is_homing\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"boolean\">false\u003C\u002Fspan>\n    }\n\n    \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">home_before_move\u003C\u002Fspan>) {\n        \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">is_homing\u003C\u002Fspan>) {\n            \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"pending_target\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">value\u003C\u002Fspan>)\n            \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"move_after_home\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">true\u003C\u002Fspan>)\n            \u003Cspan class=\"keyword\">return\u003C\u002Fspan>\n        }\n\n        \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">output\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"moving\"\u003C\u002Fspan>)) {\n            \u003Cspan class=\"function\">stop_motors\u003C\u002Fspan>()\n        }\n\n        \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"stdlib\">input::get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"home_switch\"\u003C\u002Fspan>)) {\n            \u003Cspan class=\"function\">set_position\u003C\u002Fspan>(\u003Cspan class=\"number\">0\u003C\u002Fspan>)\n            \u003Cspan class=\"stdlib\">output::set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"homed\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">true\u003C\u002Fspan>)\n            \u003Cspan class=\"function\">evaluate_target\u003C\u002Fspan>(\u003Cspan class=\"variable\">value\u003C\u002Fspan>, \u003Cspan class=\"number\">0\u003C\u002Fspan>)\n        } \u003Cspan class=\"keyword\">else\u003C\u002Fspan> {\n            \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"pending_target\"\u003C\u002Fspan>, \u003Cspan class=\"variable\">value\u003C\u002Fspan>)\n            \u003Cspan class=\"variable\">state\u003C\u002Fspan>::\u003Cspan class=\"function\">set\u003C\u002Fspan>(\u003Cspan class=\"string\">\"move_after_home\"\u003C\u002Fspan>, \u003Cspan class=\"boolean\">true\u003C\u002Fspan>)\n            \u003Cspan class=\"function\">start_homing_sequence\u003C\u002Fspan>()\n        }\n    } \u003Cspan class=\"keyword\">else\u003C\u002Fspan> {\n        \u003Cspan class=\"variable\">homed\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">output\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"homed\"\u003C\u002Fspan>)\n        \u003Cspan class=\"keyword\">if\u003C\u002Fspan> (\u003Cspan class=\"variable\">homed\u003C\u002Fspan> \u003Cspan class=\"keyword\">and\u003C\u002Fspan> \u003Cspan class=\"operator\">!\u003C\u002Fspan>\u003Cspan class=\"variable\">is_homing\u003C\u002Fspan>) {\n            \u003Cspan class=\"variable\">position\u003C\u002Fspan> \u003Cspan class=\"operator\">=\u003C\u002Fspan> \u003Cspan class=\"variable\">output\u003C\u002Fspan>::\u003Cspan class=\"function\">get\u003C\u002Fspan>(\u003Cspan class=\"string\">\"position\"\u003C\u002Fspan>)\n            \u003Cspan class=\"function\">evaluate_target\u003C\u002Fspan>(\u003Cspan class=\"variable\">value\u003C\u002Fspan>, \u003Cspan class=\"variable\">position\u003C\u002Fspan>)\n        }\n    }\n\n    \u003Cspan class=\"keyword\">return\u003C\u002Fspan>\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\n\u003C\u002Fdetails>\n",[909,911,913,916,919],{"level":81,"text":253,"id":910},"inputs",{"level":81,"text":544,"id":912},"outputs",{"level":81,"text":914,"id":915},"Konfiguracja","configuration",{"level":81,"text":917,"id":918},"Stan","state",{"level":81,"text":920,"id":921},"Kod źródłowy","source-code",{"block":923,"labels":987,"spec":1006},{"group":305,"id":465,"inputs":924,"ioType":954,"name":464,"outputs":955},[925,930,935,938,942,946,950],{"abbrev":926,"id":927,"name":928,"type":929},"TG","target","Cel","NUMBER",{"abbrev":931,"id":932,"name":933,"type":934},"E","encoder","Enkoder","BOOLEAN",{"abbrev":936,"id":70,"name":937,"type":934},"H","Bazowanie",{"abbrev":939,"id":940,"name":941,"type":934},"HS","home_switch","Czujnik bazowy",{"abbrev":943,"id":944,"name":945,"type":934},"S","stop","Stop",{"abbrev":947,"id":948,"name":949,"type":934},"HB","home_before_move","Bazowanie przed ruchem",{"abbrev":951,"id":952,"name":953,"type":929},"FQ","freq","Częstotliwość",null,[956,960,964,968,972,976,980,984],{"abbrev":957,"id":958,"name":959,"type":934},"F","forward","Do przodu",{"abbrev":961,"id":962,"name":963,"type":934},"R","reverse","Do tyłu",{"abbrev":965,"id":966,"name":967,"type":929},"P","position","Pozycja",{"abbrev":969,"id":970,"name":971,"type":934},"AT","at_target","Na celu",{"abbrev":973,"id":974,"name":975,"type":934},"HD","homed","Zbazowany",{"abbrev":977,"id":978,"name":979,"type":934},"M","moving","W ruchu",{"abbrev":981,"id":982,"name":983,"type":929},"PP","position_pct","Pozycja %",{"abbrev":985,"id":986,"name":985,"type":929},"RPM","rpm",{"config":988,"detail":996,"port":1001,"sections":1003,"state":1005},{"default":989,"description":990,"details":991,"id":992,"name":993,"type":994,"unit":995},"Domyślnie","Opis","Szczegóły","ID","Nazwa","Typ","Jednostka",{"required":997,"subtype":998,"values":999,"visible_when":1000},"Wymagane","Podtyp","Wartości","Widoczne gdy",{"abbrev":1002,"default":989,"description":990,"id":992,"name":993,"type":994},"Skrót",{"configuration":914,"inputs":253,"outputs":544,"source_code":920,"state":917,"view_source":1004},"Pokaż kod Volang",{"default":989,"description":990,"id":992,"name":993,"type":994,"unit":995},{"config":1007,"inputs":1079,"outputs":1095,"state":1112},[1008,1019,1028,1037,1049,1058,1065,1072],{"default":1009,"description":1010,"details":1011,"id":1015,"name":1016,"type":1017,"unit":1018},"0","Kierunek silnika podczas sekwencji bazowania.",{"enumValues":1012},[1013,1014],"Forward","Reverse","home_direction","Kierunek bazowania","ENUM","",{"default":1009,"description":1020,"details":1021,"id":1026,"name":1027,"type":929,"unit":1018},"Maksymalna dopuszczalna odległość od pozycji docelowej, aby uznać ją za osiągniętą. 0 oznacza dokładne dopasowanie.",{"rules":1022},[1023],{"kind":1024,"op":1025,"value":69},"compare","≥","position_tolerance","Tolerancja pozycji",{"default":1009,"description":1029,"details":1030,"id":1035,"name":1036,"type":1017,"unit":1018},"Enkoder: pozycja ze zliczania impulsów. Czasowy: wewnętrznie taktowane kroki. Częstotliwościowy: pozycja z wejść Hz, z estymacją czasową na końcu dojazdu.",{"enumValues":1031},[1032,1033,1034],"Encoder","Time-based","Frequency","control_mode","Tryb sterowania",{"default":1038,"description":1039,"details":1040,"id":1046,"name":1047,"type":929,"unit":1048},"0.1","Czas jednego kroku do przodu. Używane w trybie czasowym i częstotliwościowym. W trybie częstotliwościowym jako estymata początkowa.",{"rules":1041,"visibleWhen":1044},[1042],{"kind":1024,"op":1043,"value":69},">",{"configId":1035,"values":1045},[1033,1034],"pulse_time_forward","Czas impulsu do przodu","s",{"default":1038,"description":1050,"details":1051,"id":1056,"name":1057,"type":929,"unit":1048},"Czas jednego kroku do tyłu. Używane w trybie czasowym i częstotliwościowym. W trybie częstotliwościowym jako estymata początkowa.",{"rules":1052,"visibleWhen":1054},[1053],{"kind":1024,"op":1043,"value":69},{"configId":1035,"values":1055},[1033,1034],"pulse_time_reverse","Czas impulsu do tyłu",{"default":1009,"description":1059,"details":1060,"id":1063,"name":1064,"type":929,"unit":1048},"Czas pauzy między zmianami kierunku w celu ochrony silnika. Silnik zatrzymuje się na ten okres przed uruchomieniem w przeciwnym kierunku. Ustaw 0, aby wyłączyć.",{"rules":1061},[1062],{"kind":1024,"op":1025,"value":69},"motor_lock_duration","Czas blokady silnika",{"default":1009,"description":1066,"details":1067,"id":1070,"name":1071,"type":929,"unit":1018},"Liczba kroków odpowiadająca 100% zakresu ruchu osi. Wartość 0 wyłącza procentowe wyjście pozycji.",{"rules":1068},[1069],{"kind":1024,"op":1025,"value":69},"full_travel_steps","Pełny zakres kroków",{"default":1009,"description":1073,"details":1074,"id":1077,"name":1078,"type":929,"unit":1018},"Liczba impulsów enkodera\u002Fczęstotliwości na jeden pełny obrót wału. Wartość 0 wyłącza wyjście RPM.",{"rules":1075},[1076],{"kind":1024,"op":1025,"value":69},"steps_per_revolution","Impulsy na obrót",[1080,1082,1085,1087,1089,1091,1093],{"abbrev":926,"default":1009,"description":1081,"id":927,"name":928,"type":929},"Pozycja docelowa w impulsach enkodera. Ruch rozpoczyna się automatycznie po bazowaniu.",{"abbrev":931,"default":1083,"description":1084,"id":932,"name":933,"type":934},"false","Surowe wejście impulsów enkodera. Każde zbocze narastające liczy jeden krok w bieżącym kierunku silnika.",{"abbrev":936,"default":1083,"description":1086,"id":70,"name":937,"type":934},"Wejście impulsowe. Zbocze narastające rozpoczyna sekwencję bazowania, poruszając silnik w skonfigurowanym kierunku aż do aktywacji czujnika bazowego.",{"abbrev":939,"default":1083,"description":1088,"id":940,"name":941,"type":934},"Aktywny (true), gdy oś znajduje się w pozycji bazowej\u002Freferencyjnej. Używany podczas bazowania do wykrywania osiągnięcia punktu referencyjnego.",{"abbrev":943,"default":1083,"description":1090,"id":944,"name":945,"type":934},"Wejście impulsowe. Zbocze narastające zatrzymuje wszelki ruch i anuluje bazowanie. Wejście dominujące. Pozycja i status bazowania są zachowywane.",{"abbrev":947,"default":1083,"description":1092,"id":948,"name":949,"type":934},"Gdy aktywne, silnik automatycznie bazuje przed każdym ruchem do nowego celu. Jeśli czujnik bazowy jest już aktywny, ruch rozpoczyna się natychmiast od pozycji zero. W przeciwnym razie silnik najpierw bazuje, a następnie jedzie do celu.",{"abbrev":951,"default":1009,"description":1094,"id":952,"name":953,"type":929},"Częstotliwość impulsów w Hz. Używane w trybie częstotliwościowym. Pozycja obliczana z częstotliwości i czasu, z estymacją czasową na końcu.",[1096,1098,1100,1102,1104,1106,1108,1110],{"abbrev":957,"default":1083,"description":1097,"id":958,"name":959,"type":934},"Aktywne, gdy silnik powinien napędzać w kierunku dodatnim.",{"abbrev":961,"default":1083,"description":1099,"id":962,"name":963,"type":934},"Aktywne, gdy silnik powinien napędzać w kierunku ujemnym.",{"abbrev":965,"default":1009,"description":1101,"id":966,"name":967,"type":929},"Bieżąca pozycja w impulsach enkodera.",{"abbrev":969,"default":1083,"description":1103,"id":970,"name":971,"type":934},"Prawda, gdy bieżąca pozycja mieści się w skonfigurowanej tolerancji od pozycji docelowej.",{"abbrev":973,"default":1083,"description":1105,"id":974,"name":975,"type":934},"Prawda po pomyślnym zakończeniu sekwencji bazowania.",{"abbrev":977,"default":1083,"description":1107,"id":978,"name":979,"type":934},"Prawda, gdy silnik aktywnie napędza w dowolnym kierunku.",{"abbrev":981,"default":1009,"description":1109,"id":982,"name":983,"type":929},"Bieżąca pozycja jako procent (0-100) skonfigurowanej pełnej długości ruchu.",{"abbrev":985,"default":1009,"description":1111,"id":986,"name":985,"type":929},"Bieżąca prędkość obrotowa silnika w obrotach na minutę.",[1113,1117,1121,1125,1129,1133,1137,1141,1145,1149,1153,1157,1161,1165,1169,1174,1178,1182,1186],{"default":1083,"description":1114,"id":1115,"name":1116,"type":934,"unit":1018},"Przechowuje poprzedni stan wejścia enkodera w celu wykrywania zboczy narastających.","prev_encoder","Poprzedni stan enkodera",{"default":1083,"description":1118,"id":1119,"name":1120,"type":934,"unit":1018},"Przechowuje poprzedni stan wejścia bazowania w celu wykrywania zboczy narastających.","prev_home","Poprzedni stan bazowania",{"default":1083,"description":1122,"id":1123,"name":1124,"type":934,"unit":1018},"Przechowuje poprzedni stan wejścia stopu w celu wykrywania zboczy narastających.","prev_stop","Poprzedni stan stopu",{"default":1083,"description":1126,"id":1127,"name":1128,"type":934,"unit":1018},"Prawda, gdy sekwencja bazowania jest w trakcie realizacji.","is_homing","Bazowanie w toku",{"default":1009,"description":1130,"id":1131,"name":1132,"type":929,"unit":1018},"Przechowuje pozycję docelową, do której silnik ma się przemieścić po zakończeniu bazowania.","pending_target","Oczekujący cel",{"default":1083,"description":1134,"id":1135,"name":1136,"type":934,"unit":1018},"Prawda, gdy silnik powinien automatycznie ruszyć do oczekującego celu po zakończeniu bazowania.","move_after_home","Ruch po bazowaniu",{"default":1009,"description":1138,"id":1139,"name":1140,"type":929,"unit":1018},"Czas działania systemu, kiedy rozpoczął się bieżący ruch czasowy. Używane do obliczania czasu, który upłynął, w celu śledzenia pozycji.","move_start_time","Czas rozpoczęcia ruchu",{"default":1009,"description":1142,"id":1143,"name":1144,"type":929,"unit":1018},"Pozycja w momencie rozpoczęcia bieżącego ruchu czasowego. Używane z czasem, który upłynął, do obliczania bieżącej pozycji.","move_start_position","Pozycja początkowa ruchu",{"default":1009,"description":1146,"id":1147,"name":1148,"type":929,"unit":1018},"Pozycja docelowa dla bieżącego ruchu czasowego.","move_target","Cel ruchu",{"default":1083,"description":1150,"id":1151,"name":1152,"type":934,"unit":1018},"Prawda, jeśli ostatni ruch silnika był w kierunku do przodu. Używane do obliczania opóźnienia blokady silnika.","was_forward","Był do przodu",{"default":1009,"description":1154,"id":1155,"name":1156,"type":929,"unit":1018},"Czas działania systemu, kiedy silnik ostatnio się zatrzymał. Używane do obliczania opóźnienia blokady silnika.","last_stop_time","Czas ostatniego zatrzymania",{"default":1009,"description":1158,"id":1159,"name":1160,"type":929,"unit":1018},"Pozycja docelowa przechowywana podczas oczekiwania na zakończenie opóźnienia blokady silnika.","lock_target","Cel blokady",{"default":1009,"description":1162,"id":1163,"name":1164,"type":929,"unit":1018},"Bieżąca pozycja przechowywana podczas oczekiwania na zakończenie opóźnienia blokady silnika.","lock_position","Pozycja blokady",{"default":1009,"description":1166,"id":1167,"name":1168,"type":929,"unit":1018},"Czas działania systemu, kiedy otrzymano ostatnie wejście częstotliwości lub rozpoczęto ruch.","last_freq_time","Czas ostatniego wejścia częstotliwości",{"default":1170,"description":1171,"id":1172,"name":1173,"type":929,"unit":1018},"0.0","Bieżąca średnia czasu trwania impulsu w milisekundach, obliczona z wejść częstotliwości podczas ruchu.","avg_pulse_time_ms","Średni czas impulsu",{"default":1009,"description":1175,"id":1176,"name":1177,"type":929,"unit":1018},"Liczba próbek wejścia częstotliwości otrzymanych podczas bieżącego ruchu.","freq_sample_count","Liczba próbek częstotliwości",{"default":1083,"description":1179,"id":1180,"name":1181,"type":934,"unit":1018},"Prawda, gdy blok przełączył się na estymację czasową w końcowej fazie dojazdu w trybie częstotliwościowym.","freq_finishing","Kończenie częstotliwościowe",{"default":1009,"description":1183,"id":1184,"name":1185,"type":929,"unit":1018},"Skumulowana reszta ułamkowa z obliczeń częstotliwości na impulsy.","fractional_pulses","Ułamkowe impulsy",{"default":1009,"description":1187,"id":1188,"name":1189,"type":929,"unit":1018},"Czas systemowy ostatniego zbocza narastającego enkodera. Używane do obliczania RPM.","last_encoder_pulse_time","Czas ostatniego impulsu enkodera",1777471509271]