configurable button codes
This commit is contained in:
@@ -1679,7 +1679,7 @@ body.term #content {
|
|||||||
.ansiref.w100 {
|
.ansiref.w100 {
|
||||||
width: 100%; }
|
width: 100%; }
|
||||||
.ansiref.w100 td:nth-child(1) {
|
.ansiref.w100 td:nth-child(1) {
|
||||||
width: 6em; }
|
width: 8em; }
|
||||||
|
|
||||||
.nomen {
|
.nomen {
|
||||||
width: 100%; }
|
width: 100%; }
|
||||||
@@ -1695,7 +1695,7 @@ body.term #content {
|
|||||||
line-height: 1; }
|
line-height: 1; }
|
||||||
.charset div {
|
.charset div {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
width: 2.5em;
|
width: 2.7em;
|
||||||
border: 1px solid #666;
|
border: 1px solid #666;
|
||||||
height: 3em;
|
height: 3em;
|
||||||
margin: 1px;
|
margin: 1px;
|
||||||
|
|||||||
@@ -1737,7 +1737,9 @@ var Screen = (function () {
|
|||||||
Input.onMouseUp(x, y, evt.button+1);
|
Input.onMouseUp(x, y, evt.button+1);
|
||||||
});
|
});
|
||||||
cOuter.addEventListener('contextmenu', function (evt) {
|
cOuter.addEventListener('contextmenu', function (evt) {
|
||||||
|
if (Input.mouseTracksClicks()) {
|
||||||
evt.preventDefault();
|
evt.preventDefault();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
cOuter.addEventListener('mousewheel', function (evt) {
|
cOuter.addEventListener('mousewheel', function (evt) {
|
||||||
Input.onMouseWheel(x, y, evt.deltaY>0?1:-1);
|
Input.onMouseWheel(x, y, evt.deltaY>0?1:-1);
|
||||||
@@ -2320,6 +2322,9 @@ var Input = (function() {
|
|||||||
Conn.send("p" + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m));
|
Conn.send("p" + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m));
|
||||||
// console.log("B ",b," M ",m);
|
// console.log("B ",b," M ",m);
|
||||||
},
|
},
|
||||||
|
mouseTracksClicks: function() {
|
||||||
|
return opts.mt_click;
|
||||||
|
},
|
||||||
};
|
};
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|||||||
@@ -137,7 +137,9 @@ var Screen = (function () {
|
|||||||
Input.onMouseUp(x, y, evt.button+1);
|
Input.onMouseUp(x, y, evt.button+1);
|
||||||
});
|
});
|
||||||
cOuter.addEventListener('contextmenu', function (evt) {
|
cOuter.addEventListener('contextmenu', function (evt) {
|
||||||
|
if (Input.mouseTracksClicks()) {
|
||||||
evt.preventDefault();
|
evt.preventDefault();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
cOuter.addEventListener('mousewheel', function (evt) {
|
cOuter.addEventListener('mousewheel', function (evt) {
|
||||||
Input.onMouseWheel(x, y, evt.deltaY>0?1:-1);
|
Input.onMouseWheel(x, y, evt.deltaY>0?1:-1);
|
||||||
@@ -720,6 +722,9 @@ var Input = (function() {
|
|||||||
Conn.send("p" + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m));
|
Conn.send("p" + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m));
|
||||||
// console.log("B ",b," M ",m);
|
// console.log("B ",b," M ",m);
|
||||||
},
|
},
|
||||||
|
mouseTracksClicks: function() {
|
||||||
|
return opts.mt_click;
|
||||||
|
},
|
||||||
};
|
};
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ return [
|
|||||||
'term.show_config_links' => 'Show nav links',
|
'term.show_config_links' => 'Show nav links',
|
||||||
'term.show_buttons' => 'Show buttons',
|
'term.show_buttons' => 'Show buttons',
|
||||||
'term.loopback' => 'Local Echo',
|
'term.loopback' => 'Local Echo',
|
||||||
|
'term.button_msgs' => 'Button codes<br>(ASCII, dec, CSV)',
|
||||||
|
|
||||||
// terminal color labels
|
// terminal color labels
|
||||||
'color.0' => 'Black',
|
'color.0' => 'Black',
|
||||||
|
|||||||
@@ -134,6 +134,15 @@
|
|||||||
<span class="mq-no-phone"> ms</span>
|
<span class="mq-no-phone"> ms</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="Row">
|
||||||
|
<label><?= tr("term.button_msgs") ?></label>
|
||||||
|
<input class="short" type="text" name="bm1" id="bm1" value="%h:bm1%">
|
||||||
|
<input class="short" type="text" name="bm2" id="bm2" value="%h:bm2%">
|
||||||
|
<input class="short" type="text" name="bm3" id="bm3" value="%h:bm3%">
|
||||||
|
<input class="short" type="text" name="bm4" id="bm4" value="%h:bm4%">
|
||||||
|
<input class="short" type="text" name="bm5" id="bm5" value="%h:bm5%">
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="Row checkbox" >
|
<div class="Row checkbox" >
|
||||||
<label><?= tr('term.fn_alt_mode') ?></label><!--
|
<label><?= tr('term.fn_alt_mode') ?></label><!--
|
||||||
--><span class="box" tabindex=0 role=checkbox></span>
|
--><span class="box" tabindex=0 role=checkbox></span>
|
||||||
|
|||||||
@@ -34,24 +34,31 @@
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>`\e]0;<i>title</i>\a`</td>
|
<td>`\e]0;<i>t</i>\a`</td>
|
||||||
<td>Set screen title (this is a standard OSC command)</td>
|
<td>Set screen title to _t_ (this is a standard OSC command)</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<code>
|
<code>
|
||||||
\e]<i>81</i>;<i>btn1</i>\a \\
|
\e]<i>80+n</i>;<i>t</i>\a
|
||||||
\e]<i>82</i>;<i>btn2</i>\a \\
|
|
||||||
\e]<i>83</i>;<i>btn3</i>\a \\
|
|
||||||
\e]<i>84</i>;<i>btn4</i>\a \\
|
|
||||||
\e]<i>85</i>;<i>btn5</i>\a \\
|
|
||||||
</code>
|
</code>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
Set button 1-5 label - eg.`\e]81;Yes\a`
|
Set label for button _n_ = 1-5 (code 81-85) to _t_ - e.g.`\e]81;Yes\a`
|
||||||
sets the first button text to "Yes".
|
sets the first button text to "Yes".
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<code>
|
||||||
|
\e]<i>90+n</i>;<i>m</i>\a
|
||||||
|
</code>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
Set message for button _n_ = 1-5 (code 81-85) to _m_ - e.g.`\e]94;iv\a`
|
||||||
|
sets the 3rd button to send string "iv" when pressed.
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<code>
|
<code>
|
||||||
@@ -88,7 +95,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>`\e[8;<i>r</i>;<i>c</i>t`</td>
|
<td>`\e[8;<i>r</i>;<i>c</i>t`</td>
|
||||||
<td>Set screen size (this is a command borrowed from xterm)</td>
|
<td>Set screen size to _r_ rows and _c_ columns (this is a command borrowed from Xterm)</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
console.error("Page load failed, refreshing…");
|
console.error("Page load failed, refreshing…");
|
||||||
location.reload(true);
|
location.reload(true);
|
||||||
}
|
}
|
||||||
}, 2000);
|
}, 3000);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<h1><!-- Screen title gets loaded here by JS --></h1>
|
<h1><!-- Screen title gets loaded here by JS --></h1>
|
||||||
@@ -48,10 +48,10 @@
|
|||||||
});
|
});
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
console.error(e);
|
console.error(e);
|
||||||
console.error("Fail, reloading in 1s…");
|
console.error("Fail, reloading in 3s…");
|
||||||
setTimeout(function() {
|
setTimeout(function() {
|
||||||
location.reload(true);
|
location.reload(true);
|
||||||
}, 1000);
|
}, 3000);
|
||||||
}
|
}
|
||||||
|
|
||||||
function toggleSoftKb(yes) {
|
function toggleSoftKb(yes) {
|
||||||
|
|||||||
@@ -60,7 +60,7 @@
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
||||||
td:nth-child(1) {
|
td:nth-child(1) {
|
||||||
width: 6em;
|
width: 8em;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -86,7 +86,7 @@
|
|||||||
|
|
||||||
div {
|
div {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
width: 2.5em;
|
width: 2.7em;
|
||||||
border: 1px solid #666;
|
border: 1px solid #666;
|
||||||
height: 3em;
|
height: 3em;
|
||||||
margin: 1px;
|
margin: 1px;
|
||||||
|
|||||||
+23
-30
@@ -133,14 +133,12 @@ ansi_parser(char newchar)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Handle simple characters immediately (bypass parser)
|
// Handle simple characters immediately (bypass parser)
|
||||||
if (newchar < ' ') {
|
if (newchar < ' ' && !inside_string) {
|
||||||
switch (newchar) {
|
switch (newchar) {
|
||||||
case ESC:
|
case ESC:
|
||||||
if (!inside_string) {
|
|
||||||
// Reset state
|
// Reset state
|
||||||
cs = ansi_start;
|
cs = ansi_start;
|
||||||
// now the ESC will be processed by the parser
|
// now the ESC will be processed by the parser
|
||||||
}
|
|
||||||
break; // proceed to parser
|
break; // proceed to parser
|
||||||
|
|
||||||
// Literally passed
|
// Literally passed
|
||||||
@@ -168,10 +166,7 @@ ansi_parser(char newchar)
|
|||||||
|
|
||||||
case BEL:
|
case BEL:
|
||||||
// bel is also used to terminate OSC
|
// bel is also used to terminate OSC
|
||||||
if (!inside_string) {
|
|
||||||
apars_handle_bel();
|
apars_handle_bel();
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ENQ:
|
case ENQ:
|
||||||
@@ -185,14 +180,12 @@ ansi_parser(char newchar)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// Discard all others
|
// Discard all other control codes
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// >= ' '
|
|
||||||
|
|
||||||
// bypass the parser for simple characters (speed-up)
|
// bypass the parser for simple characters (speed-up)
|
||||||
if (cs == ansi_start) {
|
if (cs == ansi_start && newchar >= ' ') {
|
||||||
apars_handle_plainchar(newchar);
|
apars_handle_plainchar(newchar);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -205,7 +198,7 @@ ansi_parser(char newchar)
|
|||||||
|
|
||||||
// The parser
|
// The parser
|
||||||
|
|
||||||
/* #line 209 "user/ansi_parser.c" */
|
/* #line 202 "user/ansi_parser.c" */
|
||||||
{
|
{
|
||||||
const char *_acts;
|
const char *_acts;
|
||||||
unsigned int _nacts;
|
unsigned int _nacts;
|
||||||
@@ -383,7 +376,7 @@ execFuncs:
|
|||||||
while ( _nacts-- > 0 ) {
|
while ( _nacts-- > 0 ) {
|
||||||
switch ( *_acts++ ) {
|
switch ( *_acts++ ) {
|
||||||
case 0:
|
case 0:
|
||||||
/* #line 185 "user/ansi_parser.rl" */
|
/* #line 178 "user/ansi_parser.rl" */
|
||||||
{
|
{
|
||||||
ansi_warn("Parser error.");
|
ansi_warn("Parser error.");
|
||||||
apars_show_context();
|
apars_show_context();
|
||||||
@@ -392,7 +385,7 @@ execFuncs:
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
/* #line 194 "user/ansi_parser.rl" */
|
/* #line 187 "user/ansi_parser.rl" */
|
||||||
{
|
{
|
||||||
if ((*p) != 0) {
|
if ((*p) != 0) {
|
||||||
apars_handle_plainchar((*p));
|
apars_handle_plainchar((*p));
|
||||||
@@ -400,7 +393,7 @@ execFuncs:
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
/* #line 202 "user/ansi_parser.rl" */
|
/* #line 195 "user/ansi_parser.rl" */
|
||||||
{
|
{
|
||||||
// Reset the CSI builder
|
// Reset the CSI builder
|
||||||
leadchar = NUL;
|
leadchar = NUL;
|
||||||
@@ -416,13 +409,13 @@ execFuncs:
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
/* #line 216 "user/ansi_parser.rl" */
|
/* #line 209 "user/ansi_parser.rl" */
|
||||||
{
|
{
|
||||||
leadchar = (*p);
|
leadchar = (*p);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
/* #line 220 "user/ansi_parser.rl" */
|
/* #line 213 "user/ansi_parser.rl" */
|
||||||
{
|
{
|
||||||
if (arg_cnt == 0) arg_cnt = 1;
|
if (arg_cnt == 0) arg_cnt = 1;
|
||||||
// x10 + digit
|
// x10 + digit
|
||||||
@@ -432,7 +425,7 @@ execFuncs:
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
/* #line 228 "user/ansi_parser.rl" */
|
/* #line 221 "user/ansi_parser.rl" */
|
||||||
{
|
{
|
||||||
if (arg_cnt == 0) arg_cnt = 1; // handle case when first arg is empty
|
if (arg_cnt == 0) arg_cnt = 1; // handle case when first arg is empty
|
||||||
arg_cnt++;
|
arg_cnt++;
|
||||||
@@ -440,14 +433,14 @@ execFuncs:
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
/* #line 234 "user/ansi_parser.rl" */
|
/* #line 227 "user/ansi_parser.rl" */
|
||||||
{
|
{
|
||||||
apars_handle_csi(leadchar, arg, arg_cnt, (*p));
|
apars_handle_csi(leadchar, arg, arg_cnt, (*p));
|
||||||
{cs = 1;goto _again;}
|
{cs = 1;goto _again;}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 7:
|
case 7:
|
||||||
/* #line 245 "user/ansi_parser.rl" */
|
/* #line 238 "user/ansi_parser.rl" */
|
||||||
{
|
{
|
||||||
leadchar = (*p);
|
leadchar = (*p);
|
||||||
str_ni = 0;
|
str_ni = 0;
|
||||||
@@ -457,13 +450,13 @@ execFuncs:
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
/* #line 253 "user/ansi_parser.rl" */
|
/* #line 246 "user/ansi_parser.rl" */
|
||||||
{
|
{
|
||||||
string_buffer[str_ni++] = (*p);
|
string_buffer[str_ni++] = (*p);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 9:
|
case 9:
|
||||||
/* #line 257 "user/ansi_parser.rl" */
|
/* #line 250 "user/ansi_parser.rl" */
|
||||||
{
|
{
|
||||||
inside_string = false;
|
inside_string = false;
|
||||||
string_buffer[str_ni++] = '\0';
|
string_buffer[str_ni++] = '\0';
|
||||||
@@ -472,41 +465,41 @@ execFuncs:
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 10:
|
case 10:
|
||||||
/* #line 270 "user/ansi_parser.rl" */
|
/* #line 263 "user/ansi_parser.rl" */
|
||||||
{
|
{
|
||||||
apars_handle_hash_cmd((*p));
|
apars_handle_hash_cmd((*p));
|
||||||
{cs = 1;goto _again;}
|
{cs = 1;goto _again;}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 11:
|
case 11:
|
||||||
/* #line 275 "user/ansi_parser.rl" */
|
/* #line 268 "user/ansi_parser.rl" */
|
||||||
{
|
{
|
||||||
apars_handle_short_cmd((*p));
|
apars_handle_short_cmd((*p));
|
||||||
{cs = 1;goto _again;}
|
{cs = 1;goto _again;}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 12:
|
case 12:
|
||||||
/* #line 280 "user/ansi_parser.rl" */
|
/* #line 273 "user/ansi_parser.rl" */
|
||||||
{
|
{
|
||||||
apars_handle_space_cmd((*p));
|
apars_handle_space_cmd((*p));
|
||||||
{cs = 1;goto _again;}
|
{cs = 1;goto _again;}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 13:
|
case 13:
|
||||||
/* #line 287 "user/ansi_parser.rl" */
|
/* #line 280 "user/ansi_parser.rl" */
|
||||||
{
|
{
|
||||||
leadchar = (*p);
|
leadchar = (*p);
|
||||||
{cs = 9;goto _again;}
|
{cs = 9;goto _again;}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 14:
|
case 14:
|
||||||
/* #line 292 "user/ansi_parser.rl" */
|
/* #line 285 "user/ansi_parser.rl" */
|
||||||
{
|
{
|
||||||
apars_handle_chs_designate(leadchar, (*p));
|
apars_handle_chs_designate(leadchar, (*p));
|
||||||
{cs = 1;goto _again;}
|
{cs = 1;goto _again;}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
/* #line 510 "user/ansi_parser.c" */
|
/* #line 503 "user/ansi_parser.c" */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
goto _again;
|
goto _again;
|
||||||
@@ -524,7 +517,7 @@ _again:
|
|||||||
while ( __nacts-- > 0 ) {
|
while ( __nacts-- > 0 ) {
|
||||||
switch ( *__acts++ ) {
|
switch ( *__acts++ ) {
|
||||||
case 0:
|
case 0:
|
||||||
/* #line 185 "user/ansi_parser.rl" */
|
/* #line 178 "user/ansi_parser.rl" */
|
||||||
{
|
{
|
||||||
ansi_warn("Parser error.");
|
ansi_warn("Parser error.");
|
||||||
apars_show_context();
|
apars_show_context();
|
||||||
@@ -534,7 +527,7 @@ _again:
|
|||||||
goto _again;}
|
goto _again;}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
/* #line 538 "user/ansi_parser.c" */
|
/* #line 531 "user/ansi_parser.c" */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -542,6 +535,6 @@ goto _again;}
|
|||||||
_out: {}
|
_out: {}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* #line 315 "user/ansi_parser.rl" */
|
/* #line 308 "user/ansi_parser.rl" */
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-10
@@ -102,14 +102,12 @@ ansi_parser(char newchar)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Handle simple characters immediately (bypass parser)
|
// Handle simple characters immediately (bypass parser)
|
||||||
if (newchar < ' ') {
|
if (newchar < ' ' && !inside_string) {
|
||||||
switch (newchar) {
|
switch (newchar) {
|
||||||
case ESC:
|
case ESC:
|
||||||
if (!inside_string) {
|
|
||||||
// Reset state
|
// Reset state
|
||||||
cs = ansi_start;
|
cs = ansi_start;
|
||||||
// now the ESC will be processed by the parser
|
// now the ESC will be processed by the parser
|
||||||
}
|
|
||||||
break; // proceed to parser
|
break; // proceed to parser
|
||||||
|
|
||||||
// Literally passed
|
// Literally passed
|
||||||
@@ -137,10 +135,7 @@ ansi_parser(char newchar)
|
|||||||
|
|
||||||
case BEL:
|
case BEL:
|
||||||
// bel is also used to terminate OSC
|
// bel is also used to terminate OSC
|
||||||
if (!inside_string) {
|
|
||||||
apars_handle_bel();
|
apars_handle_bel();
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ENQ:
|
case ENQ:
|
||||||
@@ -154,14 +149,12 @@ ansi_parser(char newchar)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// Discard all others
|
// Discard all other control codes
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// >= ' '
|
|
||||||
|
|
||||||
// bypass the parser for simple characters (speed-up)
|
// bypass the parser for simple characters (speed-up)
|
||||||
if (cs == ansi_start) {
|
if (cs == ansi_start && newchar >= ' ') {
|
||||||
apars_handle_plainchar(newchar);
|
apars_handle_plainchar(newchar);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
#include <esp8266.h>
|
#include <esp8266.h>
|
||||||
#include <helpers.h>
|
#include <helpers.h>
|
||||||
#include "ansi_parser_callbacks.h"
|
#include "ansi_parser_callbacks.h"
|
||||||
#include "uart_driver.h"
|
|
||||||
#include "cgi_sockets.h"
|
#include "cgi_sockets.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
#include "uart_buffer.h"
|
#include "uart_buffer.h"
|
||||||
@@ -21,7 +20,6 @@ void ICACHE_FLASH_ATTR
|
|||||||
apars_respond(const char *str)
|
apars_respond(const char *str)
|
||||||
{
|
{
|
||||||
UART_SendAsync(str, -1);
|
UART_SendAsync(str, -1);
|
||||||
//UART_WriteString(UART0, str, UART_TIMEOUT_US);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -42,6 +42,9 @@ apars_handle_osc(const char *buffer)
|
|||||||
else if (n >= 81 && n <= 85) { // ESPTerm: action button label
|
else if (n >= 81 && n <= 85) { // ESPTerm: action button label
|
||||||
screen_set_button_text(n - 80, buffer);
|
screen_set_button_text(n - 80, buffer);
|
||||||
}
|
}
|
||||||
|
else if (n >= 91 && n <= 95) { // ESPTerm: action button text
|
||||||
|
strncpy(termconf_scratch.btn_msg[n - 91], buffer, TERM_BTN_MSG_LEN);
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
ansi_noimpl("OSC %d ; %s ST", n, buffer);
|
ansi_noimpl("OSC %d ; %s ST", n, buffer);
|
||||||
}
|
}
|
||||||
|
|||||||
+21
-4
@@ -3,16 +3,16 @@
|
|||||||
#include <cgiwebsocket.h>
|
#include <cgiwebsocket.h>
|
||||||
|
|
||||||
#include "cgi_sockets.h"
|
#include "cgi_sockets.h"
|
||||||
#include "uart_driver.h"
|
|
||||||
#include "screen.h"
|
#include "screen.h"
|
||||||
#include "uart_buffer.h"
|
#include "uart_buffer.h"
|
||||||
#include "ansi_parser.h"
|
#include "ansi_parser.h"
|
||||||
#include "jstring.h"
|
#include "jstring.h"
|
||||||
|
|
||||||
#define LOOPBACK 0
|
// Heartbeat interval in ms
|
||||||
|
|
||||||
#define HB_TIME 1000
|
#define HB_TIME 1000
|
||||||
|
|
||||||
|
// Buffer size (sent in one go)
|
||||||
|
// Must be less than httpd sendbuf
|
||||||
#define SOCK_BUF_LEN 2000
|
#define SOCK_BUF_LEN 2000
|
||||||
|
|
||||||
volatile bool notify_available = true;
|
volatile bool notify_available = true;
|
||||||
@@ -37,6 +37,10 @@ notifyCooldownTimCb(void *arg)
|
|||||||
notify_cooldown = false;
|
notify_cooldown = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tell browser we have new content
|
||||||
|
* @param arg
|
||||||
|
*/
|
||||||
static void ICACHE_FLASH_ATTR
|
static void ICACHE_FLASH_ATTR
|
||||||
notifyContentTimCb(void *arg)
|
notifyContentTimCb(void *arg)
|
||||||
{
|
{
|
||||||
@@ -71,6 +75,10 @@ notifyContentTimCb(void *arg)
|
|||||||
TIMER_START(¬ifyCooldownTim, notifyCooldownTimCb, termconf->display_cooldown_ms, 0);
|
TIMER_START(¬ifyCooldownTim, notifyCooldownTimCb, termconf->display_cooldown_ms, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tell browsers about the new text labels
|
||||||
|
* @param arg
|
||||||
|
*/
|
||||||
static void ICACHE_FLASH_ATTR
|
static void ICACHE_FLASH_ATTR
|
||||||
notifyLabelsTimCb(void *arg)
|
notifyLabelsTimCb(void *arg)
|
||||||
{
|
{
|
||||||
@@ -124,6 +132,14 @@ void ICACHE_FLASH_ATTR screen_notifyChange(ScreenNotifyChangeTopic topic)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* mouse event rx
|
||||||
|
* @param evt - event type: p, r, m
|
||||||
|
* @param y - coord 0-based
|
||||||
|
* @param x - coord 0-based
|
||||||
|
* @param button - which button, 1-based. 0=none
|
||||||
|
* @param mods - modifier keys bitmap: meta|alt|shift|ctrl
|
||||||
|
*/
|
||||||
void ICACHE_FLASH_ATTR sendMouseAction(char evt, int y, int x, int button, u8 mods)
|
void ICACHE_FLASH_ATTR sendMouseAction(char evt, int y, int x, int button, u8 mods)
|
||||||
{
|
{
|
||||||
// one-based
|
// one-based
|
||||||
@@ -219,7 +235,7 @@ void ICACHE_FLASH_ATTR updateSockRx(Websock *ws, char *data, int len, int flags)
|
|||||||
// action button press
|
// action button press
|
||||||
btnNum = (u8) (data[1]);
|
btnNum = (u8) (data[1]);
|
||||||
if (btnNum > 0 && btnNum < 10) {
|
if (btnNum > 0 && btnNum < 10) {
|
||||||
UART_SendAsync(termconf->btn_msg[btnNum-1], -1);
|
UART_SendAsync(termconf_scratch.btn_msg[btnNum-1], -1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -242,6 +258,7 @@ void ICACHE_FLASH_ATTR updateSockRx(Websock *ws, char *data, int len, int flags)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Send a heartbeat msg */
|
||||||
void ICACHE_FLASH_ATTR heartbeatTimCb(void *unused)
|
void ICACHE_FLASH_ATTR heartbeatTimCb(void *unused)
|
||||||
{
|
{
|
||||||
if (notify_available) {
|
if (notify_available) {
|
||||||
|
|||||||
+80
-7
@@ -168,11 +168,67 @@ cgiTermCfgSetParams(HttpdConnData *connData)
|
|||||||
strncpy_safe(termconf->title, buff, 64); // ATTN those must match the values in
|
strncpy_safe(termconf->title, buff, 64); // ATTN those must match the values in
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 1; i <= TERM_BTN_COUNT; i++) {
|
for (int btn_i = 1; btn_i <= TERM_BTN_COUNT; btn_i++) {
|
||||||
sprintf(buff, "btn%d", i);
|
sprintf(buff, "btn%d", btn_i);
|
||||||
if (GET_ARG(buff)) {
|
if (GET_ARG(buff)) {
|
||||||
dbg("Button%d default text: \"%s\"", i, buff);
|
dbg("Button%d default text: \"%s\"", btn_i, buff);
|
||||||
strncpy_safe(termconf->btn[i-1], buff, TERM_BTN_LEN);
|
strncpy_safe(termconf->btn[btn_i-1], buff, TERM_BTN_LEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(buff, "bm%d", btn_i);
|
||||||
|
if (GET_ARG(buff)) {
|
||||||
|
dbg("Button%d message (ASCII): \"%s\"", btn_i, buff);
|
||||||
|
|
||||||
|
// parse: comma,space or semicolon separated decimal values of ASCII codes
|
||||||
|
char c;
|
||||||
|
char *cp = buff;
|
||||||
|
int char_i = 0;
|
||||||
|
int acu = 0;
|
||||||
|
bool lastsp = 1;
|
||||||
|
char buff_bm[TERM_BTN_MSG_LEN];
|
||||||
|
while ((c = *cp++) != 0) {
|
||||||
|
if (c == ' ' || c == ',' || c == ';') {
|
||||||
|
if(lastsp) continue;
|
||||||
|
|
||||||
|
if (acu==0 || acu>255) {
|
||||||
|
warn("Bad value! %d", acu);
|
||||||
|
redir_url += sprintf(redir_url, "bm%d,", btn_i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (char_i >= TERM_BTN_MSG_LEN-1) {
|
||||||
|
warn("Too long! %d", acu);
|
||||||
|
redir_url += sprintf(redir_url, "bm%d,", btn_i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
dbg("acu %d", acu);
|
||||||
|
buff_bm[char_i++] = (char)acu;
|
||||||
|
|
||||||
|
// prepare for next char
|
||||||
|
acu = 0;
|
||||||
|
lastsp = 1;
|
||||||
|
} else if (c>='0'&&c<='9') {
|
||||||
|
lastsp = 0;
|
||||||
|
acu *= 10;
|
||||||
|
acu += c - '0';
|
||||||
|
} else {
|
||||||
|
warn("Bad syntax!");
|
||||||
|
redir_url += sprintf(redir_url, "bm%d,", btn_i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (lastsp && char_i == 0) {
|
||||||
|
warn("Required!");
|
||||||
|
redir_url += sprintf(redir_url, "bm%d,", btn_i);
|
||||||
|
}
|
||||||
|
if (!lastsp) {
|
||||||
|
buff_bm[char_i++] = (char)acu;
|
||||||
|
}
|
||||||
|
buff_bm[char_i] = 0;
|
||||||
|
dbg("%s, chari = %d", buff_bm, char_i);
|
||||||
|
|
||||||
|
strncpy(termconf->btn_msg[btn_i-1], buff_bm, TERM_BTN_MSG_LEN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -252,10 +308,27 @@ tplTermCfg(HttpdConnData *connData, char *token, void **arg)
|
|||||||
strncpy_safe(buff, termconf->title, BUFLEN);
|
strncpy_safe(buff, termconf->title, BUFLEN);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
for (int i = 1; i <= TERM_BTN_COUNT; i++) {
|
for (int btn_i = 1; btn_i <= TERM_BTN_COUNT; btn_i++) {
|
||||||
sprintf(buff2, "btn%d", i);
|
sprintf(buff2, "btn%d", btn_i);
|
||||||
if (streq(token, buff2)) {
|
if (streq(token, buff2)) {
|
||||||
strncpy_safe(buff, termconf->btn[i-1], BUFLEN);
|
strncpy_safe(buff, termconf->btn[btn_i-1], BUFLEN);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(buff2, "bm%d", btn_i);
|
||||||
|
if (streq(token, buff2)) {
|
||||||
|
char c;
|
||||||
|
char *bp = buff;
|
||||||
|
char *cp = termconf->btn_msg[btn_i-1];
|
||||||
|
int n = 0;
|
||||||
|
while((c = *cp++) != 0) {
|
||||||
|
if(n>0) {
|
||||||
|
*bp = ',';
|
||||||
|
bp++;
|
||||||
|
}
|
||||||
|
bp += sprintf(bp, "%d", (int)c);
|
||||||
|
n++;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,830 +0,0 @@
|
|||||||
/*
|
|
||||||
* File : uart.c
|
|
||||||
* Copyright (C) 2013 - 2016, Espressif Systems
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of version 3 of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License along
|
|
||||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
#include <esp8266.h>
|
|
||||||
#include <uart_register.h>
|
|
||||||
#include "uart_asyncdrv.h-"
|
|
||||||
|
|
||||||
// UartDev is defined and initialized in rom code.
|
|
||||||
extern UartDevice UartDev;
|
|
||||||
|
|
||||||
struct UartBuffer {
|
|
||||||
uint32 UartBuffSize;
|
|
||||||
uint8 *pUartBuff;
|
|
||||||
uint8 *pInPos;
|
|
||||||
uint8 *pOutPos;
|
|
||||||
STATUS BuffState;
|
|
||||||
uint16 Space; //remanent space of the buffer
|
|
||||||
uint8 TcpControl;
|
|
||||||
struct UartBuffer *nextBuff;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct UartRxBuff {
|
|
||||||
uint32 UartRxBuffSize;
|
|
||||||
uint8 *pUartRxBuff;
|
|
||||||
uint8 *pWritePos;
|
|
||||||
uint8 *pReadPos;
|
|
||||||
STATUS RxBuffState;
|
|
||||||
uint32 Space; //remanent space of the buffer
|
|
||||||
};
|
|
||||||
|
|
||||||
LOCAL struct UartBuffer* pTxBuffer = NULL;
|
|
||||||
LOCAL struct UartBuffer* pRxBuffer = NULL;
|
|
||||||
|
|
||||||
// Forward declare
|
|
||||||
#if UART_BUFF_EN
|
|
||||||
LOCAL void Uart_Buf_Cpy(struct UartBuffer* pCur, char* pdata , uint16 data_len);
|
|
||||||
void uart_buf_free(struct UartBuffer* pBuff);
|
|
||||||
void tx_buff_enq(char* pdata, uint16 data_len );
|
|
||||||
LOCAL void tx_fifo_insert(struct UartBuffer* pTxBuff, uint8 data_len, uint8 uart_no);
|
|
||||||
void tx_start_uart_buffer(uint8 uart_no);
|
|
||||||
uint16 rx_buff_deq(char* pdata, uint16 data_len );
|
|
||||||
void Uart_rx_buff_enq();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//void ICACHE_FLASH_ATTR uart_test_rx();
|
|
||||||
STATUS uart_tx_one_char(uint8 uart, uint8 TxChar);
|
|
||||||
STATUS uart_tx_one_char_no_wait(uint8 uart, uint8 TxChar);
|
|
||||||
void uart1_sendStr_no_wait(const char *str);
|
|
||||||
struct UartBuffer* UART_AsyncBufferInit(u32 size);
|
|
||||||
|
|
||||||
void uart_rx_intr_enable(uint8 uart_no);
|
|
||||||
void uart_rx_intr_disable(uint8 uart_no);
|
|
||||||
void uart0_tx_buffer(uint8 *buf, uint16 len);
|
|
||||||
|
|
||||||
void uart0_sendStr(const char *str);
|
|
||||||
|
|
||||||
|
|
||||||
/*uart demo with a system task, to output what uart receives*/
|
|
||||||
/*this is a example to process uart data from task,please change the priority to fit your application task if exists*/
|
|
||||||
/*it might conflict with your task, if so,please arrange the priority of different task, or combine it to a different event in the same task. */
|
|
||||||
#define uart_recvTaskPrio 0
|
|
||||||
#define uart_recvTaskQueueLen 10
|
|
||||||
os_event_t uart_recvTaskQueue[uart_recvTaskQueueLen];
|
|
||||||
|
|
||||||
#define DBG
|
|
||||||
#define DBG1 uart1_sendStr_no_wait
|
|
||||||
#define DBG2 os_printf
|
|
||||||
|
|
||||||
|
|
||||||
LOCAL void uart0_rx_intr_handler(void *para);
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
* FunctionName : uart_config
|
|
||||||
* Description : Internal used function
|
|
||||||
* UART0 used for data TX/RX, RX buffer size is 0x100, interrupt enabled
|
|
||||||
* UART1 just used for debug output
|
|
||||||
* Parameters : uart_no, use UART0 or UART1 defined ahead
|
|
||||||
* Returns : NONE
|
|
||||||
*******************************************************************************/
|
|
||||||
LOCAL void ICACHE_FLASH_ATTR
|
|
||||||
uart_config(uint8 uart_no)
|
|
||||||
{
|
|
||||||
if (uart_no == UART1){
|
|
||||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_U1TXD_BK);
|
|
||||||
}else{
|
|
||||||
/* rcv_buff size if 0x100 */
|
|
||||||
ETS_UART_INTR_ATTACH(uart0_rx_intr_handler, &(UartDev.rcv_buff));
|
|
||||||
PIN_PULLUP_DIS(PERIPHS_IO_MUX_U0TXD_U);
|
|
||||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_U0TXD);
|
|
||||||
#if UART_HW_RTS
|
|
||||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_U0RTS); //HW FLOW CONTROL RTS PIN
|
|
||||||
#endif
|
|
||||||
#if UART_HW_CTS
|
|
||||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_U0CTS); //HW FLOW CONTROL CTS PIN
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
uart_div_modify(uart_no, UART_CLK_FREQ / (UartDev.baut_rate));//SET BAUDRATE
|
|
||||||
|
|
||||||
WRITE_PERI_REG(UART_CONF0(uart_no), ((UartDev.exist_parity & UART_PARITY_EN_M) << UART_PARITY_EN_S) //SET BIT AND PARITY MODE
|
|
||||||
| ((UartDev.parity & UART_PARITY_M) <<UART_PARITY_S )
|
|
||||||
| ((UartDev.stop_bits & UART_STOP_BIT_NUM) << UART_STOP_BIT_NUM_S)
|
|
||||||
| ((UartDev.data_bits & UART_BIT_NUM) << UART_BIT_NUM_S));
|
|
||||||
|
|
||||||
//clear rx and tx fifo,not ready
|
|
||||||
SET_PERI_REG_MASK(UART_CONF0(uart_no), UART_RXFIFO_RST | UART_TXFIFO_RST); //RESET FIFO
|
|
||||||
CLEAR_PERI_REG_MASK(UART_CONF0(uart_no), UART_RXFIFO_RST | UART_TXFIFO_RST);
|
|
||||||
|
|
||||||
if (uart_no == UART0){
|
|
||||||
//set rx fifo trigger
|
|
||||||
WRITE_PERI_REG(UART_CONF1(uart_no),
|
|
||||||
((100 & UART_RXFIFO_FULL_THRHD) << UART_RXFIFO_FULL_THRHD_S) |
|
|
||||||
#if UART_HW_RTS
|
|
||||||
((110 & UART_RX_FLOW_THRHD) << UART_RX_FLOW_THRHD_S) |
|
|
||||||
UART_RX_FLOW_EN | //enbale rx flow control
|
|
||||||
#endif
|
|
||||||
(0x02 & UART_RX_TOUT_THRHD) << UART_RX_TOUT_THRHD_S |
|
|
||||||
UART_RX_TOUT_EN|
|
|
||||||
((0x10 & UART_TXFIFO_EMPTY_THRHD)<<UART_TXFIFO_EMPTY_THRHD_S));//wjl
|
|
||||||
#if UART_HW_CTS
|
|
||||||
SET_PERI_REG_MASK( UART_CONF0(uart_no),UART_TX_FLOW_EN); //add this sentense to add a tx flow control via MTCK( CTS )
|
|
||||||
#endif
|
|
||||||
SET_PERI_REG_MASK(UART_INT_ENA(uart_no), UART_RXFIFO_TOUT_INT_ENA |UART_FRM_ERR_INT_ENA);
|
|
||||||
}else{
|
|
||||||
WRITE_PERI_REG(UART_CONF1(uart_no),((UartDev.rcv_buff.TrigLvl & UART_RXFIFO_FULL_THRHD) << UART_RXFIFO_FULL_THRHD_S));//TrigLvl default val == 1
|
|
||||||
}
|
|
||||||
//clear all interrupt
|
|
||||||
WRITE_PERI_REG(UART_INT_CLR(uart_no), 0xffff);
|
|
||||||
//enable rx_interrupt
|
|
||||||
SET_PERI_REG_MASK(UART_INT_ENA(uart_no), UART_RXFIFO_FULL_INT_ENA|UART_RXFIFO_OVF_INT_ENA);
|
|
||||||
}
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
* FunctionName : uart1_tx_one_char
|
|
||||||
* Description : Internal used function
|
|
||||||
* Use uart1 interface to transfer one char
|
|
||||||
* Parameters : uint8 TxChar - character to tx
|
|
||||||
* Returns : OK
|
|
||||||
*******************************************************************************/
|
|
||||||
STATUS uart_tx_one_char(uint8 uart, uint8 TxChar)
|
|
||||||
{
|
|
||||||
while (true){
|
|
||||||
uint32 fifo_cnt = READ_PERI_REG(UART_STATUS(uart)) & (UART_TXFIFO_CNT<<UART_TXFIFO_CNT_S);
|
|
||||||
if ((fifo_cnt >> UART_TXFIFO_CNT_S & UART_TXFIFO_CNT) < 126) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
WRITE_PERI_REG(UART_FIFO(uart) , TxChar);
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
* FunctionName : uart1_write_char
|
|
||||||
* Description : Internal used function
|
|
||||||
* Do some special deal while tx char is '\r' or '\n'
|
|
||||||
* Parameters : char c - character to tx
|
|
||||||
* Returns : NONE
|
|
||||||
*******************************************************************************/
|
|
||||||
LOCAL void ICACHE_FLASH_ATTR
|
|
||||||
uart1_write_char(char c)
|
|
||||||
{
|
|
||||||
if (c == '\n'){
|
|
||||||
uart_tx_one_char(UART1, '\r');
|
|
||||||
uart_tx_one_char(UART1, '\n');
|
|
||||||
}else if (c == '\r'){
|
|
||||||
|
|
||||||
}else{
|
|
||||||
uart_tx_one_char(UART1, c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//os_printf output to fifo or to the tx buffer
|
|
||||||
LOCAL void ICACHE_FLASH_ATTR
|
|
||||||
uart0_write_char_no_wait(char c)
|
|
||||||
{
|
|
||||||
#if UART_BUFF_EN //send to uart0 fifo but do not wait
|
|
||||||
uint8 chr;
|
|
||||||
// if (c == '\n'){
|
|
||||||
// chr = '\r';
|
|
||||||
// tx_buff_enq(&chr, 1);
|
|
||||||
// chr = '\n';
|
|
||||||
// tx_buff_enq(&chr, 1);
|
|
||||||
// }else if (c == '\r'){
|
|
||||||
//
|
|
||||||
// }else{
|
|
||||||
tx_buff_enq(&c,1);
|
|
||||||
// }
|
|
||||||
#else //send to uart tx buffer
|
|
||||||
if (c == '\n'){
|
|
||||||
uart_tx_one_char_no_wait(UART0, '\r');
|
|
||||||
uart_tx_one_char_no_wait(UART0, '\n');
|
|
||||||
}else if (c == '\r'){
|
|
||||||
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
uart_tx_one_char_no_wait(UART0, c);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
* FunctionName : uart0_tx_buffer
|
|
||||||
* Description : use uart0 to transfer buffer
|
|
||||||
* Parameters : uint8 *buf - point to send buffer
|
|
||||||
* uint16 len - buffer len
|
|
||||||
* Returns :
|
|
||||||
*******************************************************************************/
|
|
||||||
void ICACHE_FLASH_ATTR
|
|
||||||
uart0_tx_buffer(uint8 *buf, uint16 len)
|
|
||||||
{
|
|
||||||
uint16 i;
|
|
||||||
for (i = 0; i < len; i++)
|
|
||||||
{
|
|
||||||
uart_tx_one_char(UART0, buf[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
* FunctionName : uart0_sendStr
|
|
||||||
* Description : use uart0 to transfer buffer
|
|
||||||
* Parameters : uint8 *buf - point to send buffer
|
|
||||||
* uint16 len - buffer len
|
|
||||||
* Returns :
|
|
||||||
*******************************************************************************/
|
|
||||||
void ICACHE_FLASH_ATTR
|
|
||||||
uart0_sendStr(const char *str)
|
|
||||||
{
|
|
||||||
while(*str){
|
|
||||||
uart_tx_one_char(UART0, *str++);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void at_port_print(const char *str) __attribute__((alias("uart0_sendStr")));
|
|
||||||
/******************************************************************************
|
|
||||||
* FunctionName : uart0_rx_intr_handler
|
|
||||||
* Description : Internal used function
|
|
||||||
* UART0 interrupt handler, add self handle code inside
|
|
||||||
* Parameters : void *para - point to ETS_UART_INTR_ATTACH's arg
|
|
||||||
* Returns : NONE
|
|
||||||
*******************************************************************************/
|
|
||||||
LOCAL void
|
|
||||||
uart0_rx_intr_handler(void *para)
|
|
||||||
{
|
|
||||||
/* uart0 and uart1 intr combine togther, when interrupt occur, see reg 0x3ff20020, bit2, bit0 represents
|
|
||||||
* uart1 and uart0 respectively
|
|
||||||
*/
|
|
||||||
uint8 RcvChar;
|
|
||||||
uint8 uart_no = UART0;//UartDev.buff_uart_no;
|
|
||||||
uint8 fifo_len = 0;
|
|
||||||
uint8 buf_idx = 0;
|
|
||||||
uint8 temp,cnt;
|
|
||||||
//RcvMsgBuff *pRxBuff = (RcvMsgBuff *)para;
|
|
||||||
|
|
||||||
/*ATTENTION:*/
|
|
||||||
/*IN NON-OS VERSION SDK, DO NOT USE "ICACHE_FLASH_ATTR" FUNCTIONS IN THE WHOLE HANDLER PROCESS*/
|
|
||||||
/*ALL THE FUNCTIONS CALLED IN INTERRUPT HANDLER MUST BE DECLARED IN RAM */
|
|
||||||
/*IF NOT , POST AN EVENT AND PROCESS IN SYSTEM TASK */
|
|
||||||
if(UART_FRM_ERR_INT_ST == (READ_PERI_REG(UART_INT_ST(uart_no)) & UART_FRM_ERR_INT_ST)){
|
|
||||||
DBG1("FRM_ERR\r\n");
|
|
||||||
WRITE_PERI_REG(UART_INT_CLR(uart_no), UART_FRM_ERR_INT_CLR);
|
|
||||||
}else if(UART_RXFIFO_FULL_INT_ST == (READ_PERI_REG(UART_INT_ST(uart_no)) & UART_RXFIFO_FULL_INT_ST)){
|
|
||||||
// Full interrupt - FIFO threshold reached
|
|
||||||
DBG("f");
|
|
||||||
uart_rx_intr_disable(UART0);
|
|
||||||
WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR);
|
|
||||||
system_os_post(uart_recvTaskPrio, 0, 0); // tell the handler
|
|
||||||
}else if(UART_RXFIFO_TOUT_INT_ST == (READ_PERI_REG(UART_INT_ST(uart_no)) & UART_RXFIFO_TOUT_INT_ST)){
|
|
||||||
// Timeout interrupt - Line idle for a while
|
|
||||||
DBG("t");
|
|
||||||
uart_rx_intr_disable(UART0);
|
|
||||||
WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_TOUT_INT_CLR);
|
|
||||||
system_os_post(uart_recvTaskPrio, 0, 0); // tell the handler
|
|
||||||
}else if(UART_TXFIFO_EMPTY_INT_ST == (READ_PERI_REG(UART_INT_ST(uart_no)) & UART_TXFIFO_EMPTY_INT_ST)){
|
|
||||||
DBG("e");
|
|
||||||
// TX fifo is empty, can send more.
|
|
||||||
|
|
||||||
/* to output uart data from uart buffer directly in empty interrupt handler*/
|
|
||||||
/*instead of processing in system event, in order not to wait for current task/function to quit */
|
|
||||||
/*ATTENTION:*/
|
|
||||||
/*IN NON-OS VERSION SDK, DO NOT USE "ICACHE_FLASH_ATTR" FUNCTIONS IN THE WHOLE HANDLER PROCESS*/
|
|
||||||
/*ALL THE FUNCTIONS CALLED IN INTERRUPT HANDLER MUST BE DECLARED IN RAM */
|
|
||||||
CLEAR_PERI_REG_MASK(UART_INT_ENA(UART0), UART_TXFIFO_EMPTY_INT_ENA);
|
|
||||||
#if UART_BUFF_EN
|
|
||||||
tx_start_uart_buffer(UART0);
|
|
||||||
#endif
|
|
||||||
//system_os_post(uart_recvTaskPrio, 1, 0);
|
|
||||||
WRITE_PERI_REG(UART_INT_CLR(uart_no), UART_TXFIFO_EMPTY_INT_CLR);
|
|
||||||
|
|
||||||
}else if(UART_RXFIFO_OVF_INT_ST == (READ_PERI_REG(UART_INT_ST(uart_no)) & UART_RXFIFO_OVF_INT_ST)){
|
|
||||||
WRITE_PERI_REG(UART_INT_CLR(uart_no), UART_RXFIFO_OVF_INT_CLR);
|
|
||||||
DBG1("RX OVF!!\r\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
* FunctionName : uart_init
|
|
||||||
* Description : user interface for init uart
|
|
||||||
* Parameters : UartBautRate uart0_br - uart0 bautrate
|
|
||||||
* UartBautRate uart1_br - uart1 bautrate
|
|
||||||
* Returns : NONE
|
|
||||||
*******************************************************************************/
|
|
||||||
#if UART_SELFTEST&UART_BUFF_EN
|
|
||||||
os_timer_t buff_timer_t;
|
|
||||||
void ICACHE_FLASH_ATTR
|
|
||||||
uart_test_rx()
|
|
||||||
{
|
|
||||||
uint8 uart_buf[128]={0};
|
|
||||||
uint16 len = 0;
|
|
||||||
len = rx_buff_deq(uart_buf, 128 );
|
|
||||||
tx_buff_enq(uart_buf,len);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
LOCAL void ICACHE_FLASH_ATTR ///////
|
|
||||||
uart_recvTask(os_event_t *events)
|
|
||||||
{
|
|
||||||
if(events->sig == 0){
|
|
||||||
#if UART_BUFF_EN
|
|
||||||
Uart_rx_buff_enq();
|
|
||||||
#else
|
|
||||||
uint8 fifo_len = (READ_PERI_REG(UART_STATUS(UART0))>>UART_RXFIFO_CNT_S)&UART_RXFIFO_CNT;
|
|
||||||
uint8 d_tmp = 0;
|
|
||||||
uint8 idx=0;
|
|
||||||
for(idx=0;idx<fifo_len;idx++) {
|
|
||||||
d_tmp = READ_PERI_REG(UART_FIFO(UART0)) & 0xFF;
|
|
||||||
uart_tx_one_char(UART0, d_tmp);
|
|
||||||
}
|
|
||||||
WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR|UART_RXFIFO_TOUT_INT_CLR);
|
|
||||||
uart_rx_intr_enable(UART0);
|
|
||||||
#endif
|
|
||||||
}else if(events->sig == 1){
|
|
||||||
#if UART_BUFF_EN
|
|
||||||
//already move uart buffer output to uart empty interrupt
|
|
||||||
//tx_start_uart_buffer(UART0);
|
|
||||||
#else
|
|
||||||
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ICACHE_FLASH_ATTR
|
|
||||||
uart_init(UartBautRate uart0_br, UartBautRate uart1_br)
|
|
||||||
{
|
|
||||||
/*this is a example to process uart data from task,please change the priority to fit your application task if exists*/
|
|
||||||
system_os_task(uart_recvTask, uart_recvTaskPrio, uart_recvTaskQueue, uart_recvTaskQueueLen); //demo with a task to process the uart data
|
|
||||||
|
|
||||||
UartDev.baut_rate = uart0_br;
|
|
||||||
uart_config(UART0);
|
|
||||||
UartDev.baut_rate = uart1_br;
|
|
||||||
uart_config(UART1);
|
|
||||||
ETS_UART_INTR_ENABLE();
|
|
||||||
|
|
||||||
#if UART_BUFF_EN
|
|
||||||
pTxBuffer = UART_AsyncBufferInit(UART_TX_BUFFER_SIZE);
|
|
||||||
pRxBuffer = UART_AsyncBufferInit(UART_RX_BUFFER_SIZE);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*option 1: use default print, output from uart0 , will wait some time if fifo is full */
|
|
||||||
//do nothing...
|
|
||||||
|
|
||||||
/*option 2: output from uart1,uart1 output will not wait , just for output debug info */
|
|
||||||
/*os_printf output uart data via uart1(GPIO2)*/
|
|
||||||
os_install_putc1((void *)uart1_write_char); //use this one to output debug information via uart1 //
|
|
||||||
|
|
||||||
/*option 3: output from uart0 will skip current byte if fifo is full now... */
|
|
||||||
/*see uart0_write_char_no_wait:you can output via a buffer or output directly */
|
|
||||||
/*os_printf output uart data via uart0 or uart buffer*/
|
|
||||||
//os_install_putc1((void *)uart0_write_char_no_wait); //use this to print via uart0
|
|
||||||
|
|
||||||
#if UART_SELFTEST&UART_BUFF_EN
|
|
||||||
os_timer_disarm(&buff_timer_t);
|
|
||||||
os_timer_setfn(&buff_timer_t, uart_test_rx , NULL); //a demo to process the data in uart rx buffer
|
|
||||||
os_timer_arm(&buff_timer_t,10,1);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
//void ICACHE_FLASH_ATTR
|
|
||||||
//uart_reattach()
|
|
||||||
//{
|
|
||||||
// uart_init(BIT_RATE_115200, BIT_RATE_115200);
|
|
||||||
//}
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
* FunctionName : uart_tx_one_char_no_wait
|
|
||||||
* Description : uart tx a single char without waiting for fifo
|
|
||||||
* Parameters : uint8 uart - uart port
|
|
||||||
* uint8 TxChar - char to tx
|
|
||||||
* Returns : STATUS
|
|
||||||
*******************************************************************************/
|
|
||||||
STATUS uart_tx_one_char_no_wait(uint8 uart, uint8 TxChar)
|
|
||||||
{
|
|
||||||
uint8 fifo_cnt = (( READ_PERI_REG(UART_STATUS(uart))>>UART_TXFIFO_CNT_S)& UART_TXFIFO_CNT);
|
|
||||||
if (fifo_cnt < 126) {
|
|
||||||
WRITE_PERI_REG(UART_FIFO(uart) , TxChar);
|
|
||||||
}
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
//STATUS uart0_tx_one_char_no_wait(uint8 TxChar)
|
|
||||||
//{
|
|
||||||
// uint8 fifo_cnt = (( READ_PERI_REG(UART_STATUS(UART0))>>UART_TXFIFO_CNT_S)& UART_TXFIFO_CNT);
|
|
||||||
// if (fifo_cnt < 126) {
|
|
||||||
// WRITE_PERI_REG(UART_FIFO(UART0) , TxChar);
|
|
||||||
// }
|
|
||||||
// return OK;
|
|
||||||
//}
|
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
* FunctionName : uart1_sendStr_no_wait
|
|
||||||
* Description : uart tx a string without waiting for every char, used for print debug info which can be lost
|
|
||||||
* Parameters : const char *str - string to be sent
|
|
||||||
* Returns : NONE
|
|
||||||
*******************************************************************************/
|
|
||||||
void uart1_sendStr_no_wait(const char *str)
|
|
||||||
{
|
|
||||||
while(*str){
|
|
||||||
uart_tx_one_char_no_wait(UART1, *str++);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#if UART_BUFF_EN
|
|
||||||
/******************************************************************************
|
|
||||||
* FunctionName : Uart_Buf_Init
|
|
||||||
* Description : tx buffer enqueue: fill a first linked buffer
|
|
||||||
* Parameters : char *pdata - data point to be enqueue
|
|
||||||
* Returns : NONE
|
|
||||||
*******************************************************************************/
|
|
||||||
struct UartBuffer* ICACHE_FLASH_ATTR
|
|
||||||
UART_AsyncBufferInit(uint32 buf_size)
|
|
||||||
{
|
|
||||||
uint32 heap_size = system_get_free_heap_size();
|
|
||||||
if(heap_size <=buf_size){
|
|
||||||
DBG1("no buf for uart\n\r");
|
|
||||||
return NULL;
|
|
||||||
}else{
|
|
||||||
DBG("test heap size: %d\n\r",heap_size);
|
|
||||||
struct UartBuffer* pBuff = (struct UartBuffer* )os_malloc(sizeof(struct UartBuffer));
|
|
||||||
pBuff->UartBuffSize = buf_size;
|
|
||||||
pBuff->pUartBuff = (uint8*)os_malloc(pBuff->UartBuffSize);
|
|
||||||
pBuff->pInPos = pBuff->pUartBuff;
|
|
||||||
pBuff->pOutPos = pBuff->pUartBuff;
|
|
||||||
pBuff->Space = (uint16) pBuff->UartBuffSize;
|
|
||||||
pBuff->BuffState = OK;
|
|
||||||
pBuff->nextBuff = NULL;
|
|
||||||
pBuff->TcpControl = RUN;
|
|
||||||
return pBuff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//copy uart buffer
|
|
||||||
LOCAL void Uart_Buf_Cpy(struct UartBuffer* pCur, char* pdata , uint16 data_len)
|
|
||||||
{
|
|
||||||
if(data_len == 0) return;
|
|
||||||
|
|
||||||
uint16 tail_len = (uint16) (pCur->pUartBuff + pCur->UartBuffSize - pCur->pInPos);
|
|
||||||
if(tail_len >= data_len){ //do not need to loop back the queue
|
|
||||||
os_memcpy(pCur->pInPos , pdata , data_len );
|
|
||||||
pCur->pInPos += ( data_len );
|
|
||||||
pCur->pInPos = (pCur->pUartBuff + (pCur->pInPos - pCur->pUartBuff) % pCur->UartBuffSize );
|
|
||||||
pCur->Space -=data_len;
|
|
||||||
}else{
|
|
||||||
os_memcpy(pCur->pInPos, pdata, tail_len);
|
|
||||||
pCur->pInPos += ( tail_len );
|
|
||||||
pCur->pInPos = (pCur->pUartBuff + (pCur->pInPos - pCur->pUartBuff) % pCur->UartBuffSize );
|
|
||||||
pCur->Space -=tail_len;
|
|
||||||
os_memcpy(pCur->pInPos, pdata+tail_len , data_len-tail_len);
|
|
||||||
pCur->pInPos += ( data_len-tail_len );
|
|
||||||
pCur->pInPos = (pCur->pUartBuff + (pCur->pInPos - pCur->pUartBuff) % pCur->UartBuffSize );
|
|
||||||
pCur->Space -=( data_len-tail_len);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
* FunctionName : uart_buf_free
|
|
||||||
* Description : deinit of the tx buffer
|
|
||||||
* Parameters : struct UartBuffer* pTxBuff - tx buffer struct pointer
|
|
||||||
* Returns : NONE
|
|
||||||
*******************************************************************************/
|
|
||||||
void ICACHE_FLASH_ATTR
|
|
||||||
uart_buf_free(struct UartBuffer* pBuff)
|
|
||||||
{
|
|
||||||
os_free(pBuff->pUartBuff);
|
|
||||||
os_free(pBuff);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//rx buffer dequeue
|
|
||||||
uint16 ICACHE_FLASH_ATTR
|
|
||||||
rx_buff_deq(char* pdata, uint16 data_len)
|
|
||||||
{
|
|
||||||
uint16 buf_len = (pRxBuffer->UartBuffSize- pRxBuffer->Space);
|
|
||||||
uint16 tail_len = pRxBuffer->pUartBuff + pRxBuffer->UartBuffSize - pRxBuffer->pOutPos ;
|
|
||||||
uint16 len_tmp = 0;
|
|
||||||
len_tmp = ((data_len > buf_len)?buf_len:data_len);
|
|
||||||
if(pRxBuffer->pOutPos <= pRxBuffer->pInPos){
|
|
||||||
os_memcpy(pdata, pRxBuffer->pOutPos,len_tmp);
|
|
||||||
pRxBuffer->pOutPos+= len_tmp;
|
|
||||||
pRxBuffer->Space += len_tmp;
|
|
||||||
}else{
|
|
||||||
if(len_tmp>tail_len){
|
|
||||||
os_memcpy(pdata, pRxBuffer->pOutPos, tail_len);
|
|
||||||
pRxBuffer->pOutPos += tail_len;
|
|
||||||
pRxBuffer->pOutPos = (pRxBuffer->pUartBuff + (pRxBuffer->pOutPos- pRxBuffer->pUartBuff) % pRxBuffer->UartBuffSize );
|
|
||||||
pRxBuffer->Space += tail_len;
|
|
||||||
|
|
||||||
os_memcpy(pdata+tail_len , pRxBuffer->pOutPos, len_tmp-tail_len);
|
|
||||||
pRxBuffer->pOutPos+= ( len_tmp-tail_len );
|
|
||||||
pRxBuffer->pOutPos= (pRxBuffer->pUartBuff + (pRxBuffer->pOutPos- pRxBuffer->pUartBuff) % pRxBuffer->UartBuffSize );
|
|
||||||
pRxBuffer->Space +=( len_tmp-tail_len);
|
|
||||||
}else{
|
|
||||||
//os_printf("case 3 in rx deq\n\r");
|
|
||||||
os_memcpy(pdata, pRxBuffer->pOutPos, len_tmp);
|
|
||||||
pRxBuffer->pOutPos += len_tmp;
|
|
||||||
pRxBuffer->pOutPos = (pRxBuffer->pUartBuff + (pRxBuffer->pOutPos- pRxBuffer->pUartBuff) % pRxBuffer->UartBuffSize );
|
|
||||||
pRxBuffer->Space += len_tmp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(pRxBuffer->Space >= UART_FIFO_LEN){
|
|
||||||
uart_rx_intr_enable(UART0);
|
|
||||||
}
|
|
||||||
return len_tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//move data from uart fifo to rx buffer
|
|
||||||
void Uart_rx_buff_enq()
|
|
||||||
{
|
|
||||||
uint8 fifo_len,buf_idx;
|
|
||||||
uint8 fifo_data;
|
|
||||||
#if 1
|
|
||||||
fifo_len = (READ_PERI_REG(UART_STATUS(UART0))>>UART_RXFIFO_CNT_S)&UART_RXFIFO_CNT;
|
|
||||||
if(fifo_len >= pRxBuffer->Space){
|
|
||||||
os_printf("buf full!!!\n\r");
|
|
||||||
}else{
|
|
||||||
buf_idx=0;
|
|
||||||
while(buf_idx < fifo_len){
|
|
||||||
buf_idx++;
|
|
||||||
fifo_data = READ_PERI_REG(UART_FIFO(UART0)) & 0xFF;
|
|
||||||
*(pRxBuffer->pInPos++) = fifo_data;
|
|
||||||
if(pRxBuffer->pInPos == (pRxBuffer->pUartBuff + pRxBuffer->UartBuffSize)){
|
|
||||||
pRxBuffer->pInPos = pRxBuffer->pUartBuff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pRxBuffer->Space -= fifo_len ;
|
|
||||||
if(pRxBuffer->Space >= UART_FIFO_LEN){
|
|
||||||
//os_printf("after rx enq buf enough\n\r");
|
|
||||||
uart_rx_intr_enable(UART0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//fill the uart tx buffer
|
|
||||||
void ICACHE_FLASH_ATTR
|
|
||||||
tx_buff_enq(char* pdata, uint16 data_len )
|
|
||||||
{
|
|
||||||
if(pTxBuffer == NULL){
|
|
||||||
DBG1("\n\rnull, create buffer struct\n\r");
|
|
||||||
pTxBuffer = UART_AsyncBufferInit(UART_TX_BUFFER_SIZE);
|
|
||||||
if(pTxBuffer!= NULL){
|
|
||||||
Uart_Buf_Cpy(pTxBuffer , pdata, data_len );
|
|
||||||
}else{
|
|
||||||
DBG1("uart tx MALLOC no buf \n\r");
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
if(data_len <= pTxBuffer->Space){
|
|
||||||
Uart_Buf_Cpy(pTxBuffer , pdata, data_len);
|
|
||||||
}else{
|
|
||||||
DBG1("UART TX BUF FULL!!!!\n\r");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#if 0
|
|
||||||
if(pTxBuffer->Space <= URAT_TX_LOWER_SIZE){
|
|
||||||
set_tcp_block();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
SET_PERI_REG_MASK(UART_CONF1(UART0), (UART_TX_EMPTY_THRESH_VAL & UART_TXFIFO_EMPTY_THRHD)<<UART_TXFIFO_EMPTY_THRHD_S);
|
|
||||||
SET_PERI_REG_MASK(UART_INT_ENA(UART0), UART_TXFIFO_EMPTY_INT_ENA);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//--------------------------------
|
|
||||||
LOCAL void tx_fifo_insert(struct UartBuffer* pTxBuff, uint8 data_len, uint8 uart_no)
|
|
||||||
{
|
|
||||||
uint8 i;
|
|
||||||
for(i = 0; i<data_len;i++){
|
|
||||||
WRITE_PERI_REG(UART_FIFO(uart_no) , *(pTxBuff->pOutPos++));
|
|
||||||
if(pTxBuff->pOutPos == (pTxBuff->pUartBuff + pTxBuff->UartBuffSize)){
|
|
||||||
pTxBuff->pOutPos = pTxBuff->pUartBuff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pTxBuff->pOutPos = (pTxBuff->pUartBuff + (pTxBuff->pOutPos - pTxBuff->pUartBuff) % pTxBuff->UartBuffSize );
|
|
||||||
pTxBuff->Space += data_len;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
* FunctionName : tx_start_uart_buffer
|
|
||||||
* Description : get data from the tx buffer and fill the uart tx fifo, co-work with the uart fifo empty interrupt
|
|
||||||
* Parameters : uint8 uart_no - uart port num
|
|
||||||
* Returns : NONE
|
|
||||||
*******************************************************************************/
|
|
||||||
void tx_start_uart_buffer(uint8 uart_no)
|
|
||||||
{
|
|
||||||
uint8 tx_fifo_len = (READ_PERI_REG(UART_STATUS(uart_no))>>UART_TXFIFO_CNT_S)&UART_TXFIFO_CNT;
|
|
||||||
uint8 fifo_remain = UART_FIFO_LEN - tx_fifo_len ;
|
|
||||||
uint8 len_tmp;
|
|
||||||
uint16 tail_ptx_len,head_ptx_len,data_len;
|
|
||||||
//struct UartBuffer* pTxBuff = *get_buff_prt();
|
|
||||||
|
|
||||||
if(pTxBuffer){
|
|
||||||
data_len = (pTxBuffer->UartBuffSize - pTxBuffer->Space);
|
|
||||||
if(data_len > fifo_remain){
|
|
||||||
len_tmp = fifo_remain;
|
|
||||||
tx_fifo_enq(pTxBuffer, len_tmp, uart_no);
|
|
||||||
SET_PERI_REG_MASK(UART_INT_ENA(UART0), UART_TXFIFO_EMPTY_INT_ENA);
|
|
||||||
}else{
|
|
||||||
len_tmp = data_len;
|
|
||||||
tx_fifo_enq(pTxBuffer, len_tmp, uart_no);
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
DBG1("pTxBuff null \n\r");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
void uart_rx_intr_disable(uint8 uart_no)
|
|
||||||
{
|
|
||||||
#if 1
|
|
||||||
CLEAR_PERI_REG_MASK(UART_INT_ENA(uart_no), UART_RXFIFO_FULL_INT_ENA|UART_RXFIFO_TOUT_INT_ENA);
|
|
||||||
#else
|
|
||||||
ETS_UART_INTR_DISABLE();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void uart_rx_intr_enable(uint8 uart_no)
|
|
||||||
{
|
|
||||||
#if 1
|
|
||||||
SET_PERI_REG_MASK(UART_INT_ENA(uart_no), UART_RXFIFO_FULL_INT_ENA|UART_RXFIFO_TOUT_INT_ENA);
|
|
||||||
#else
|
|
||||||
ETS_UART_INTR_ENABLE();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//========================================================
|
|
||||||
LOCAL void
|
|
||||||
uart0_write_char(char c)
|
|
||||||
{
|
|
||||||
if (c == '\n') {
|
|
||||||
uart_tx_one_char(UART0, '\r');
|
|
||||||
uart_tx_one_char(UART0, '\n');
|
|
||||||
} else if (c == '\r') {
|
|
||||||
} else {
|
|
||||||
uart_tx_one_char(UART0, c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ICACHE_FLASH_ATTR
|
|
||||||
UART_SetWordLength(uint8 uart_no, UartBitsNum4Char len)
|
|
||||||
{
|
|
||||||
SET_PERI_REG_BITS(UART_CONF0(uart_no),UART_BIT_NUM,len,UART_BIT_NUM_S);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ICACHE_FLASH_ATTR
|
|
||||||
UART_SetStopBits(uint8 uart_no, UartStopBitsNum bit_num)
|
|
||||||
{
|
|
||||||
SET_PERI_REG_BITS(UART_CONF0(uart_no),UART_STOP_BIT_NUM,bit_num,UART_STOP_BIT_NUM_S);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ICACHE_FLASH_ATTR
|
|
||||||
UART_SetLineInverse(uint8 uart_no, UART_LineLevelInverse inverse_mask)
|
|
||||||
{
|
|
||||||
CLEAR_PERI_REG_MASK(UART_CONF0(uart_no), UART_LINE_INV_MASK);
|
|
||||||
SET_PERI_REG_MASK(UART_CONF0(uart_no), inverse_mask);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ICACHE_FLASH_ATTR
|
|
||||||
UART_SetParity(uint8 uart_no, UartParityMode Parity_mode)
|
|
||||||
{
|
|
||||||
CLEAR_PERI_REG_MASK(UART_CONF0(uart_no), UART_PARITY |UART_PARITY_EN);
|
|
||||||
if(Parity_mode==NONE_BITS){
|
|
||||||
}else{
|
|
||||||
SET_PERI_REG_MASK(UART_CONF0(uart_no), Parity_mode|UART_PARITY_EN);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ICACHE_FLASH_ATTR
|
|
||||||
UART_SetBaudrate(uint8 uart_no,uint32 baud_rate)
|
|
||||||
{
|
|
||||||
uart_div_modify(uart_no, UART_CLK_FREQ /baud_rate);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ICACHE_FLASH_ATTR
|
|
||||||
UART_SetFlowCtrl(uint8 uart_no,UART_HwFlowCtrl flow_ctrl,uint8 rx_thresh)
|
|
||||||
{
|
|
||||||
if(flow_ctrl&USART_HardwareFlowControl_RTS){
|
|
||||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_U0RTS);
|
|
||||||
SET_PERI_REG_BITS(UART_CONF1(uart_no),UART_RX_FLOW_THRHD,rx_thresh,UART_RX_FLOW_THRHD_S);
|
|
||||||
SET_PERI_REG_MASK(UART_CONF1(uart_no), UART_RX_FLOW_EN);
|
|
||||||
}else{
|
|
||||||
CLEAR_PERI_REG_MASK(UART_CONF1(uart_no), UART_RX_FLOW_EN);
|
|
||||||
}
|
|
||||||
if(flow_ctrl&USART_HardwareFlowControl_CTS){
|
|
||||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_UART0_CTS);
|
|
||||||
SET_PERI_REG_MASK(UART_CONF0(uart_no), UART_TX_FLOW_EN);
|
|
||||||
}else{
|
|
||||||
CLEAR_PERI_REG_MASK(UART_CONF0(uart_no), UART_TX_FLOW_EN);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ICACHE_FLASH_ATTR
|
|
||||||
UART_WaitTxFifoEmpty(uint8 uart_no , uint32 time_out_us) //do not use if tx flow control enabled
|
|
||||||
{
|
|
||||||
uint32 t_s = system_get_time();
|
|
||||||
while (READ_PERI_REG(UART_STATUS(uart_no)) & (UART_TXFIFO_CNT << UART_TXFIFO_CNT_S)){
|
|
||||||
|
|
||||||
if(( system_get_time() - t_s )> time_out_us){
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
WRITE_PERI_REG(0X60000914, 0X73);//WTD
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool ICACHE_FLASH_ATTR
|
|
||||||
UART_CheckOutputFinished(uint8 uart_no, uint32 time_out_us)
|
|
||||||
{
|
|
||||||
uint32 t_start = system_get_time();
|
|
||||||
uint8 tx_fifo_len;
|
|
||||||
uint32 tx_buff_len;
|
|
||||||
while(1){
|
|
||||||
tx_fifo_len =( (READ_PERI_REG(UART_STATUS(uart_no))>>UART_TXFIFO_CNT_S)&UART_TXFIFO_CNT);
|
|
||||||
if(pTxBuffer){
|
|
||||||
tx_buff_len = ((pTxBuffer->UartBuffSize)-(pTxBuffer->Space));
|
|
||||||
}else{
|
|
||||||
tx_buff_len = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( tx_fifo_len==0 && tx_buff_len==0){
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
if( system_get_time() - t_start > time_out_us){
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
WRITE_PERI_REG(0X60000914, 0X73);//WTD
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ICACHE_FLASH_ATTR
|
|
||||||
UART_ResetFifo(uint8 uart_no)
|
|
||||||
{
|
|
||||||
SET_PERI_REG_MASK(UART_CONF0(uart_no), UART_RXFIFO_RST | UART_TXFIFO_RST);
|
|
||||||
CLEAR_PERI_REG_MASK(UART_CONF0(uart_no), UART_RXFIFO_RST | UART_TXFIFO_RST);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ICACHE_FLASH_ATTR
|
|
||||||
UART_ClearIntrStatus(uint8 uart_no,uint32 clr_mask)
|
|
||||||
{
|
|
||||||
WRITE_PERI_REG(UART_INT_CLR(uart_no), clr_mask);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ICACHE_FLASH_ATTR
|
|
||||||
UART_SetIntrEna(uint8 uart_no,uint32 ena_mask)
|
|
||||||
{
|
|
||||||
SET_PERI_REG_MASK(UART_INT_ENA(uart_no), ena_mask);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ICACHE_FLASH_ATTR
|
|
||||||
UART_SetPrintPort(uint8 uart_no)
|
|
||||||
{
|
|
||||||
if(uart_no==1){
|
|
||||||
os_install_putc1(uart1_write_char);
|
|
||||||
}else{
|
|
||||||
/*option 1: do not wait if uart fifo is full,drop current character*/
|
|
||||||
os_install_putc1(uart0_write_char_no_wait);
|
|
||||||
/*option 2: wait for a while if uart fifo is full*/
|
|
||||||
os_install_putc1(uart0_write_char);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//========================================================
|
|
||||||
|
|
||||||
//
|
|
||||||
///*test code*/
|
|
||||||
//void ICACHE_FLASH_ATTR
|
|
||||||
//uart_init_2(UartBautRate uart0_br, UartBautRate uart1_br)
|
|
||||||
//{
|
|
||||||
// // rom use 74880 baut_rate, here reinitialize
|
|
||||||
// UartDev.baut_rate = uart0_br;
|
|
||||||
// UartDev.exist_parity = STICK_PARITY_EN;
|
|
||||||
// UartDev.parity = EVEN_BITS;
|
|
||||||
// UartDev.stop_bits = ONE_STOP_BIT;
|
|
||||||
// UartDev.data_bits = EIGHT_BITS;
|
|
||||||
//
|
|
||||||
// uart_config(UART0);
|
|
||||||
// UartDev.baut_rate = uart1_br;
|
|
||||||
// uart_config(UART1);
|
|
||||||
// ETS_UART_INTR_ENABLE();
|
|
||||||
//
|
|
||||||
// // install uart1 putc callback
|
|
||||||
// os_install_putc1((void *)uart1_write_char);//print output at UART1
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//
|
|
||||||
@@ -1,178 +0,0 @@
|
|||||||
/*
|
|
||||||
* File : uart.h
|
|
||||||
* Copyright (C) 2013 - 2016, Espressif Systems
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of version 3 of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License along
|
|
||||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
#ifndef UART_APP_H
|
|
||||||
#define UART_APP_H
|
|
||||||
|
|
||||||
#include <esp8266.h>
|
|
||||||
|
|
||||||
#define UART_TX_BUFFER_SIZE 512 //Ring buffer length of tx buffer
|
|
||||||
#define UART_RX_BUFFER_SIZE 512 //Ring buffer length of rx buffer
|
|
||||||
|
|
||||||
#define UART_BUFF_EN 1 //use uart buffer , FOR UART0
|
|
||||||
#define UART_SELFTEST 0 //set 1:enable the loop test demo for uart buffer, FOR UART0
|
|
||||||
|
|
||||||
#define UART_HW_RTS 0 //set 1: enable uart hw flow control RTS, PIN MTDO, FOR UART0
|
|
||||||
#define UART_HW_CTS 0 //set1: enable uart hw flow contrl CTS , PIN MTCK, FOR UART0
|
|
||||||
|
|
||||||
#define UART0 0
|
|
||||||
#define UART1 1
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
FIVE_BITS = 0x0,
|
|
||||||
SIX_BITS = 0x1,
|
|
||||||
SEVEN_BITS = 0x2,
|
|
||||||
EIGHT_BITS = 0x3
|
|
||||||
} UartBitsNum4Char;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
ONE_STOP_BIT = 0x1,
|
|
||||||
ONE_HALF_STOP_BIT = 0x2,
|
|
||||||
TWO_STOP_BIT = 0x3
|
|
||||||
} UartStopBitsNum;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
NONE_BITS = 0x2,
|
|
||||||
ODD_BITS = 1,
|
|
||||||
EVEN_BITS = 0
|
|
||||||
} UartParityMode;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
STICK_PARITY_DIS = 0,
|
|
||||||
STICK_PARITY_EN = 1
|
|
||||||
} UartExistParity;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
UART_None_Inverse = 0x0,
|
|
||||||
UART_Rxd_Inverse = UART_RXD_INV,
|
|
||||||
UART_CTS_Inverse = UART_CTS_INV,
|
|
||||||
UART_Txd_Inverse = UART_TXD_INV,
|
|
||||||
UART_RTS_Inverse = UART_RTS_INV,
|
|
||||||
} UART_LineLevelInverse;
|
|
||||||
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
BIT_RATE_300 = 300,
|
|
||||||
BIT_RATE_600 = 600,
|
|
||||||
BIT_RATE_1200 = 1200,
|
|
||||||
BIT_RATE_2400 = 2400,
|
|
||||||
BIT_RATE_4800 = 4800,
|
|
||||||
BIT_RATE_9600 = 9600,
|
|
||||||
BIT_RATE_19200 = 19200,
|
|
||||||
BIT_RATE_38400 = 38400,
|
|
||||||
BIT_RATE_57600 = 57600,
|
|
||||||
BIT_RATE_74880 = 74880,
|
|
||||||
BIT_RATE_115200 = 115200,
|
|
||||||
BIT_RATE_230400 = 230400,
|
|
||||||
BIT_RATE_460800 = 460800,
|
|
||||||
BIT_RATE_921600 = 921600,
|
|
||||||
BIT_RATE_1843200 = 1843200,
|
|
||||||
BIT_RATE_3686400 = 3686400,
|
|
||||||
} UartBautRate;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
NONE_CTRL,
|
|
||||||
HARDWARE_CTRL,
|
|
||||||
XON_XOFF_CTRL
|
|
||||||
} UartFlowCtrl;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
USART_HardwareFlowControl_None = 0x0,
|
|
||||||
USART_HardwareFlowControl_RTS = 0x1,
|
|
||||||
USART_HardwareFlowControl_CTS = 0x2,
|
|
||||||
USART_HardwareFlowControl_CTS_RTS = 0x3
|
|
||||||
} UART_HwFlowCtrl;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
EMPTY,
|
|
||||||
UNDER_WRITE,
|
|
||||||
WRITE_OVER
|
|
||||||
} RcvMsgBuffState;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint32 RcvBuffSize;
|
|
||||||
uint8 *pRcvMsgBuff;
|
|
||||||
uint8 *pWritePos;
|
|
||||||
uint8 *pReadPos;
|
|
||||||
uint8 TrigLvl; //JLU: may need to pad
|
|
||||||
RcvMsgBuffState BuffState;
|
|
||||||
} RcvMsgBuff;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint32 TrxBuffSize;
|
|
||||||
uint8 *pTrxBuff;
|
|
||||||
} TrxMsgBuff;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
BAUD_RATE_DET,
|
|
||||||
WAIT_SYNC_FRM,
|
|
||||||
SRCH_MSG_HEAD,
|
|
||||||
RCV_MSG_BODY,
|
|
||||||
RCV_ESC_CHAR,
|
|
||||||
} RcvMsgState;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
UartBautRate baut_rate;
|
|
||||||
UartBitsNum4Char data_bits;
|
|
||||||
UartExistParity exist_parity;
|
|
||||||
UartParityMode parity;
|
|
||||||
UartStopBitsNum stop_bits;
|
|
||||||
UartFlowCtrl flow_ctrl;
|
|
||||||
RcvMsgBuff rcv_buff;
|
|
||||||
TrxMsgBuff trx_buff;
|
|
||||||
RcvMsgState rcv_state;
|
|
||||||
int received;
|
|
||||||
int buff_uart_no; //indicate which uart use tx/rx buffer
|
|
||||||
} UartDevice;
|
|
||||||
|
|
||||||
void uart_init(UartBautRate uart0_br, UartBautRate uart1_br);
|
|
||||||
|
|
||||||
///////////////////////////////////////
|
|
||||||
#define UART_FIFO_LEN 128 //define the tx fifo length
|
|
||||||
#define UART_TX_EMPTY_THRESH_VAL 0x10
|
|
||||||
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
RUN = 0,
|
|
||||||
BLOCK = 1,
|
|
||||||
} TCPState;
|
|
||||||
|
|
||||||
|
|
||||||
//==============================================
|
|
||||||
#define FUNC_UART0_CTS 4
|
|
||||||
#define FUNC_U0CTS 4
|
|
||||||
#define FUNC_U1TXD_BK 2
|
|
||||||
#define UART_LINE_INV_MASK (0x3f<<19)
|
|
||||||
void UART_SetWordLength(uint8 uart_no, UartBitsNum4Char len);
|
|
||||||
void UART_SetStopBits(uint8 uart_no, UartStopBitsNum bit_num);
|
|
||||||
void UART_SetLineInverse(uint8 uart_no, UART_LineLevelInverse inverse_mask);
|
|
||||||
void UART_SetParity(uint8 uart_no, UartParityMode Parity_mode);
|
|
||||||
void UART_SetBaudrate(uint8 uart_no, uint32 baud_rate);
|
|
||||||
void UART_SetFlowCtrl(uint8 uart_no, UART_HwFlowCtrl flow_ctrl, uint8 rx_thresh);
|
|
||||||
void UART_WaitTxFifoEmpty(uint8 uart_no, uint32 time_out_us); //do not use if tx flow control enabled
|
|
||||||
void UART_ResetFifo(uint8 uart_no);
|
|
||||||
void UART_ClearIntrStatus(uint8 uart_no, uint32 clr_mask);
|
|
||||||
void UART_SetIntrEna(uint8 uart_no, uint32 ena_mask);
|
|
||||||
void UART_SetPrintPort(uint8 uart_no);
|
|
||||||
bool UART_CheckOutputFinished(uint8 uart_no, uint32 time_out_us);
|
|
||||||
//==============================================
|
|
||||||
|
|
||||||
// Buffer functions
|
|
||||||
uint16 rx_buff_deq(char* pdata, uint16 data_len);
|
|
||||||
void tx_buff_enq(char* pdata, uint16 data_len);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
+3
-5
@@ -94,13 +94,11 @@ void ICACHE_FLASH_ATTR user_init(void)
|
|||||||
wifi_set_opmode(NULL_MODE); // saves to flash if changed - this might avoid the current spike on startup?
|
wifi_set_opmode(NULL_MODE); // saves to flash if changed - this might avoid the current spike on startup?
|
||||||
|
|
||||||
printf("\r\n");
|
printf("\r\n");
|
||||||
banner("====== ESP8266 Remote Terminal ======");
|
banner("====== ESPTerm ======");
|
||||||
banner_info("Firmware (c) Ondrej Hruska, 2017");
|
banner_info("Firmware (c) Ondrej Hruska, 2017");
|
||||||
banner_info("github.com/MightyPork/esp-vt100-firmware");
|
banner_info(TERMINAL_GITHUB_REPO);
|
||||||
banner_info("");
|
banner_info("");
|
||||||
banner_info("Version " FIRMWARE_VERSION ", built " __DATE__ " at " __TIME__);
|
banner_info("Version "FIRMWARE_VERSION", built " __DATE__ " at " __TIME__);
|
||||||
banner_info("");
|
|
||||||
banner_info("Department of Measurement, CTU Prague");
|
|
||||||
printf("\r\n");
|
printf("\r\n");
|
||||||
|
|
||||||
ioInit();
|
ioInit();
|
||||||
|
|||||||
Reference in New Issue
Block a user