rs485 conversion

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
foxbrianr
Date:
Sun Jun 16 00:36:06 2019 +0000
Commit message:
demo microcom

Changed in this revision

MicroCom.h Show annotated file Show diff for this revision Revisions of this file
emic2.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MicroCom.h	Sun Jun 16 00:36:06 2019 +0000
@@ -0,0 +1,127 @@
+/*
+1st Byte:  Header byte:  always 0x40.
+
+2nd Byte:  Is a bit field:    free_a7            :1,    bit 7
+            Reserved (fire service)    :1,    bit 6
+            Reserved         :1,    bit 5
+            Reserved        :1,    bit 4
+            Reserved        :1,    bit 3
+            play strobe         :1,    bit 2
+            arrival_dn_arrow     :1,    bit 1
+            arrival_up_arrow     :1,    bit0
+
+3rd Byte:  Scan_slot. zero is reserved, 1 through 254, (119 may be max value in some cases)
+
+4th Byte: Message_number.  zero is no message, 1 through 126, (63 may be max value in some cases)
+
+5th Byte:  Is a bit field:    Rear arrival dn arr    :1,    bit 7
+            Rear arrival up arr    :1,    bit 6
+            Message level hi bit    :1,    bit 5
+            Message level low bit    :1,    bit 4
+            Passing chime         :1,    bit 3
+            Reserved        :1,    bit 2
+            traveling dn arrow    :1,    bit 1
+            traveling up arrow    :1,    bit 0
+
+6th Byte:  ASCII floor char, msb.
+
+7th Btye:  ASCII floor char, mid.
+
+8thByte:  ASCII floor char, lsb.
+            Note:  floor ASCII range is 0x30 through 0x5a (‘0’ – ‘Z’). 
+                0x3a  through 0x40 are special characters with 
+                0x3b being the space or blank character(semicolon)
+                0x3d is normally displayed as a minus character.
+9th Byte:  ASCII Mess. char, msb.
+
+10th Byte:  ASCII Mess. Char, mid.
+
+11th Byte:  ASCII Mess. char, lsb.
+            Note:  message ASCII range is 0x30 through 0x5b (‘0’ – ‘[’). 
+                0x3a  through 0x40 are special characters with 
+                0x3b being the space or blank character(semicolon)
+                0x5d is sent when there is no message (instead of spaces).
+                So bytes 9, 10, and 11 will each be ‘[‘  when no message. 
+12th Byte: checksum, two’s complement of bytes 1 through 11.
+
+Example:
+ 0x40,    header
+ 0x01,    up arrow for lantern
+ 0x01,     floor number 1,
+ 0x03,    message number 3 activated 
+ 0x11,    message level 1, direction arrow is up
+ 0x4c,    ascii floor character ‘L’
+ 0x42,    ascii floor character ‘B,
+ 0x59,    ascii floor character ‘Y’
+ 0x3b,    ascii message character ‘;’ for space or blank
+ 0x4e,    ascii message character ‘N’
+ 0x44,    ascii message character ‘D’
+ 0xf6,    checksum (two’s complement). 
+ */
+ 
+class MicroComMessage
+{
+    public:
+        uint8_t message[12];
+        
+        uint8_t * getMessage(){ return message;};
+        
+        
+        
+        void SetFloor(char* floor) {};
+        
+        void SetMessage( char* msg){};
+        
+        
+        
+};
+
+/*
+Floor and Arrow Information (0x501)
+The floor and arrow information contains the current car position and hall arrows.
+Packet Data
+Byte 1
+Front arrows
+Bit 0 – Front arrival arrow up
+Bit 1 – Front arrival arrow down
+Bit 2 – Play Strobe
+Bit 3-5 – Reserved
+Bit 6 – Fire Warning Lamp
+Byte 2
+Floor Number.  A floor number of 0 is not a valid.
+Byte 3
+Priority message number
+Byte 4
+Travel and rear arrows
+Bit 0 – Travel arrow up
+Bit 1 – Travel arrow down
+Bit 2 – unused
+Bit 3 – Passing Chime
+Bit 4 – Message Level Low Bit
+Bit 5 – Message Level High Bit
+Bit 6 – Rear arrival arrow up
+Bit 7 – Rear arrival arrow down
+Byte 5-8
+Reserved
+*/
+
+void GetMessage501(char * floor, char * msg, char lantern )
+{
+}
+/*
+Floor and Message characters (0x502)
+The floor and message characters packet contains the marking used to represent the floor or priority message on displays.
+Packet Data
+    Byte 1    Floor marking character (leftmost)
+    Byte 2    Floor marking character
+    Byte 3    Floor marking character (rightmost)
+    Byte 4    Message marking character (leftmost)
+    Byte 5    Message marking character
+    Byte 6    Message marking character (rightmost)
+    Byte 7    Lantern Position (ThyssenKrupp)
+    Byte 8    Unused
+
+*/
+void GetMessage502(char * floor, char * msg, char lantern )
+{
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emic2.h	Sun Jun 16 00:36:06 2019 +0000
@@ -0,0 +1,41 @@
+#define speakf printf
+class emic2 : public Stream
+{
+public :
+    emic2(PinName tx, PinName rx): _cmd(tx,rx) {
+        _cmd.baud(9600);
+        _cmd.putc('X'); //stop talking if reset and not a power on
+        _cmd.putc('\r'); // Send a CR in case the system is already up
+        wait(1); //delay for emic power on boot or reset respone
+        while (_cmd.getc() != ':');   // When the Emic 2 has initialized and is ready, it will send a single ':'
+        while (_cmd.readable()) _cmd.getc();//flush out buffer just in case
+    };
+    void ready() {
+        while (_cmd.getc() != ':');
+        while (_cmd.readable()) _cmd.getc();//flush out recieve buffer just in case
+    };
+    int readable() {
+        return _cmd.readable();
+    };
+    int getc() {
+        return _cmd.getc();
+    }
+    void volume(int x) {
+        speakf("V%D\r",x);
+        ready();
+    }
+    void voice(int x) {
+        speakf("N%D\r",x);
+        ready();
+    }
+protected :
+    Serial     _cmd;
+    //used by printf - supply it and printf works!
+    virtual int _putc(int c) {
+        _cmd.putc(c);
+        return 0;
+    };
+    virtual int _getc() {
+        return -1;
+    };
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Jun 16 00:36:06 2019 +0000
@@ -0,0 +1,135 @@
+#include "mbed.h"
+  
+DigitalOut myled1(LED1);
+DigitalOut myled2(LED2);
+DigitalOut myled3(LED3);
+DigitalOut myled4(LED3);
+
+DigitalOut myled(LED1);
+#include "emic2.h"
+
+emic2 myVoice2Text(p28, p27); //serial RX,TX pins to emic
+
+Serial pc(USBTX, USBRX, 9600); //tx,rx,baud
+
+Serial rs485port1(p9, p10, 9600); //tx,rx,baud
+DigitalOut rs485port1mode (p11); //Transmit = 1, Receive = 0
+
+Serial rs485port2(p13, p14, 9600); //tx,rx,baud
+DigitalOut rs485port2mode (p12); //Transmit = 1, Receive = 0
+
+int dataRxCnt        = 0;
+int dataRxBuffer[4]  = {0};
+int cur_address        = 0;
+    
+char fault[4];
+    
+void rx485Message() {
+    // Note: you need to actually read from the serial to clear the RX interrupt
+    int value = rs485port1.getc();
+    
+    if (value){
+        dataRxBuffer[dataRxCnt++]=value;
+        
+        if(dataRxCnt==4) {
+            cur_address = 10*(dataRxBuffer[0] -0x30) + (dataRxBuffer[1] -0x30);
+            pc.printf("Received >> %02d \n\r", cur_address);
+            memset(dataRxBuffer,0,sizeof(dataRxBuffer));
+            dataRxCnt=0;
+        }
+    }
+    myled4 = !myled4;
+}
+
+
+void tx485Message(int address) {
+    
+    int sum =0;
+    
+    char dataTxBuffer[12];
+    sum += dataTxBuffer[0] = 0x40;
+    sum += dataTxBuffer[1]  = 0x01;
+    sum += dataTxBuffer[2]  = address; // floor number
+    sum += dataTxBuffer[3]  = 0x0;
+    sum += dataTxBuffer[4]  = 0x0;
+    sum += dataTxBuffer[5]  = 0x0;
+    sum += dataTxBuffer[6]  = (0x30 + address / 10); 
+    sum += dataTxBuffer[7]  = (0x30 + address % 10); 
+    ; //
+    sum += dataTxBuffer[8]  = 0x0;
+    sum += dataTxBuffer[9]  = 0x0;
+    sum += dataTxBuffer[10] = 0x0;
+    sum += dataTxBuffer[11] = (char)(~sum +1);
+    
+    for(int i= 0;i<12;i++){
+        rs485port2.putc(dataTxBuffer[i]);
+    }
+    
+}
+void say (char *format, ...)
+{
+    char buffer[128];
+    va_list args;
+    va_start(args, format);
+    vsprintf(buffer,format,args);
+    
+    myVoice2Text.speakf("S");//Speak command starts with "S"
+    myVoice2Text.speakf(buffer);  
+    myVoice2Text.speakf("\r"); 
+    myVoice2Text.ready(); 
+    
+    
+    va_end(args);
+}
+
+
+int main() {
+    
+    pc.printf("\n\r");
+    pc.printf("------------------------\n\r");
+    pc.printf("Serial Test\n\r");
+    pc.printf("version = %s %s\n\r", __DATE__, __TIME__ );
+    pc.printf("------------------------\n\r");
+    rs485port1mode = 0; // Receive
+    rs485port2mode = 1; // Transmit
+    
+    
+    myVoice2Text.voice(2);   
+    say("hello");
+    
+    rs485port1.attach(&rx485Message);     
+    
+    while(1) {
+        
+        myled1 != myled1;
+        wait(0.2);
+        
+        myled2 = 0;
+        myled3 = 0;
+        
+        #if 0
+        if(rs485port1.readable() ) {
+            memset(data,0,sizeof(data));
+            rs485port1.scanf("%2s", data);
+            for (int i = 0 ; i < sizeof(data);i++){
+                pc.printf("%02x ", data[i]);
+            }
+            pc.printf("\n\r");
+            
+            myled2 = 1;
+        }
+        else {
+            pc.printf("No serial data on port 1.\r\n");
+            myled3 = 1;
+        }
+        #endif
+        
+        if (cur_address)
+        {
+            tx485Message(cur_address);
+            say("%d is open", cur_address);
+        }
+                
+       wait_ms(1000);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sun Jun 16 00:36:06 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400
\ No newline at end of file