KIM HyoengJun
/
mbed_ext_fota
external fota service implementation
ext_fota/serial_communicator.cpp@0:bab3be8d31cf, 2015-06-19 (annotated)
- Committer:
- dudnwjs
- Date:
- Fri Jun 19 06:49:20 2015 +0000
- Revision:
- 0:bab3be8d31cf
add GAPM,GAPC header
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dudnwjs | 0:bab3be8d31cf | 1 | #include "serial_communicator.h" |
dudnwjs | 0:bab3be8d31cf | 2 | |
dudnwjs | 0:bab3be8d31cf | 3 | Serial_Communicator::Serial_Communicator(Serial* _device) |
dudnwjs | 0:bab3be8d31cf | 4 | { |
dudnwjs | 0:bab3be8d31cf | 5 | debug_flag = 0; |
dudnwjs | 0:bab3be8d31cf | 6 | device = _device; |
dudnwjs | 0:bab3be8d31cf | 7 | queue = new Msg_Queue(512); |
dudnwjs | 0:bab3be8d31cf | 8 | FE_MSG_PACKET_TYPE = 0x05; |
dudnwjs | 0:bab3be8d31cf | 9 | MAX_PACKET_LENGTH = 350; |
dudnwjs | 0:bab3be8d31cf | 10 | bReceiveState = 0; |
dudnwjs | 0:bab3be8d31cf | 11 | wDataLength = 0; |
dudnwjs | 0:bab3be8d31cf | 12 | wReceivePos = 0; |
dudnwjs | 0:bab3be8d31cf | 13 | bHdrBytesRead = 0; |
dudnwjs | 0:bab3be8d31cf | 14 | memset(bReceiveElementArr,0,512); |
dudnwjs | 0:bab3be8d31cf | 15 | } |
dudnwjs | 0:bab3be8d31cf | 16 | |
dudnwjs | 0:bab3be8d31cf | 17 | Serial_Communicator::Serial_Communicator(Serial* _device, Serial* _hostpc) |
dudnwjs | 0:bab3be8d31cf | 18 | { |
dudnwjs | 0:bab3be8d31cf | 19 | debug_flag = 1; |
dudnwjs | 0:bab3be8d31cf | 20 | device = _device; |
dudnwjs | 0:bab3be8d31cf | 21 | hostpc = _hostpc; |
dudnwjs | 0:bab3be8d31cf | 22 | queue = new Msg_Queue(512); |
dudnwjs | 0:bab3be8d31cf | 23 | FE_MSG_PACKET_TYPE = 0x05; |
dudnwjs | 0:bab3be8d31cf | 24 | MAX_PACKET_LENGTH = 350; |
dudnwjs | 0:bab3be8d31cf | 25 | bReceiveState = 0; |
dudnwjs | 0:bab3be8d31cf | 26 | wDataLength = 0; |
dudnwjs | 0:bab3be8d31cf | 27 | wReceivePos = 0; |
dudnwjs | 0:bab3be8d31cf | 28 | bHdrBytesRead = 0; |
dudnwjs | 0:bab3be8d31cf | 29 | memset(bReceiveElementArr,0,512); |
dudnwjs | 0:bab3be8d31cf | 30 | } |
dudnwjs | 0:bab3be8d31cf | 31 | |
dudnwjs | 0:bab3be8d31cf | 32 | Serial_Communicator::~Serial_Communicator(void) |
dudnwjs | 0:bab3be8d31cf | 33 | { |
dudnwjs | 0:bab3be8d31cf | 34 | free(queue); |
dudnwjs | 0:bab3be8d31cf | 35 | } |
dudnwjs | 0:bab3be8d31cf | 36 | |
dudnwjs | 0:bab3be8d31cf | 37 | void Serial_Communicator::print_title() |
dudnwjs | 0:bab3be8d31cf | 38 | { |
dudnwjs | 0:bab3be8d31cf | 39 | if( debug_flag == 1) |
dudnwjs | 0:bab3be8d31cf | 40 | hostpc->printf("FOTA CLASS START!\n"); |
dudnwjs | 0:bab3be8d31cf | 41 | } |
dudnwjs | 0:bab3be8d31cf | 42 | |
dudnwjs | 0:bab3be8d31cf | 43 | void Serial_Communicator::BleMsgAlloc( unsigned short id, |
dudnwjs | 0:bab3be8d31cf | 44 | unsigned short dest_id, |
dudnwjs | 0:bab3be8d31cf | 45 | unsigned short src_id, |
dudnwjs | 0:bab3be8d31cf | 46 | unsigned short data_len, |
dudnwjs | 0:bab3be8d31cf | 47 | void *pdata, |
dudnwjs | 0:bab3be8d31cf | 48 | uint8_t *msg ) |
dudnwjs | 0:bab3be8d31cf | 49 | { |
dudnwjs | 0:bab3be8d31cf | 50 | memset(msg,0,sizeof(msg)); |
dudnwjs | 0:bab3be8d31cf | 51 | msg[0] = 0x05; |
dudnwjs | 0:bab3be8d31cf | 52 | memcpy(&msg[1],&id,sizeof(unsigned short)); |
dudnwjs | 0:bab3be8d31cf | 53 | memcpy(&msg[1+1*sizeof(unsigned short)],&dest_id,sizeof(unsigned short)); |
dudnwjs | 0:bab3be8d31cf | 54 | memcpy(&msg[1+2*sizeof(unsigned short)],&src_id,sizeof(unsigned short)); |
dudnwjs | 0:bab3be8d31cf | 55 | memcpy(&msg[1+3*sizeof(unsigned short)],&data_len,sizeof(unsigned short)); |
dudnwjs | 0:bab3be8d31cf | 56 | memcpy(&msg[1+4*sizeof(unsigned short)],pdata,data_len); |
dudnwjs | 0:bab3be8d31cf | 57 | } |
dudnwjs | 0:bab3be8d31cf | 58 | |
dudnwjs | 0:bab3be8d31cf | 59 | int Serial_Communicator::BleSendMsg(uint8_t *msg,unsigned short size) |
dudnwjs | 0:bab3be8d31cf | 60 | { |
dudnwjs | 0:bab3be8d31cf | 61 | int cnt = 0; |
dudnwjs | 0:bab3be8d31cf | 62 | if(debug_flag == 1) |
dudnwjs | 0:bab3be8d31cf | 63 | hostpc->printf("send size = %hu\n",size); |
dudnwjs | 0:bab3be8d31cf | 64 | |
dudnwjs | 0:bab3be8d31cf | 65 | for(int i=0; i < size; i++) |
dudnwjs | 0:bab3be8d31cf | 66 | { |
dudnwjs | 0:bab3be8d31cf | 67 | if( device->writeable()) |
dudnwjs | 0:bab3be8d31cf | 68 | { |
dudnwjs | 0:bab3be8d31cf | 69 | if(debug_flag == 1) |
dudnwjs | 0:bab3be8d31cf | 70 | hostpc->printf("%02X ", msg[i]); |
dudnwjs | 0:bab3be8d31cf | 71 | device->putc(msg[i]); |
dudnwjs | 0:bab3be8d31cf | 72 | cnt++; |
dudnwjs | 0:bab3be8d31cf | 73 | } |
dudnwjs | 0:bab3be8d31cf | 74 | } |
dudnwjs | 0:bab3be8d31cf | 75 | return cnt; |
dudnwjs | 0:bab3be8d31cf | 76 | } |
dudnwjs | 0:bab3be8d31cf | 77 | |
dudnwjs | 0:bab3be8d31cf | 78 | void Serial_Communicator::BleMsgEnQueue(uint8_t *msg) |
dudnwjs | 0:bab3be8d31cf | 79 | { |
dudnwjs | 0:bab3be8d31cf | 80 | queue->EnQueue((void *)msg); |
dudnwjs | 0:bab3be8d31cf | 81 | } |
dudnwjs | 0:bab3be8d31cf | 82 | |
dudnwjs | 0:bab3be8d31cf | 83 | uint8_t *Serial_Communicator::BleMsgDeQueue(void) |
dudnwjs | 0:bab3be8d31cf | 84 | { |
dudnwjs | 0:bab3be8d31cf | 85 | return (uint8_t *)queue->DeQueue(); |
dudnwjs | 0:bab3be8d31cf | 86 | } |
dudnwjs | 0:bab3be8d31cf | 87 | |
dudnwjs | 0:bab3be8d31cf | 88 | bool Serial_Communicator::IsQueueEmpty(void) |
dudnwjs | 0:bab3be8d31cf | 89 | { |
dudnwjs | 0:bab3be8d31cf | 90 | return queue->IsEmpty(); |
dudnwjs | 0:bab3be8d31cf | 91 | } |
dudnwjs | 0:bab3be8d31cf | 92 | |
dudnwjs | 0:bab3be8d31cf | 93 | void Serial_Communicator::BleReceiveMsg(void) |
dudnwjs | 0:bab3be8d31cf | 94 | { |
dudnwjs | 0:bab3be8d31cf | 95 | unsigned char tmp; |
dudnwjs | 0:bab3be8d31cf | 96 | |
dudnwjs | 0:bab3be8d31cf | 97 | |
dudnwjs | 0:bab3be8d31cf | 98 | //while(true) |
dudnwjs | 0:bab3be8d31cf | 99 | //{ |
dudnwjs | 0:bab3be8d31cf | 100 | if(device->readable()) |
dudnwjs | 0:bab3be8d31cf | 101 | { |
dudnwjs | 0:bab3be8d31cf | 102 | tmp = device->getc(); |
dudnwjs | 0:bab3be8d31cf | 103 | switch(bReceiveState) |
dudnwjs | 0:bab3be8d31cf | 104 | { |
dudnwjs | 0:bab3be8d31cf | 105 | case 0: |
dudnwjs | 0:bab3be8d31cf | 106 | if( tmp == FE_MSG_PACKET_TYPE ) |
dudnwjs | 0:bab3be8d31cf | 107 | { |
dudnwjs | 0:bab3be8d31cf | 108 | bReceiveState = 1; |
dudnwjs | 0:bab3be8d31cf | 109 | wDataLength = 0; |
dudnwjs | 0:bab3be8d31cf | 110 | wReceivePos = 0; |
dudnwjs | 0:bab3be8d31cf | 111 | bHdrBytesRead = 0; |
dudnwjs | 0:bab3be8d31cf | 112 | |
dudnwjs | 0:bab3be8d31cf | 113 | bReceiveElementArr[wReceivePos] = tmp; |
dudnwjs | 0:bab3be8d31cf | 114 | wReceivePos++; |
dudnwjs | 0:bab3be8d31cf | 115 | if(debug_flag == 1) |
dudnwjs | 0:bab3be8d31cf | 116 | hostpc->printf("\n[Receiver] Packet Type |: %02X \n", tmp); |
dudnwjs | 0:bab3be8d31cf | 117 | }else |
dudnwjs | 0:bab3be8d31cf | 118 | { |
dudnwjs | 0:bab3be8d31cf | 119 | if(debug_flag == 1) |
dudnwjs | 0:bab3be8d31cf | 120 | hostpc->printf("\n[Receiver] Packet Type Error |: %02X \n", tmp); |
dudnwjs | 0:bab3be8d31cf | 121 | } |
dudnwjs | 0:bab3be8d31cf | 122 | break; |
dudnwjs | 0:bab3be8d31cf | 123 | case 1: |
dudnwjs | 0:bab3be8d31cf | 124 | if(debug_flag == 1) |
dudnwjs | 0:bab3be8d31cf | 125 | hostpc->printf("R-%02X ",tmp); |
dudnwjs | 0:bab3be8d31cf | 126 | bHdrBytesRead++; |
dudnwjs | 0:bab3be8d31cf | 127 | bReceiveElementArr[wReceivePos] = tmp; |
dudnwjs | 0:bab3be8d31cf | 128 | wReceivePos++; |
dudnwjs | 0:bab3be8d31cf | 129 | if( bHdrBytesRead == 6 ) |
dudnwjs | 0:bab3be8d31cf | 130 | bReceiveState = 2; |
dudnwjs | 0:bab3be8d31cf | 131 | break; |
dudnwjs | 0:bab3be8d31cf | 132 | case 2: |
dudnwjs | 0:bab3be8d31cf | 133 | if(debug_flag == 1) |
dudnwjs | 0:bab3be8d31cf | 134 | hostpc->printf("R-%02X ",tmp); |
dudnwjs | 0:bab3be8d31cf | 135 | wDataLength += tmp; |
dudnwjs | 0:bab3be8d31cf | 136 | if( wDataLength > MAX_PACKET_LENGTH ) |
dudnwjs | 0:bab3be8d31cf | 137 | bReceiveState = 0; |
dudnwjs | 0:bab3be8d31cf | 138 | else |
dudnwjs | 0:bab3be8d31cf | 139 | { |
dudnwjs | 0:bab3be8d31cf | 140 | bReceiveElementArr[wReceivePos] = tmp; |
dudnwjs | 0:bab3be8d31cf | 141 | wReceivePos++; |
dudnwjs | 0:bab3be8d31cf | 142 | bReceiveState = 3; |
dudnwjs | 0:bab3be8d31cf | 143 | } |
dudnwjs | 0:bab3be8d31cf | 144 | break; |
dudnwjs | 0:bab3be8d31cf | 145 | case 3: |
dudnwjs | 0:bab3be8d31cf | 146 | if( debug_flag == 1 ) |
dudnwjs | 0:bab3be8d31cf | 147 | hostpc->printf("R-%02X ",tmp); |
dudnwjs | 0:bab3be8d31cf | 148 | wDataLength += (unsigned short) (tmp*256); |
dudnwjs | 0:bab3be8d31cf | 149 | if( wDataLength > MAX_PACKET_LENGTH ) |
dudnwjs | 0:bab3be8d31cf | 150 | { |
dudnwjs | 0:bab3be8d31cf | 151 | if( debug_flag == 1 ) |
dudnwjs | 0:bab3be8d31cf | 152 | hostpc->printf("\n[Receiver] Over SIZE: %d ", wDataLength); |
dudnwjs | 0:bab3be8d31cf | 153 | bReceiveState = 0; |
dudnwjs | 0:bab3be8d31cf | 154 | }else if (wDataLength == 0) |
dudnwjs | 0:bab3be8d31cf | 155 | { |
dudnwjs | 0:bab3be8d31cf | 156 | if( debug_flag == 1 ) |
dudnwjs | 0:bab3be8d31cf | 157 | hostpc->printf("\n[Receiver] Zero SIZE: %d ", wDataLength); |
dudnwjs | 0:bab3be8d31cf | 158 | uint8_t *msg; |
dudnwjs | 0:bab3be8d31cf | 159 | msg = new uint8_t[wReceivePos]; |
dudnwjs | 0:bab3be8d31cf | 160 | memcpy(msg,bReceiveElementArr,wReceivePos); |
dudnwjs | 0:bab3be8d31cf | 161 | BleMsgEnQueue(msg); |
dudnwjs | 0:bab3be8d31cf | 162 | bReceiveState = 0; |
dudnwjs | 0:bab3be8d31cf | 163 | }else |
dudnwjs | 0:bab3be8d31cf | 164 | { |
dudnwjs | 0:bab3be8d31cf | 165 | bReceiveElementArr[wReceivePos] = tmp; |
dudnwjs | 0:bab3be8d31cf | 166 | wReceivePos++; |
dudnwjs | 0:bab3be8d31cf | 167 | bReceiveState = 4; |
dudnwjs | 0:bab3be8d31cf | 168 | } |
dudnwjs | 0:bab3be8d31cf | 169 | break; |
dudnwjs | 0:bab3be8d31cf | 170 | case 4: |
dudnwjs | 0:bab3be8d31cf | 171 | if( debug_flag == 1 ) |
dudnwjs | 0:bab3be8d31cf | 172 | hostpc->printf("R-%02X ",tmp); |
dudnwjs | 0:bab3be8d31cf | 173 | bReceiveElementArr[wReceivePos] = tmp; |
dudnwjs | 0:bab3be8d31cf | 174 | wReceivePos++; |
dudnwjs | 0:bab3be8d31cf | 175 | // 9 = 1(first byte = FE_MSG_PACKET_TYPE) + 2(type) +2(dstid) +2(srcid) +2(length size) |
dudnwjs | 0:bab3be8d31cf | 176 | if(wReceivePos == wDataLength + 9) |
dudnwjs | 0:bab3be8d31cf | 177 | { |
dudnwjs | 0:bab3be8d31cf | 178 | uint8_t *msg; |
dudnwjs | 0:bab3be8d31cf | 179 | msg = new uint8_t[wReceivePos]; |
dudnwjs | 0:bab3be8d31cf | 180 | memcpy(msg,bReceiveElementArr,wReceivePos); |
dudnwjs | 0:bab3be8d31cf | 181 | BleMsgEnQueue(msg); |
dudnwjs | 0:bab3be8d31cf | 182 | bReceiveState = 0; |
dudnwjs | 0:bab3be8d31cf | 183 | if( debug_flag == 1 ) |
dudnwjs | 0:bab3be8d31cf | 184 | hostpc->printf("\n[Receiver] Rcv Data SIZE: %d ", wDataLength); |
dudnwjs | 0:bab3be8d31cf | 185 | } |
dudnwjs | 0:bab3be8d31cf | 186 | break; |
dudnwjs | 0:bab3be8d31cf | 187 | default: |
dudnwjs | 0:bab3be8d31cf | 188 | if(debug_flag == 1) |
dudnwjs | 0:bab3be8d31cf | 189 | hostpc->printf("ERROR STRAGE STATE\n"); |
dudnwjs | 0:bab3be8d31cf | 190 | break; |
dudnwjs | 0:bab3be8d31cf | 191 | } |
dudnwjs | 0:bab3be8d31cf | 192 | } |
dudnwjs | 0:bab3be8d31cf | 193 | //} |
dudnwjs | 0:bab3be8d31cf | 194 | } |
dudnwjs | 0:bab3be8d31cf | 195 | |
dudnwjs | 0:bab3be8d31cf | 196 |