Aukie Hooglugt / MODSERIAL-

Fork of MODSERIAL by Erik -

Committer:
Hooglugt
Date:
Fri Oct 03 09:16:32 2014 +0000
Revision:
36:f6cba765d331
Parent:
31:b90b20f78f04
changed method to check if script works (led display, certain light activating at selection to pc.printf, text display in realterm)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AjK 0:eb2522b41db8 1 /*
AjK 0:eb2522b41db8 2 Copyright (c) 2010 Andy Kirkham
AjK 0:eb2522b41db8 3
AjK 0:eb2522b41db8 4 Permission is hereby granted, free of charge, to any person obtaining a copy
AjK 0:eb2522b41db8 5 of this software and associated documentation files (the "Software"), to deal
AjK 0:eb2522b41db8 6 in the Software without restriction, including without limitation the rights
AjK 0:eb2522b41db8 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
AjK 0:eb2522b41db8 8 copies of the Software, and to permit persons to whom the Software is
AjK 0:eb2522b41db8 9 furnished to do so, subject to the following conditions:
AjK 0:eb2522b41db8 10
AjK 0:eb2522b41db8 11 The above copyright notice and this permission notice shall be included in
AjK 0:eb2522b41db8 12 all copies or substantial portions of the Software.
AjK 0:eb2522b41db8 13
AjK 0:eb2522b41db8 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
AjK 0:eb2522b41db8 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
AjK 0:eb2522b41db8 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AjK 0:eb2522b41db8 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
AjK 0:eb2522b41db8 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
AjK 0:eb2522b41db8 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
AjK 0:eb2522b41db8 20 THE SOFTWARE.
AjK 7:ffa4a7cb7f8d 21
AjK 7:ffa4a7cb7f8d 22 @file MODSERIAL.h
AjK 7:ffa4a7cb7f8d 23 @purpose Extends Serial to provide fully buffered IO
AjK 7:ffa4a7cb7f8d 24 @version 1.6
AjK 7:ffa4a7cb7f8d 25 @date Nov 2010
AjK 7:ffa4a7cb7f8d 26 @author Andy Kirkham
AjK 0:eb2522b41db8 27 */
AjK 0:eb2522b41db8 28
AjK 0:eb2522b41db8 29 #include "MODSERIAL.h"
AjK 0:eb2522b41db8 30 #include "MACROS.h"
AjK 0:eb2522b41db8 31
AjK 0:eb2522b41db8 32 namespace AjK {
AjK 0:eb2522b41db8 33
AjK 25:ae0408ebdd68 34 MODSERIAL::MODSERIAL( PinName tx, PinName rx, const char* name ) : Serial( tx, rx, name )
AjK 0:eb2522b41db8 35 {
AjK 24:9c456e647a8f 36 init( MODSERIAL_DEFAULT_TX_BUFFER_SIZE, MODSERIAL_DEFAULT_RX_BUFFER_SIZE, rx );
AjK 0:eb2522b41db8 37 }
AjK 0:eb2522b41db8 38
AjK 25:ae0408ebdd68 39 MODSERIAL::MODSERIAL( PinName tx, PinName rx, int bufferSize, const char* name ) : Serial( tx, rx, name )
AjK 0:eb2522b41db8 40 {
AjK 24:9c456e647a8f 41 init( bufferSize, bufferSize, rx );
AjK 0:eb2522b41db8 42 }
AjK 0:eb2522b41db8 43
AjK 25:ae0408ebdd68 44 MODSERIAL::MODSERIAL( PinName tx, PinName rx, int txSize, int rxSize, const char* name ) : Serial( tx, rx, name )
AjK 0:eb2522b41db8 45 {
AjK 24:9c456e647a8f 46 init( txSize, rxSize, rx );
AjK 0:eb2522b41db8 47 }
AjK 0:eb2522b41db8 48
AjK 0:eb2522b41db8 49 MODSERIAL::~MODSERIAL()
AjK 0:eb2522b41db8 50 {
Sissors 27:9c93ce7cb9d8 51 NVIC_DisableIRQ(_IRQ);
AjK 23:5c45c21f36b7 52 if ( buffer[0] != NULL) free((char *)buffer[0] );
AjK 23:5c45c21f36b7 53 if ( buffer[1] != NULL) free((char *)buffer[1] );
AjK 0:eb2522b41db8 54 }
AjK 0:eb2522b41db8 55
Sissors 27:9c93ce7cb9d8 56 bool MODSERIAL::txBufferFull( void )
AjK 0:eb2522b41db8 57 {
AjK 0:eb2522b41db8 58 return MODSERIAL_TX_BUFFER_FULL;
AjK 0:eb2522b41db8 59 }
AjK 0:eb2522b41db8 60
Sissors 27:9c93ce7cb9d8 61 bool MODSERIAL::rxBufferFull( void )
AjK 0:eb2522b41db8 62 {
AjK 0:eb2522b41db8 63 return MODSERIAL_RX_BUFFER_FULL;
AjK 0:eb2522b41db8 64 }
AjK 0:eb2522b41db8 65
Sissors 27:9c93ce7cb9d8 66 bool MODSERIAL::txBufferEmpty( void )
AjK 0:eb2522b41db8 67 {
AjK 0:eb2522b41db8 68 return MODSERIAL_TX_BUFFER_EMPTY;
AjK 0:eb2522b41db8 69 }
AjK 0:eb2522b41db8 70
Sissors 27:9c93ce7cb9d8 71 bool MODSERIAL::rxBufferEmpty( void )
AjK 0:eb2522b41db8 72 {
AjK 0:eb2522b41db8 73 return MODSERIAL_RX_BUFFER_EMPTY;
AjK 0:eb2522b41db8 74 }
AjK 0:eb2522b41db8 75
AjK 2:b936b4acbd92 76
Sissors 27:9c93ce7cb9d8 77 int MODSERIAL::rxDiscardLastChar( void )
AjK 18:21ef26402365 78 {
AjK 18:21ef26402365 79 // This function can only be called indirectly from
AjK 18:21ef26402365 80 // an rxCallback function. Therefore, we know we
AjK 18:21ef26402365 81 // just placed a char into the buffer.
AjK 18:21ef26402365 82 char c = buffer[RxIrq][buffer_in[RxIrq]];
AjK 18:21ef26402365 83
AjK 18:21ef26402365 84 if (buffer_count[RxIrq]) {
AjK 18:21ef26402365 85 buffer_count[RxIrq]--;
AjK 18:21ef26402365 86 buffer_in[RxIrq]--;
AjK 18:21ef26402365 87 if (buffer_in[RxIrq] < 0) {
AjK 18:21ef26402365 88 buffer_in[RxIrq] = buffer_size[RxIrq] - 1;
AjK 18:21ef26402365 89 }
AjK 18:21ef26402365 90 }
AjK 18:21ef26402365 91
AjK 18:21ef26402365 92 return (int)c;
AjK 18:21ef26402365 93 }
AjK 18:21ef26402365 94
AjK 9:b3cdae80e7a9 95
Sissors 31:b90b20f78f04 96 bool MODSERIAL::claim (FILE *stream) {
Sissors 31:b90b20f78f04 97 if ( _name == NULL) {
Sissors 31:b90b20f78f04 98 error("claim requires a name to be given in the instantiator of the MODSERIAL instance!\r\n");
Sissors 31:b90b20f78f04 99 }
Sissors 31:b90b20f78f04 100
Sissors 31:b90b20f78f04 101 //Add '/' before name:
Sissors 31:b90b20f78f04 102 char *path = new char[strlen(_name) + 2];
Sissors 31:b90b20f78f04 103 sprintf(path, "/%s", _name);
Sissors 31:b90b20f78f04 104
Sissors 31:b90b20f78f04 105 if (freopen(path, "w", stream) == NULL) {
Sissors 31:b90b20f78f04 106 // Failed, should not happen
Sissors 31:b90b20f78f04 107 return false;
Sissors 31:b90b20f78f04 108 }
Sissors 31:b90b20f78f04 109
Sissors 31:b90b20f78f04 110 delete(path);
Sissors 31:b90b20f78f04 111
Sissors 31:b90b20f78f04 112 //No buffering
Sissors 31:b90b20f78f04 113 setvbuf(stdout, NULL, _IONBF, buffer_size[TxIrq]);
Sissors 31:b90b20f78f04 114 return true;
Sissors 31:b90b20f78f04 115 }
Sissors 31:b90b20f78f04 116
Sissors 31:b90b20f78f04 117
Sissors 31:b90b20f78f04 118
AjK 0:eb2522b41db8 119 }; // namespace AjK ends