{"id":1141,"date":"2016-01-30T14:18:01","date_gmt":"2016-01-30T14:18:01","guid":{"rendered":"http:\/\/wp.andreas.bieri.name\/myblog\/?p=1141"},"modified":"2017-12-09T19:16:24","modified_gmt":"2017-12-09T18:16:24","slug":"democode-menufuhrung-mit-state-machine","status":"publish","type":"post","link":"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/30\/democode-menufuhrung-mit-state-machine\/","title":{"rendered":"Democode: Men\u00fcf\u00fchrung mit State Machine"},"content":{"rendered":"<p>Dies ist ein Arduino Testprogramm f\u00fcr die \u00a0Menuf\u00fchrung mit State Machine und Multifunktionstasten, typischerweise auf einem CD Display und 3 Tasten. Die Code entprellt die Tasteneingaben und kann zwischen kurzen und langen Tastendr\u00fccken unterschieden. Ein langer Druck l\u00f6st eine Wiederholung aus (z.B. f\u00fcr das Hochz\u00e4hlen eines Wertes). Vorausgesetzt wird die die Library f\u00fcr die Tastenentprellung Keys, siehe die beiden Artikel in diesem Blog zum Thema Tastenentprellung.<\/p>\n<p>F\u00fcr die prof. Erstellung von State Machines sind andere Werkzeuge n\u00f6tig (siehe Links am Schluss).<\/p>\n<p><strong>FSM-1.c<\/strong><\/p>\n<pre>#include \"FSM-1.h\"\r\n#include \"Keys.h\"\r\n\r\n\/\/ LCD module connections\r\nsbit LCD_RS at PORTD2_bit;\r\nsbit LCD_EN at PORTD3_bit;\r\nsbit LCD_D4 at PORTD4_bit;\r\nsbit LCD_D5 at PORTD5_bit;\r\nsbit LCD_D6 at PORTD6_bit;\r\nsbit LCD_D7 at PORTD7_bit;\r\nsbit LCD_RS_Direction at DDD2_bit;\r\nsbit LCD_EN_Direction at DDD3_bit;\r\nsbit LCD_D4_Direction at DDD4_bit;\r\nsbit LCD_D5_Direction at DDD5_bit;\r\nsbit LCD_D6_Direction at DDD6_bit;\r\nsbit LCD_D7_Direction at DDD7_bit;\r\n\/\/ --------------------------- LCD end ------------------------------\r\n<\/pre>\n<pre>\/\/ alle States\r\ntypedef enum {stSTART, stSETUP, stMAIN, stSHORT, stOFF, stLOWIN, stMENUINFO} StateType;\r\n\/\/ Zeigertabelle f\u00fcr die Updatefunktionen\r\nvoid (*StateAction[])() = {fSTART, fSETUP, fMAIN, fSHORT, fOFF, fLOWIN, fMENUINFO};\r\n\/\/ Zeigertabelle f\u00fcr die On Entry Funktionen\r\nvoid (*StateEntry[])() = {fSTART_ENTRY, fSETUP_ENTRY, fMAIN_ENTRY, fGEN_ENTRY, fGEN_ENTRY, fGEN_ENTRY, fMENUINFO_ENTRY};\r\n\/\/ Zeigertabelle f\u00fcr die On Exit Funktionen\r\nvoid (*StateExit[])() = {fGEN_EXIT, fGEN_EXIT, fGEN_EXIT, fGEN_EXIT, fGEN_EXIT, fGEN_EXIT, fMENUINFO_EXIT};\r\n\/\/ Tabelle der Statusnamem zum Drucken\/Debuggen\r\nchar *StateNames[] = {\"START\", \"SETUP\", \"MAIN\", \"SHORT\", \"OFF\", \"LOWIN\", \"MENUINFO\"};\r\n\r\nStateType lastState, currState, nextState;\r\n\r\nchar txt1[] = \"LCD State Machine\";\r\nchar txt2[] = \"Andreas Bieri\";\r\nchar level = 'a';\r\n<\/pre>\n<pre>void setup() \/\/ keine State Funktion\r\n{\r\n\/\/ Keys\r\nKEY_DDR &amp;= ~ALL_KEYS; \/\/ konfigure key port for input\r\nKEY_PORT |= ALL_KEYS; \/\/ and turn on pull up resistors\r\nTCCR0 = (1&lt;&lt;CS02)|(1&lt;&lt;CS00); \/\/ divide by 1024\r\nTIMSK = 1&lt;&lt;TOIE0; \/\/ enable timer interrupt\r\nSEI;\r\n\/\/ LCD\r\nLcd_Init(); \/\/ Initialize LCD\r\n}\r\n<\/pre>\n<pre>void fNOOP()\r\n{\r\n}\r\n<\/pre>\n<pre>void fGEN_ENTRY()\r\n{\r\nLcd_Cmd(_LCD_CLEAR);\r\nLcd_Out(1,1, \"ENTRY\"); Lcd_Out(1,7,StateNames[currState]);\r\nDelay_ms(1000); \/\/ One second pause\r\nreset_all_keys(); \/\/ ignore all pressed keys\r\n}\r\n\r\nvoid fGEN_EXIT()\r\n{\r\nLcd_Cmd(_LCD_CLEAR);\r\nLcd_Out(1,1, \"EXIT\"); Lcd_Out(1,7,StateNames[currState]);\r\nDelay_ms(1000); \/\/ One second pause\r\n}\r\n<\/pre>\n<pre>void fSTART_ENTRY()\r\n{\r\nLcd_Cmd(_LCD_CLEAR); \/\/ Clear display\r\nLcd_Cmd(_LCD_CURSOR_OFF); \/\/ Cursor off\r\nLcd_Out(1,1,txt1); \/\/ Write text in first row\r\nLcd_Out(2,1,txt2); \/\/ Write text in second row\r\nDelay_ms(2000);\r\n}\r\n\r\nvoid fSTART()\r\n{\r\nnextState = stMAIN;\r\nDelay_ms(1000); \/\/ One second pause\r\n}\r\n<\/pre>\n<pre>void fMAIN_ENTRY()\r\n{\r\nLcd_Cmd(_LCD_CLEAR);\r\nLcd_Cmd(_LCD_BLINK_CURSOR_ON); \/\/ Cursor on\r\nLcd_Out(1,1,\" Hauptloop\");\r\nLcd_Out(2,1,\" Menu: PB1 lang\");\r\nDelay_ms(1000); \/\/ One second pause\r\nreset_all_keys(); \/\/ ignore all pressed keys\r\n}\r\nvoid fMAIN()\r\n{\r\n\/\/ Main Key handler\r\nif( get_key_long (1&lt;&lt;KEY1 )) \/\/ langer Tastendruck f\u00fcr Menu\r\nnextState = stMENUINFO;\r\n}\r\n<\/pre>\n<pre>void fSETUP_ENTRY()\r\n{\r\nLcd_Cmd(_LCD_CLEAR);\r\nLcd_Cmd(_LCD_BLINK_CURSOR_ON);\r\nLcd_Out(1,1,\"Setup. +PB2 -PB0\");\r\nLcd_Out(2,1,\"Info:PB1 Char: \");\r\nDelay_ms(1000); \/\/ One second pause\r\nreset_all_keys(); \/\/ ignore all pressed keys\r\n}\r\n\r\nvoid fSETUP()\r\n{\r\nint update = 0;\r\nif( get_key_short( 1&lt;&lt;KEY1 )) \/\/ kurzer Tastendruck\r\nnextState = stMENUINFO;\r\nif( get_key_press( 1&lt;&lt;KEY2 ) || get_key_rpt( 1&lt;&lt;KEY2 )) \/\/ kurzer oder repeat\r\n{ update = 1;\r\nlevel++;\r\n}\r\nif( get_key_press( 1&lt;&lt;KEY0 ) || get_key_rpt( 1&lt;&lt;KEY0 )) \/\/ kurzer oder repeat\r\n{ update = 1;\r\nlevel--;\r\n}\r\nif (update &gt; 0)\r\n{ Lcd_Cmd(_LCD_MOVE_CURSOR_LEFT);\r\nLcd_Chr_CP(level);\r\n}\r\n}\r\n<\/pre>\n<pre>void fSHORT()\r\n{\r\nDelay_ms(1000); \/\/ One second pause\r\nnextState = stOFF;\r\n}\r\n<\/pre>\n<pre>void fOFF()\r\n{\r\nDelay_ms(1000); \/\/ One second pause\r\nnextState = stLOWIN;\r\n}\r\n<\/pre>\n<pre>void fLOWIN()\r\n{\r\nDelay_ms(1000); \/\/ One second pause\r\nnextState = stMENUINFO;\r\n}\r\n<\/pre>\n<pre>void fMENUINFO_ENTRY()\r\n{\r\nLcd_Cmd(_LCD_CLEAR);\r\nLcd_Cmd(_LCD_BLINK_CURSOR_ON);\r\nLcd_Out(1,1,\"Info. Setup: PB1S\");\r\nLcd_Out(2,1,\"Main: PB0S\");\r\nDelay_ms(1000); \/\/ One second pause\r\nreset_all_keys(); \/\/ ignore all pressed keys\r\n}\r\n\r\nvoid fMENUINFO()\r\n{\r\nif( get_key_short( 1&lt;&lt;KEY0 )) \/\/ kurzer Tastendruck\r\nnextState = stMAIN;\r\nif( get_key_short( 1&lt;&lt;KEY1 )) \/\/ kurzer Tastendruck\r\nnextState = stSETUP;\r\n}\r\n\r\nvoid fMENUINFO_EXIT()\r\n{\r\nLcd_Cmd(_LCD_CLEAR);\r\nLcd_Out(1,1,StateNames[currState]);\r\nLcd_Out(2,1, \"EXIT\");\r\nDelay_ms(1000); \/\/ One second pause\r\n}\r\n<\/pre>\n<pre>\/\/ --------------------------------------------------------------------------\r\nvoid timerinterrupt( void ) org IVT_ADDR_TIMER0_OVF \/\/ every 10ms\r\n{\r\nstatic uint8_t ct0, ct1, rpt, secac;\r\nvolatile uint8_t i;\r\n\r\nTCNT0 = (uint8_t)(int16_t)-(F_CPU \/ 1024 * 10e-3 + 0.5); \/\/ preload for 10ms\r\n\r\ni = key_state ^ KEY_PIN; \/\/ key changed ?\r\nct0 = ~( ct0 &amp; i ); \/\/ reset or count ct0\r\nct1 = ct0 ^ (ct1 &amp; i); \/\/ reset or count ct1\r\ni &amp;= ct0 &amp; ct1; \/\/ count until roll over ?\r\nkey_state ^= i; \/\/ then toggle debounced state\r\nkey_press |= key_state &amp; i; \/\/ 0-&gt;1: key press detect\r\n\/\/ missing: reset key repeat when key is released\r\n\r\nif( (key_state &amp; LONG_MASK) == 0 ) \/\/ check secondary function\r\nsecac = LONG_START; \/\/ start delay\r\nif( --secac == 0 ){\r\nkey_long |= key_state &amp; LONG_MASK;\r\n}\r\nif( (key_state &amp; REPEAT_MASK) == 0 ) \/\/ check repeat function\r\nrpt = REPEAT_START; \/\/ start delay\r\nif( --rpt == 0 ){\r\nrpt = REPEAT_NEXT; \/\/ repeat delay\r\nkey_rpt |= key_state &amp; REPEAT_MASK;\r\n}\r\n}\r\n\/\/ -------------------------------------------------------------------------\r\n<\/pre>\n<pre>void main()\r\n{\r\n setup();\r\n lastState = currState = nextState = stSTART;\r\n\r\n while(1)\r\n {\r\n  if (lastState != currState)       \/\/ nach einem Statuswechsel wird die Entryfunktion zu erst zu Beginn\r\n                                    \/\/ des n\u00e4chsten Loops ausgef\u00fchrt\r\n  {\r\n   StateEntry[currState]();\r\n   lastState = currState;\r\n  }\r\n  StateAction[currState]();         \/\/ Hauptroutine mit der haupts\u00e4chlichen Arbeit\r\n  if (currState != nextState)       \/\/ Status wird ge\u00e4ndert\r\n  {\r\n    StateExit[currState]();         \/\/ Exitfunktion des aktuellen State sofort ausf\u00fchren\r\n    lastState = currState;\r\n    currState = nextState;\r\n    \/\/continue;                       \/\/ Loop neu beginnen\r\n  }\r\n };\r\n}\r\n<\/pre>\n<p><strong>FSM-1.h<\/strong><\/p>\n<pre>\/\/ FSM nach Vorlage embedded.com\r\n\/\/ Konvention: stXXXX f\u00fcr States fXXXX f\u00fcr die Statefunktion\r\n\r\n#ifndef FSM\r\n#define FSM\r\n\r\n\/\/ ---------------------- State functions ------------------------------\r\nvoid fSTART();\r\nvoid fSETUP();\r\nvoid fSETUP_ENTRY();\r\nvoid fMAIN();\r\nvoid fMAIN_ENTRY();\r\nvoid fSHORT();\r\nvoid fOFF();\r\nvoid fLOWIN();\r\nvoid fMENUINFO();\r\nvoid fNOOP();\r\nvoid fSTART_ENTRY();\r\nvoid fMENUINFO_ENTRY();\r\nvoid fMENUINFO_EXIT();\r\nvoid fGEN_ENTRY();\r\nvoid fGEN_EXIT();\r\n\r\n#endif<\/pre>\n<hr \/>\n<h4>Links<\/h4>\n<ul>\n<li><a href=\"http:\/\/www.state-machine.com\/\" target=\"_blank\" rel=\"noopener\">State Machine Tools (QP) <\/a>Es gibt eine Libary inkl. Application Note f\u00fcr Arduino<\/li>\n<li><a href=\"http:\/\/qfsm.sourceforge.net\" target=\"_blank\" rel=\"noopener\">QFSM Graphical State Machine Editor<\/a><\/li>\n<li>Yakindu Statechart Tools. <a href=\"http:\/\/www.instructables.com\/id\/Finite-State-Machine-on-an-Arduino\/\" target=\"_blank\" rel=\"noopener\">LED Tutorial f\u00fcr Arduino<\/a>.\u00a0\u00a0<a href=\"https:\/\/blogs.itemis.com\/en\/developing-software-for-arduino-with-yakindu-statechart-tools\" target=\"_blank\" rel=\"noopener\">Beispiel Ampel f\u00fcr Arduino<\/a>.<br \/>\n<a href=\"http:\/\/Tokyo Hy Power HL-30U\" target=\"_blank\" rel=\"noopener\">Beispiel <\/a>f\u00fcr eine Cross-Compilierung vom PC auf einen Raspberry Pi:<br \/>\n<img loading=\"lazy\" class=\"alignnone size-full wp-image-3342\" src=\"http:\/\/wp.andreas.bieri.name\/myblog\/wp-content\/uploads\/2016\/01\/yakindu-pi1.png\" alt=\"\" width=\"727\" height=\"346\" srcset=\"http:\/\/wp.andreas.bieri.name\/myblog\/wp-content\/uploads\/2016\/01\/yakindu-pi1.png 727w, http:\/\/wp.andreas.bieri.name\/myblog\/wp-content\/uploads\/2016\/01\/yakindu-pi1-300x143.png 300w, http:\/\/wp.andreas.bieri.name\/myblog\/wp-content\/uploads\/2016\/01\/yakindu-pi1-230x109.png 230w, http:\/\/wp.andreas.bieri.name\/myblog\/wp-content\/uploads\/2016\/01\/yakindu-pi1-350x167.png 350w, http:\/\/wp.andreas.bieri.name\/myblog\/wp-content\/uploads\/2016\/01\/yakindu-pi1-480x228.png 480w\" sizes=\"(max-width: 727px) 100vw, 727px\" \/><\/li>\n<li><a href=\"https:\/\/create.arduino.cc\/projecthub\/gusgonnet\/using-finite-state-machines-fdba04?ref=similar&amp;ref_id=61481&amp;offset=1\">Motivation f\u00fcr FSM<\/a> &#8211; beachte das Video (auch wenn es offenbar keinen Zusammnhang um Thema hat)<\/li>\n<\/ul>\n<hr \/>\n<p><em>Update 20171209<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dies ist ein Arduino Testprogramm f\u00fcr die \u00a0Menuf\u00fchrung mit State Machine und Multifunktionstasten, typischerweise auf einem CD Display und 3 Tasten. Die Code entprellt die Tasteneingaben und kann zwischen kurzen und langen Tastendr\u00fccken unterschieden. Ein langer Druck l\u00f6st eine Wiederholung aus (z.B. f\u00fcr das Hochz\u00e4hlen eines Wertes). Vorausgesetzt wird die die Library f\u00fcr die Tastenentprellung [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[13],"tags":[49,103],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v18.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Democode: Men\u00fcf\u00fchrung mit State Machine - Merkbar.<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/30\/democode-menufuhrung-mit-state-machine\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Democode: Men\u00fcf\u00fchrung mit State Machine - Merkbar.\" \/>\n<meta property=\"og:description\" content=\"Dies ist ein Arduino Testprogramm f\u00fcr die \u00a0Menuf\u00fchrung mit State Machine und Multifunktionstasten, typischerweise auf einem CD Display und 3 Tasten. Die Code entprellt die Tasteneingaben und kann zwischen kurzen und langen Tastendr\u00fccken unterschieden. Ein langer Druck l\u00f6st eine Wiederholung aus (z.B. f\u00fcr das Hochz\u00e4hlen eines Wertes). Vorausgesetzt wird die die Library f\u00fcr die Tastenentprellung [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/30\/democode-menufuhrung-mit-state-machine\/\" \/>\n<meta property=\"og:site_name\" content=\"Merkbar.\" \/>\n<meta property=\"article:published_time\" content=\"2016-01-30T14:18:01+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2017-12-09T18:16:24+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/wp.andreas.bieri.name\/myblog\/wp-content\/uploads\/2016\/01\/yakindu-pi1.png\" \/>\n<meta name=\"twitter:card\" content=\"summary\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"wp_blogadmin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"http:\/\/52.29.166.97\/myblog\/#website\",\"url\":\"http:\/\/52.29.166.97\/myblog\/\",\"name\":\"Merkbar.\",\"description\":\"IT, Elektronik und Mathematik\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/52.29.166.97\/myblog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de\"},{\"@type\":\"ImageObject\",\"@id\":\"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/30\/democode-menufuhrung-mit-state-machine\/#primaryimage\",\"inLanguage\":\"de\",\"url\":\"http:\/\/wp.andreas.bieri.name\/myblog\/wp-content\/uploads\/2016\/01\/yakindu-pi1.png\",\"contentUrl\":\"http:\/\/wp.andreas.bieri.name\/myblog\/wp-content\/uploads\/2016\/01\/yakindu-pi1.png\",\"width\":727,\"height\":346},{\"@type\":\"WebPage\",\"@id\":\"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/30\/democode-menufuhrung-mit-state-machine\/#webpage\",\"url\":\"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/30\/democode-menufuhrung-mit-state-machine\/\",\"name\":\"Democode: Men\u00fcf\u00fchrung mit State Machine - Merkbar.\",\"isPartOf\":{\"@id\":\"http:\/\/52.29.166.97\/myblog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/30\/democode-menufuhrung-mit-state-machine\/#primaryimage\"},\"datePublished\":\"2016-01-30T14:18:01+00:00\",\"dateModified\":\"2017-12-09T18:16:24+00:00\",\"author\":{\"@id\":\"http:\/\/52.29.166.97\/myblog\/#\/schema\/person\/47691942dec3f2eb9d34bb8b5507870d\"},\"breadcrumb\":{\"@id\":\"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/30\/democode-menufuhrung-mit-state-machine\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/30\/democode-menufuhrung-mit-state-machine\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/30\/democode-menufuhrung-mit-state-machine\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"http:\/\/52.29.166.97\/myblog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Democode: Men\u00fcf\u00fchrung mit State Machine\"}]},{\"@type\":\"Person\",\"@id\":\"http:\/\/52.29.166.97\/myblog\/#\/schema\/person\/47691942dec3f2eb9d34bb8b5507870d\",\"name\":\"wp_blogadmin\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"http:\/\/52.29.166.97\/myblog\/#personlogo\",\"inLanguage\":\"de\",\"url\":\"http:\/\/1.gravatar.com\/avatar\/d0dc804558b03f640b22e497ec010c9a?s=96&d=mm&r=g\",\"contentUrl\":\"http:\/\/1.gravatar.com\/avatar\/d0dc804558b03f640b22e497ec010c9a?s=96&d=mm&r=g\",\"caption\":\"wp_blogadmin\"},\"url\":\"http:\/\/wp.andreas.bieri.name\/myblog\/author\/wp_blogadmin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Democode: Men\u00fcf\u00fchrung mit State Machine - Merkbar.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/30\/democode-menufuhrung-mit-state-machine\/","og_locale":"de_DE","og_type":"article","og_title":"Democode: Men\u00fcf\u00fchrung mit State Machine - Merkbar.","og_description":"Dies ist ein Arduino Testprogramm f\u00fcr die \u00a0Menuf\u00fchrung mit State Machine und Multifunktionstasten, typischerweise auf einem CD Display und 3 Tasten. Die Code entprellt die Tasteneingaben und kann zwischen kurzen und langen Tastendr\u00fccken unterschieden. Ein langer Druck l\u00f6st eine Wiederholung aus (z.B. f\u00fcr das Hochz\u00e4hlen eines Wertes). Vorausgesetzt wird die die Library f\u00fcr die Tastenentprellung [&hellip;]","og_url":"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/30\/democode-menufuhrung-mit-state-machine\/","og_site_name":"Merkbar.","article_published_time":"2016-01-30T14:18:01+00:00","article_modified_time":"2017-12-09T18:16:24+00:00","og_image":[{"url":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-content\/uploads\/2016\/01\/yakindu-pi1.png"}],"twitter_card":"summary","twitter_misc":{"Verfasst von":"wp_blogadmin","Gesch\u00e4tzte Lesezeit":"5 Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebSite","@id":"http:\/\/52.29.166.97\/myblog\/#website","url":"http:\/\/52.29.166.97\/myblog\/","name":"Merkbar.","description":"IT, Elektronik und Mathematik","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/52.29.166.97\/myblog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"de"},{"@type":"ImageObject","@id":"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/30\/democode-menufuhrung-mit-state-machine\/#primaryimage","inLanguage":"de","url":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-content\/uploads\/2016\/01\/yakindu-pi1.png","contentUrl":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-content\/uploads\/2016\/01\/yakindu-pi1.png","width":727,"height":346},{"@type":"WebPage","@id":"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/30\/democode-menufuhrung-mit-state-machine\/#webpage","url":"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/30\/democode-menufuhrung-mit-state-machine\/","name":"Democode: Men\u00fcf\u00fchrung mit State Machine - Merkbar.","isPartOf":{"@id":"http:\/\/52.29.166.97\/myblog\/#website"},"primaryImageOfPage":{"@id":"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/30\/democode-menufuhrung-mit-state-machine\/#primaryimage"},"datePublished":"2016-01-30T14:18:01+00:00","dateModified":"2017-12-09T18:16:24+00:00","author":{"@id":"http:\/\/52.29.166.97\/myblog\/#\/schema\/person\/47691942dec3f2eb9d34bb8b5507870d"},"breadcrumb":{"@id":"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/30\/democode-menufuhrung-mit-state-machine\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/30\/democode-menufuhrung-mit-state-machine\/"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/30\/democode-menufuhrung-mit-state-machine\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"http:\/\/52.29.166.97\/myblog\/"},{"@type":"ListItem","position":2,"name":"Democode: Men\u00fcf\u00fchrung mit State Machine"}]},{"@type":"Person","@id":"http:\/\/52.29.166.97\/myblog\/#\/schema\/person\/47691942dec3f2eb9d34bb8b5507870d","name":"wp_blogadmin","image":{"@type":"ImageObject","@id":"http:\/\/52.29.166.97\/myblog\/#personlogo","inLanguage":"de","url":"http:\/\/1.gravatar.com\/avatar\/d0dc804558b03f640b22e497ec010c9a?s=96&d=mm&r=g","contentUrl":"http:\/\/1.gravatar.com\/avatar\/d0dc804558b03f640b22e497ec010c9a?s=96&d=mm&r=g","caption":"wp_blogadmin"},"url":"http:\/\/wp.andreas.bieri.name\/myblog\/author\/wp_blogadmin\/"}]}},"_links":{"self":[{"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/posts\/1141"}],"collection":[{"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/comments?post=1141"}],"version-history":[{"count":4,"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/posts\/1141\/revisions"}],"predecessor-version":[{"id":3384,"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/posts\/1141\/revisions\/3384"}],"wp:attachment":[{"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/media?parent=1141"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/categories?post=1141"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/tags?post=1141"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}