Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

Committer:
Jeej
Date:
Thu Sep 01 18:13:46 2016 +0000
Revision:
46:665391110051
Parent:
45:b85384e7d825
Child:
49:81d5bddb02f0
Point to point implemented. Need to support several commands at the same time.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 25:aac250164497 1 #include "mbed.h"
Jeej 25:aac250164497 2 #include "rtos.h"
Jeej 25:aac250164497 3 #include "dbg.h"
Jeej 25:aac250164497 4 #include "d7a_com.h"
Jeej 25:aac250164497 5 #include "d7a_common.h"
Jeej 25:aac250164497 6 #include "d7a_fs.h"
Jeej 43:28202405094d 7 #include "d7a.h"
Jeej 25:aac250164497 8
Jeej 25:aac250164497 9
Jeej 25:aac250164497 10 #define FS_MAX_FILE_QTY 256
Jeej 25:aac250164497 11 #define FS_MAX_MIRROR_QTY 32
Jeej 25:aac250164497 12 #define FS_MAX_WATCHERS_QTY 32
Jeej 25:aac250164497 13
Jeej 25:aac250164497 14 #define FS_NULL_MAP 0xFF // XXX: this actually removes usage of file 255
Jeej 25:aac250164497 15
Jeej 25:aac250164497 16 TYPEDEF_STRUCT_PACKED {
Jeej 30:d775c1409849 17 uint8_t id;
Jeej 25:aac250164497 18 uint8_t cmd;
Jeej 25:aac250164497 19 uint8_t fid;
Jeej 25:aac250164497 20 uint32_t offset;
Jeej 25:aac250164497 21 uint32_t length;
Jeej 25:aac250164497 22 } d7a_fs_com_req_t;
Jeej 25:aac250164497 23
Jeej 25:aac250164497 24 TYPEDEF_STRUCT_PACKED {
Jeej 30:d775c1409849 25 uint8_t id;
Jeej 25:aac250164497 26 uint8_t cmd;
Jeej 30:d775c1409849 27 int8_t status;
Jeej 25:aac250164497 28 uint32_t length;
Jeej 25:aac250164497 29 uint8_t data[1];
Jeej 25:aac250164497 30 } d7a_fs_com_resp_t;
Jeej 25:aac250164497 31
Jeej 25:aac250164497 32 typedef struct {
Jeej 25:aac250164497 33 d7a_fs_com_req_t req;
Jeej 34:1311cc53201a 34 int8_t status;
Jeej 25:aac250164497 35 void* data;
Jeej 25:aac250164497 36 } d7a_fs_com_t;
Jeej 25:aac250164497 37
Jeej 25:aac250164497 38 typedef struct {
Jeej 25:aac250164497 39 Thread* thread;
Jeej 26:9f0b9833cac6 40 Queue<void, 8> fs_done;
Jeej 30:d775c1409849 41 const d7a_fs_callbacks_t* callback;
Jeej 25:aac250164497 42 Queue<d7a_com_rx_msg_t, 16> pkt_queue;
Jeej 25:aac250164497 43 uint8_t hdr_map[FS_MAX_FILE_QTY];
Jeej 25:aac250164497 44 uint8_t nb_files;
Jeej 30:d775c1409849 45 d7a_fs_com_t com[FS_MAX_CONCURRENCY];
Jeej 25:aac250164497 46 } d7a_fs_ctx_t;
Jeej 25:aac250164497 47
Jeej 25:aac250164497 48 d7a_fs_ctx_t g_fs_ctx;
Jeej 25:aac250164497 49
Jeej 25:aac250164497 50 void d7a_fs_thread(const void *p);
Jeej 25:aac250164497 51
Jeej 30:d775c1409849 52 void d7a_fs_open(const d7a_fs_callbacks_t* config)
Jeej 25:aac250164497 53 {
Jeej 25:aac250164497 54 FPRINT("\r\n");
Jeej 25:aac250164497 55
Jeej 30:d775c1409849 56 g_fs_ctx.callback = config;
Jeej 31:ab9bfdbc6b44 57 g_fs_ctx.thread = new Thread(d7a_fs_thread, NULL, osPriorityHigh, DEFAULT_STACK_SIZE);
Jeej 25:aac250164497 58 }
Jeej 25:aac250164497 59
Jeej 25:aac250164497 60 static void d7a_fs_msg(uint8_t* buf, uint8_t len, uint8_t id)
Jeej 25:aac250164497 61 {
Jeej 25:aac250164497 62 FPRINT("\r\n");
Jeej 25:aac250164497 63 d7a_com_tx_msg_t msg;
Jeej 25:aac250164497 64 msg.id = id;
Jeej 25:aac250164497 65 msg.pbuf = buf;
Jeej 25:aac250164497 66 msg.plen = len;
Jeej 25:aac250164497 67 msg.alen = 0;
Jeej 34:1311cc53201a 68 d7a_com_post_msg(&msg);
Jeej 25:aac250164497 69 }
Jeej 25:aac250164497 70
Jeej 25:aac250164497 71 void d7a_fs_new_pkt(d7a_com_rx_msg_t* pkt)
Jeej 25:aac250164497 72 {
Jeej 25:aac250164497 73 FPRINT("\r\n");
Jeej 25:aac250164497 74 ASSERT(g_fs_ctx.pkt_queue.put(pkt) == osOK, "FS queue full!\r\n");
Jeej 25:aac250164497 75 }
Jeej 25:aac250164497 76
Jeej 25:aac250164497 77 d7a_com_rx_msg_t* d7a_fs_wait_pkt( uint32_t millisec )
Jeej 25:aac250164497 78 {
Jeej 30:d775c1409849 79 FPRINT("(millisec:%d)\r\n", millisec);
Jeej 25:aac250164497 80 osEvent evt = g_fs_ctx.pkt_queue.get(millisec);
Jeej 25:aac250164497 81 return (evt.status == osEventMessage)? (d7a_com_rx_msg_t*)evt.value.p : NULL;
Jeej 25:aac250164497 82 }
Jeej 25:aac250164497 83
Jeej 46:665391110051 84 void d7a_fs_notif_done(const uint8_t file_id, const uint8_t error)
Jeej 46:665391110051 85 {
Jeej 46:665391110051 86 g_fs_ctx.callback->notif_done(file_id, error);
Jeej 46:665391110051 87 }
Jeej 46:665391110051 88
Jeej 27:934ab7455115 89
Jeej 30:d775c1409849 90 #define OP_SIZE_RD 11
Jeej 30:d775c1409849 91 #define OP_SIZE_WR 11
Jeej 30:d775c1409849 92 #define OP_SIZE_TOUCH 11
Jeej 41:a924aa709b6f 93 #define OP_SIZE_SYNC 11
Jeej 30:d775c1409849 94 #define OP_SIZE_STAT 3
Jeej 30:d775c1409849 95 #define OP_SIZE_FLUSH 3
Jeej 30:d775c1409849 96 #define OP_SIZE_CREATE 11
Jeej 30:d775c1409849 97 #define OP_SIZE_RETSTAT (3+4)
Jeej 30:d775c1409849 98 #define OP_SIZE_RETDATA (3+4)
Jeej 41:a924aa709b6f 99 uint8_t k_valid_cmd[] = {FS_OP_RD, FS_OP_WR, FS_OP_TOUCH ,FS_OP_STAT, FS_OP_FLUSH, FS_OP_CREATE, FS_OP_SYNC};
Jeej 41:a924aa709b6f 100 uint8_t k_valid_size[]= {OP_SIZE_RD,OP_SIZE_WR,OP_SIZE_TOUCH,OP_SIZE_STAT,OP_SIZE_FLUSH,OP_SIZE_CREATE,OP_SIZE_SYNC};
Jeej 41:a924aa709b6f 101
Jeej 30:d775c1409849 102 /// ------------------------------------------------------------------
Jeej 30:d775c1409849 103 /// |TOKEN|CMD/RESP| PAYLOAD |
Jeej 30:d775c1409849 104 /// --------------------------------------------------------------
Jeej 30:d775c1409849 105 /// | 1B | 1B | PKT.blen - 1 bytes |
Jeej 30:d775c1409849 106 /// --------------------------------------------------------------
Jeej 30:d775c1409849 107 /// | | | 1B | 4B | 4B | PKT.blen - 11 bytes|
Jeej 30:d775c1409849 108 /// --------------------------------------------------------------
Jeej 30:d775c1409849 109 // | | write | FID | offset | length | datas... |
Jeej 30:d775c1409849 110 // | | read | FID | offset | length |
Jeej 30:d775c1409849 111 // | | touch | FID | offset | length |
Jeej 30:d775c1409849 112 // | | exist | FID |
Jeej 30:d775c1409849 113 // | | flush | FID |
Jeej 30:d775c1409849 114 // | | retstat|status| length | <kal_fs_properties_t>
Jeej 30:d775c1409849 115 // | | retdat |status| length | datas... |
Jeej 25:aac250164497 116 void d7a_fs_thread(const void *p)
Jeej 25:aac250164497 117 {
Jeej 25:aac250164497 118 FPRINT("\r\n");
Jeej 25:aac250164497 119 d7a_com_rx_msg_t* pkt;
Jeej 26:9f0b9833cac6 120 int8_t status = FS_STAT_OK;
Jeej 25:aac250164497 121
Jeej 25:aac250164497 122 while (true)
Jeej 25:aac250164497 123 {
Jeej 25:aac250164497 124 status = FS_STAT_OK;
Jeej 25:aac250164497 125 // TODO: For now only one outgoing-request can be pending
Jeej 25:aac250164497 126 // An incoming-request response can be served simultaneously
Jeej 25:aac250164497 127 // TODO: handle segmentation. For now MTU = 255-10 = 245
Jeej 25:aac250164497 128 pkt = d7a_fs_wait_pkt();
Jeej 25:aac250164497 129 ASSERT(pkt != NULL, "FS NULL pkt\r\n");
Jeej 25:aac250164497 130 // ---------------------------------------------------------------------------
Jeej 25:aac250164497 131 // Peer request
Jeej 25:aac250164497 132 // ---------------------------------------------------------------------------
Jeej 25:aac250164497 133 switch (pkt->id)
Jeej 25:aac250164497 134 {
Jeej 25:aac250164497 135 case KAL_COM_FLOW_FS_CMD:
Jeej 25:aac250164497 136 d7a_fs_com_req_t* req = (d7a_fs_com_req_t*)pkt->buffer;
Jeej 34:1311cc53201a 137 DPRINT("Rfs[%d](%d) cmd:%d\n", req->fid, req->id, req->cmd);
Jeej 30:d775c1409849 138 //dbg_print_data("%02X ", (uint8_t*)req, sizeof(d7a_fs_com_req_t));
Jeej 30:d775c1409849 139 //DPRINT("\r\n");
Jeej 30:d775c1409849 140 d7a_fs_com_resp_t buf = (d7a_fs_com_resp_t) {.id = req->id, .cmd = FS_OP_RETSTAT};
Jeej 25:aac250164497 141
Jeej 25:aac250164497 142 // Error management makes sense here as we face peer-requests,
Jeej 25:aac250164497 143 // and we don't want to assert because of the peer.
Jeej 25:aac250164497 144 //status = d7a_fs_check_req(req, pkt->blen);
Jeej 25:aac250164497 145 //buf.status = status;
Jeej 25:aac250164497 146 buf.status = FS_STAT_OK;
Jeej 25:aac250164497 147
Jeej 25:aac250164497 148 // From here we assume that the request is valid
Jeej 25:aac250164497 149 // TODO: for now we consider that COM-FS request are targetting
Jeej 25:aac250164497 150 // FIDs that are "local" to the Host, but we can extend this
Jeej 25:aac250164497 151 // to "distant" files as well.(i.e. access SPI-Flash of an Host)
Jeej 25:aac250164497 152 if (status != FS_STAT_OK)
Jeej 25:aac250164497 153 {
Jeej 25:aac250164497 154 buf.length = 0;
Jeej 25:aac250164497 155 // Here we respond to request errors and OP_STAT
Jeej 25:aac250164497 156 d7a_fs_msg((uint8_t*)&buf,OP_SIZE_RETSTAT, KAL_COM_FLOW_FS_RESP);
Jeej 25:aac250164497 157 }
Jeej 25:aac250164497 158 else if (req->cmd == FS_OP_RD)
Jeej 25:aac250164497 159 {
Jeej 25:aac250164497 160 d7a_fs_com_resp_t* b = (d7a_fs_com_resp_t*)MALLOC(OP_SIZE_RETDATA + req->length);
Jeej 30:d775c1409849 161 uint32_t len = g_fs_ctx.callback->read_file(req->fid, req->offset, req->length, &b->data[0]);
Jeej 30:d775c1409849 162 b->id = req->id;
Jeej 25:aac250164497 163 b->length = len;
Jeej 25:aac250164497 164 b->cmd = FS_OP_RETDATA;
Jeej 25:aac250164497 165 b->status = FS_STAT_OK; // TODO
Jeej 25:aac250164497 166 d7a_fs_msg((uint8_t*)b, OP_SIZE_RETDATA + req->length, KAL_COM_FLOW_FS_RESP);
Jeej 25:aac250164497 167 FREE(b);
Jeej 25:aac250164497 168 }
Jeej 25:aac250164497 169 else if (req->cmd == FS_OP_WR)
Jeej 25:aac250164497 170 {
Jeej 30:d775c1409849 171 buf.length = g_fs_ctx.callback->write_file(req->fid, req->offset, req->length, &pkt->buffer[OP_SIZE_WR]);
Jeej 25:aac250164497 172 d7a_fs_msg((uint8_t*)&buf, OP_SIZE_RETSTAT, KAL_COM_FLOW_FS_RESP);
Jeej 25:aac250164497 173 }
Jeej 45:b85384e7d825 174 else if (req->cmd == FS_OP_TOUCH)
Jeej 45:b85384e7d825 175 {
Jeej 45:b85384e7d825 176 DPRINT("PS Touch f:%d o:%d s:%d\r\n", req->fid, req->offset, req->length);
Jeej 45:b85384e7d825 177 //buf.length = g_fs_ctx.callback->touch_file(req->fid, req->offset, req->length);
Jeej 45:b85384e7d825 178 d7a_fs_msg((uint8_t*)&buf, OP_SIZE_RETSTAT, KAL_COM_FLOW_FS_RESP);
Jeej 45:b85384e7d825 179 }
Jeej 26:9f0b9833cac6 180 else
Jeej 26:9f0b9833cac6 181 {
Jeej 43:28202405094d 182 ASSERT(false, "FS: Unsupported cmd %d\r\n", req->cmd);
Jeej 26:9f0b9833cac6 183 }
Jeej 25:aac250164497 184 break;
Jeej 25:aac250164497 185 // ---------------------------------------------------------------------------
Jeej 25:aac250164497 186 // Response to our commands
Jeej 25:aac250164497 187 // ---------------------------------------------------------------------------
Jeej 25:aac250164497 188 case KAL_COM_FLOW_FS_RESP:
Jeej 43:28202405094d 189 ASSERT(false, "FS: Commands are not used\r\n");
Jeej 25:aac250164497 190 break;
Jeej 25:aac250164497 191 default:
Jeej 25:aac250164497 192 EPRINT("FS Unknown Flow ID 0x%02X\r\n", pkt->id);
Jeej 25:aac250164497 193 break;
Jeej 25:aac250164497 194 }
Jeej 25:aac250164497 195 FREE(pkt);
Jeej 25:aac250164497 196 }
Jeej 25:aac250164497 197 }