Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

Committer:
Jeej
Date:
Thu Mar 31 14:48:50 2016 +0000
Revision:
26:9f0b9833cac6
Parent:
25:aac250164497
Child:
27:934ab7455115
Modem control.

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 25:aac250164497 7
Jeej 25:aac250164497 8
Jeej 25:aac250164497 9 #define FS_MAX_FILE_QTY 256
Jeej 25:aac250164497 10 #define FS_MAX_MIRROR_QTY 32
Jeej 25:aac250164497 11 #define FS_MAX_WATCHERS_QTY 32
Jeej 25:aac250164497 12
Jeej 25:aac250164497 13 #define FS_NULL_MAP 0xFF // XXX: this actually removes usage of file 255
Jeej 25:aac250164497 14
Jeej 25:aac250164497 15 TYPEDEF_STRUCT_PACKED {
Jeej 25:aac250164497 16 uint8_t cmd;
Jeej 25:aac250164497 17 uint8_t fid;
Jeej 25:aac250164497 18 uint32_t offset;
Jeej 25:aac250164497 19 uint32_t length;
Jeej 25:aac250164497 20 } d7a_fs_com_req_t;
Jeej 25:aac250164497 21
Jeej 25:aac250164497 22 TYPEDEF_STRUCT_PACKED {
Jeej 25:aac250164497 23 uint8_t cmd;
Jeej 25:aac250164497 24 int8_t status;
Jeej 25:aac250164497 25 uint32_t length;
Jeej 25:aac250164497 26 uint8_t data[1];
Jeej 25:aac250164497 27 } d7a_fs_com_resp_t;
Jeej 25:aac250164497 28
Jeej 25:aac250164497 29 typedef struct {
Jeej 25:aac250164497 30 d7a_fs_com_req_t req;
Jeej 25:aac250164497 31 void* data;
Jeej 25:aac250164497 32 } d7a_fs_com_t;
Jeej 25:aac250164497 33
Jeej 25:aac250164497 34 typedef struct {
Jeej 25:aac250164497 35 Thread* thread;
Jeej 26:9f0b9833cac6 36 Queue<void, 8> fs_done;
Jeej 25:aac250164497 37 WriteFileFunction write_file;
Jeej 25:aac250164497 38 ReadFileFunction read_file;
Jeej 25:aac250164497 39 Queue<d7a_com_rx_msg_t, 16> pkt_queue;
Jeej 25:aac250164497 40 uint8_t hdr_map[FS_MAX_FILE_QTY];
Jeej 25:aac250164497 41 uint8_t nb_files;
Jeej 25:aac250164497 42 d7a_fs_com_t com; // just one for now
Jeej 25:aac250164497 43 } d7a_fs_ctx_t;
Jeej 25:aac250164497 44
Jeej 25:aac250164497 45 d7a_fs_ctx_t g_fs_ctx;
Jeej 25:aac250164497 46
Jeej 25:aac250164497 47 void d7a_fs_thread(const void *p);
Jeej 25:aac250164497 48
Jeej 25:aac250164497 49 void d7a_fs_open(WriteFileFunction write_file, ReadFileFunction read_file)
Jeej 25:aac250164497 50 {
Jeej 25:aac250164497 51 FPRINT("\r\n");
Jeej 25:aac250164497 52
Jeej 25:aac250164497 53 memset(&g_fs_ctx.com, 0, sizeof(g_fs_ctx.com));
Jeej 25:aac250164497 54 g_fs_ctx.write_file = write_file;
Jeej 25:aac250164497 55 g_fs_ctx.read_file = read_file;
Jeej 26:9f0b9833cac6 56 //g_fs_ctx.fs_done = new Semaphore(1);
Jeej 25:aac250164497 57 g_fs_ctx.thread = new Thread(d7a_fs_thread, NULL, osPriorityBelowNormal, DEFAULT_STACK_SIZE*2);
Jeej 25:aac250164497 58
Jeej 25:aac250164497 59 // Wait to consume Semaphore
Jeej 26:9f0b9833cac6 60 //g_fs_ctx.fs_done->wait();
Jeej 25:aac250164497 61 }
Jeej 25:aac250164497 62
Jeej 25:aac250164497 63 static void d7a_fs_msg(uint8_t* buf, uint8_t len, uint8_t id)
Jeej 25:aac250164497 64 {
Jeej 25:aac250164497 65 FPRINT("\r\n");
Jeej 25:aac250164497 66 d7a_com_tx_msg_t msg;
Jeej 25:aac250164497 67 msg.id = id;
Jeej 25:aac250164497 68 msg.pbuf = buf;
Jeej 25:aac250164497 69 msg.plen = len;
Jeej 25:aac250164497 70 msg.alen = 0;
Jeej 25:aac250164497 71 d7a_com_send_msg(&msg);
Jeej 25:aac250164497 72 }
Jeej 25:aac250164497 73
Jeej 26:9f0b9833cac6 74 void* d7a_fs_wait_done( uint32_t millisec )
Jeej 25:aac250164497 75 {
Jeej 25:aac250164497 76 FPRINT("\r\n");
Jeej 26:9f0b9833cac6 77 void* ret;
Jeej 26:9f0b9833cac6 78 osEvent evt = g_fs_ctx.fs_done.get(millisec);
Jeej 26:9f0b9833cac6 79 if (evt.status == osEventMessage)
Jeej 26:9f0b9833cac6 80 {
Jeej 26:9f0b9833cac6 81 ret = (void*)evt.value.p;
Jeej 26:9f0b9833cac6 82 }
Jeej 26:9f0b9833cac6 83 else
Jeej 26:9f0b9833cac6 84 {
Jeej 26:9f0b9833cac6 85 ret = (void*)0xFFFFFFFF;
Jeej 26:9f0b9833cac6 86 EPRINT("FS Wait Timeout!\r\n");
Jeej 26:9f0b9833cac6 87 }
Jeej 26:9f0b9833cac6 88 return ret;
Jeej 25:aac250164497 89 }
Jeej 25:aac250164497 90
Jeej 25:aac250164497 91 void d7a_fs_new_pkt(d7a_com_rx_msg_t* pkt)
Jeej 25:aac250164497 92 {
Jeej 25:aac250164497 93 FPRINT("\r\n");
Jeej 25:aac250164497 94 ASSERT(g_fs_ctx.pkt_queue.put(pkt) == osOK, "FS queue full!\r\n");
Jeej 25:aac250164497 95 }
Jeej 25:aac250164497 96
Jeej 25:aac250164497 97 d7a_com_rx_msg_t* d7a_fs_wait_pkt( uint32_t millisec )
Jeej 25:aac250164497 98 {
Jeej 25:aac250164497 99 FPRINT("\r\n");
Jeej 25:aac250164497 100 osEvent evt = g_fs_ctx.pkt_queue.get(millisec);
Jeej 25:aac250164497 101 return (evt.status == osEventMessage)? (d7a_com_rx_msg_t*)evt.value.p : NULL;
Jeej 25:aac250164497 102 }
Jeej 25:aac250164497 103
Jeej 25:aac250164497 104 static void d7a_fs_hdr(uint8_t fid, d7a_fs_header_t* hdr)
Jeej 25:aac250164497 105 {
Jeej 25:aac250164497 106 FPRINT("\r\n");
Jeej 25:aac250164497 107 g_fs_ctx.read_file(fid, 0, sizeof(d7a_fs_header_t), (uint8_t*)hdr);
Jeej 25:aac250164497 108 }
Jeej 25:aac250164497 109
Jeej 25:aac250164497 110 uint32_t d7a_fs_get_properties(uint8_t fid, d7a_fs_property_t prop, d7a_fs_properties_t* props)
Jeej 25:aac250164497 111 {
Jeej 25:aac250164497 112 FPRINT("\r\n");
Jeej 25:aac250164497 113 d7a_fs_header_t hdr;
Jeej 25:aac250164497 114 d7a_fs_hdr(fid, &hdr);
Jeej 25:aac250164497 115
Jeej 25:aac250164497 116 uint32_t ret = 0;
Jeej 25:aac250164497 117 if (prop == KAL_FS_PROP_ALL)
Jeej 25:aac250164497 118 {
Jeej 25:aac250164497 119 // Fill in the API structure
Jeej 25:aac250164497 120 //props->addr = (uint32_t)d7a_fs_get_memory_addr(hdr);
Jeej 25:aac250164497 121 props->type = hdr.byte.type;
Jeej 25:aac250164497 122
Jeej 25:aac250164497 123 props->afid = hdr.byte.afid;
Jeej 25:aac250164497 124 props->ifid = hdr.byte.ifid;
Jeej 25:aac250164497 125 props->prop = hdr.byte.prop;
Jeej 25:aac250164497 126 props->perm = hdr.byte.perm;
Jeej 25:aac250164497 127
Jeej 25:aac250164497 128 props->length = hdr.bf.length;
Jeej 25:aac250164497 129 props->alloc = hdr.bf.alloc;
Jeej 25:aac250164497 130 }
Jeej 25:aac250164497 131 else
Jeej 25:aac250164497 132 {
Jeej 25:aac250164497 133 switch(prop)
Jeej 25:aac250164497 134 {
Jeej 25:aac250164497 135 case KAL_FS_PROP_SIZE: ret = hdr.bf.length; break;
Jeej 25:aac250164497 136 case KAL_FS_PROP_ALLOC: ret = hdr.bf.alloc; break;
Jeej 25:aac250164497 137 case KAL_FS_PROP_TYPE: ret = hdr.byte.type; break;
Jeej 25:aac250164497 138 //case KAL_FS_PROP_ADDR: ret = (uint32_t)d7a_fs_get_memory_addr(hdr); break;
Jeej 25:aac250164497 139 case KAL_FS_PROP_AFID: ret = hdr.byte.afid; break;
Jeej 25:aac250164497 140 case KAL_FS_PROP_IFID: ret = hdr.byte.ifid; break;
Jeej 25:aac250164497 141 case KAL_FS_PROP_PROP: ret = hdr.byte.prop; break;
Jeej 25:aac250164497 142 case KAL_FS_PROP_PERM: ret = hdr.byte.perm; break;
Jeej 25:aac250164497 143 default:
Jeej 25:aac250164497 144 ASSERT(false, "FS:Invalid get prop request %d\n",prop);
Jeej 25:aac250164497 145 }
Jeej 25:aac250164497 146 }
Jeej 25:aac250164497 147 DPRINT("GetProp[%d](%d): %d\n",fid,prop,ret);
Jeej 25:aac250164497 148 return ret;
Jeej 25:aac250164497 149 }
Jeej 25:aac250164497 150
Jeej 26:9f0b9833cac6 151 void d7a_fs_distant_stat(uint8_t fid, int* length)
Jeej 26:9f0b9833cac6 152 {
Jeej 26:9f0b9833cac6 153 FPRINT("\r\n");
Jeej 26:9f0b9833cac6 154 // "Distant" Files
Jeej 26:9f0b9833cac6 155 ASSERT(g_fs_ctx.com.req.cmd == FS_OP_NULL, "FS: Concurrent Distant File access\n");
Jeej 26:9f0b9833cac6 156 g_fs_ctx.com.req = (d7a_fs_com_req_t){FS_OP_STAT,fid,0,0};
Jeej 26:9f0b9833cac6 157 g_fs_ctx.com.data = length;
Jeej 26:9f0b9833cac6 158 d7a_fs_msg((uint8_t*)&g_fs_ctx.com.req,sizeof(d7a_fs_com_req_t), KAL_COM_FLOW_FS_CMD);
Jeej 26:9f0b9833cac6 159 // We do a "normal" STAT but we don't want to update our local(true) file-size
Jeej 26:9f0b9833cac6 160 // with the response of the STAT as:
Jeej 26:9f0b9833cac6 161 // - the distant is likely a "Host-file" with hazardous size/alloc
Jeej 26:9f0b9833cac6 162 // - we may not even have the corresponding local file (-> assert when getting props)
Jeej 26:9f0b9833cac6 163 // So flag the cmd to differentiate response treatment
Jeej 26:9f0b9833cac6 164 g_fs_ctx.com.req.cmd = FS_OP_DSTAT; // XXX
Jeej 26:9f0b9833cac6 165 }
Jeej 26:9f0b9833cac6 166
Jeej 25:aac250164497 167 int d7a_fs_distant_create(uint8_t fid, d7a_fs_properties_t* props)
Jeej 25:aac250164497 168 {
Jeej 25:aac250164497 169 FPRINT("\r\n");
Jeej 25:aac250164497 170 DPRINT("CrD[%d] type 0x%x\n",fid,props->type);
Jeej 25:aac250164497 171
Jeej 25:aac250164497 172 switch (props->type)
Jeej 25:aac250164497 173 {
Jeej 25:aac250164497 174 case EEPROM:
Jeej 25:aac250164497 175 case RAM:
Jeej 25:aac250164497 176 case PFLASH:
Jeej 25:aac250164497 177 case HOST:
Jeej 25:aac250164497 178 ASSERT(g_fs_ctx.com.req.cmd == FS_OP_NULL,"FS: Concurrent Distant File access\n");
Jeej 25:aac250164497 179 // Build WR command
Jeej 25:aac250164497 180 uint8_t* buf = (uint8_t*)MALLOC(sizeof(d7a_fs_com_req_t) + sizeof(d7a_fs_properties_t));
Jeej 25:aac250164497 181 d7a_fs_com_req_t* buf_req = (d7a_fs_com_req_t*)buf;
Jeej 25:aac250164497 182 *buf_req = (d7a_fs_com_req_t){FS_OP_CREATE,fid,0,sizeof(d7a_fs_properties_t)};
Jeej 25:aac250164497 183 memcpy(&buf[sizeof(d7a_fs_com_req_t)],(uint8_t*)props,sizeof(d7a_fs_properties_t));
Jeej 25:aac250164497 184
Jeej 25:aac250164497 185 // Keep command request for response treatment
Jeej 25:aac250164497 186 g_fs_ctx.com.req.cmd = FS_OP_CREATE;
Jeej 25:aac250164497 187 d7a_fs_msg(buf,sizeof(d7a_fs_com_req_t) + sizeof(d7a_fs_properties_t), KAL_COM_FLOW_FS_CMD);
Jeej 25:aac250164497 188 FREE(buf);
Jeej 25:aac250164497 189 break;
Jeej 25:aac250164497 190 // Wrong type
Jeej 25:aac250164497 191 default:
Jeej 25:aac250164497 192 ASSERT(false, "FS:post_distant_create wrong file type %x\n",props->type);
Jeej 25:aac250164497 193 break;
Jeej 25:aac250164497 194 }
Jeej 25:aac250164497 195 return 0;
Jeej 25:aac250164497 196 }
Jeej 25:aac250164497 197
Jeej 25:aac250164497 198
Jeej 25:aac250164497 199 #define OP_SIZE_RD 10
Jeej 25:aac250164497 200 #define OP_SIZE_WR 10
Jeej 25:aac250164497 201 #define OP_SIZE_STAT 2
Jeej 25:aac250164497 202 #define OP_SIZE_FLUSH 2
Jeej 25:aac250164497 203 #define OP_SIZE_CREATE 10
Jeej 25:aac250164497 204 #define OP_SIZE_RETSTAT (2+4)
Jeej 25:aac250164497 205 #define OP_SIZE_RETDATA (2+4)
Jeej 25:aac250164497 206 uint8_t k_valid_cmd[] = {FS_OP_RD, FS_OP_WR, FS_OP_STAT, FS_OP_FLUSH, FS_OP_CREATE};
Jeej 25:aac250164497 207 uint8_t k_valid_size[]= {OP_SIZE_RD,OP_SIZE_WR,OP_SIZE_STAT,OP_SIZE_FLUSH,OP_SIZE_CREATE};
Jeej 25:aac250164497 208
Jeej 25:aac250164497 209
Jeej 25:aac250164497 210 // TODO: Add a token field for multiple transactions
Jeej 25:aac250164497 211 /// --------------------------------------------------------
Jeej 25:aac250164497 212 /// |CMD/RESP| PAYLOAD |
Jeej 25:aac250164497 213 /// --------------------------------------------------------
Jeej 25:aac250164497 214 /// | 1B | PKT.blen - 1 bytes |
Jeej 25:aac250164497 215 /// --------------------------------------------------------
Jeej 25:aac250164497 216 /// | | 1B | 4B | 4B | PKT.blen - 10 bytes|
Jeej 25:aac250164497 217 /// --------------------------------------------------------
Jeej 25:aac250164497 218 // | write | FID | offset | length | datas... |
Jeej 25:aac250164497 219 // | read | FID | offset | length |
Jeej 25:aac250164497 220 // | flush | FID |
Jeej 25:aac250164497 221 // | retstat|status| length | <d7a_fs_properties_t>
Jeej 25:aac250164497 222 // | retdat |status| length | datas... |
Jeej 25:aac250164497 223 void d7a_fs_thread(const void *p)
Jeej 25:aac250164497 224 {
Jeej 25:aac250164497 225 FPRINT("\r\n");
Jeej 25:aac250164497 226 d7a_com_rx_msg_t* pkt;
Jeej 26:9f0b9833cac6 227 int8_t status = FS_STAT_OK;
Jeej 25:aac250164497 228
Jeej 25:aac250164497 229 while (true)
Jeej 25:aac250164497 230 {
Jeej 25:aac250164497 231 status = FS_STAT_OK;
Jeej 25:aac250164497 232 // TODO: For now only one outgoing-request can be pending
Jeej 25:aac250164497 233 // An incoming-request response can be served simultaneously
Jeej 25:aac250164497 234 // TODO: handle segmentation. For now MTU = 255-10 = 245
Jeej 25:aac250164497 235 pkt = d7a_fs_wait_pkt();
Jeej 25:aac250164497 236 ASSERT(pkt != NULL, "FS NULL pkt\r\n");
Jeej 25:aac250164497 237 // ---------------------------------------------------------------------------
Jeej 25:aac250164497 238 // Peer request
Jeej 25:aac250164497 239 // ---------------------------------------------------------------------------
Jeej 25:aac250164497 240 switch (pkt->id)
Jeej 25:aac250164497 241 {
Jeej 25:aac250164497 242 case KAL_COM_FLOW_FS_CMD:
Jeej 25:aac250164497 243 d7a_fs_com_req_t* req = (d7a_fs_com_req_t*)pkt->buffer;
Jeej 25:aac250164497 244 DPRINT("Rfs[%d] cmd:%d\n",req->fid,req->cmd);
Jeej 25:aac250164497 245 d7a_fs_com_resp_t buf = (d7a_fs_com_resp_t) {.cmd = FS_OP_RETSTAT};
Jeej 25:aac250164497 246
Jeej 25:aac250164497 247 // Error management makes sense here as we face peer-requests,
Jeej 25:aac250164497 248 // and we don't want to assert because of the peer.
Jeej 25:aac250164497 249 //status = d7a_fs_check_req(req, pkt->blen);
Jeej 25:aac250164497 250 //buf.status = status;
Jeej 25:aac250164497 251 buf.status = FS_STAT_OK;
Jeej 25:aac250164497 252
Jeej 25:aac250164497 253 // From here we assume that the request is valid
Jeej 25:aac250164497 254 // TODO: for now we consider that COM-FS request are targetting
Jeej 25:aac250164497 255 // FIDs that are "local" to the Host, but we can extend this
Jeej 25:aac250164497 256 // to "distant" files as well.(i.e. access SPI-Flash of an Host)
Jeej 25:aac250164497 257 if (status != FS_STAT_OK)
Jeej 25:aac250164497 258 {
Jeej 25:aac250164497 259 buf.length = 0;
Jeej 25:aac250164497 260 // Here we respond to request errors and OP_STAT
Jeej 25:aac250164497 261 d7a_fs_msg((uint8_t*)&buf,OP_SIZE_RETSTAT, KAL_COM_FLOW_FS_RESP);
Jeej 25:aac250164497 262 }
Jeej 25:aac250164497 263 else if (req->cmd == FS_OP_RD)
Jeej 25:aac250164497 264 {
Jeej 25:aac250164497 265 d7a_fs_com_resp_t* b = (d7a_fs_com_resp_t*)MALLOC(OP_SIZE_RETDATA + req->length);
Jeej 25:aac250164497 266 uint32_t len = g_fs_ctx.read_file(req->fid, req->offset+sizeof(d7a_fs_header_t), req->length, &b->data[0]);
Jeej 25:aac250164497 267 b->length = len;
Jeej 25:aac250164497 268 b->cmd = FS_OP_RETDATA;
Jeej 25:aac250164497 269 b->status = FS_STAT_OK; // TODO
Jeej 25:aac250164497 270 d7a_fs_msg((uint8_t*)b, OP_SIZE_RETDATA + req->length, KAL_COM_FLOW_FS_RESP);
Jeej 25:aac250164497 271 FREE(b);
Jeej 25:aac250164497 272 }
Jeej 25:aac250164497 273 else if (req->cmd == FS_OP_WR)
Jeej 25:aac250164497 274 {
Jeej 25:aac250164497 275 buf.length = g_fs_ctx.write_file(req->fid, req->offset+sizeof(d7a_fs_header_t), req->length, &pkt->buffer[OP_SIZE_WR]);
Jeej 25:aac250164497 276 d7a_fs_msg((uint8_t*)&buf, OP_SIZE_RETSTAT, KAL_COM_FLOW_FS_RESP);
Jeej 25:aac250164497 277 }
Jeej 25:aac250164497 278 else if (req->cmd == FS_OP_STAT)
Jeej 25:aac250164497 279 {
Jeej 25:aac250164497 280 // If file doesn't exist, FS_OP_STAT response is already handled
Jeej 25:aac250164497 281 // by the common d7a_fs_check_req error response.
Jeej 25:aac250164497 282 d7a_fs_com_resp_t* b = (d7a_fs_com_resp_t*)MALLOC(OP_SIZE_RETSTAT + sizeof(d7a_fs_properties_t));
Jeej 25:aac250164497 283 d7a_fs_get_properties(req->fid, KAL_FS_PROP_ALL, (d7a_fs_properties_t*) &b->data[0]);
Jeej 25:aac250164497 284 d7a_fs_properties_t* props = (d7a_fs_properties_t*)&b->data[0];
Jeej 25:aac250164497 285 b->length = props->length;
Jeej 25:aac250164497 286 b->cmd = FS_OP_RETSTAT;
Jeej 25:aac250164497 287 b->status = FS_STAT_OK;
Jeej 26:9f0b9833cac6 288 d7a_fs_msg((uint8_t*)b, OP_SIZE_RETSTAT + sizeof(d7a_fs_properties_t), KAL_COM_FLOW_FS_RESP);
Jeej 25:aac250164497 289 FREE(b);
Jeej 25:aac250164497 290 }
Jeej 25:aac250164497 291 else if (req->cmd == FS_OP_FLUSH)
Jeej 25:aac250164497 292 {
Jeej 25:aac250164497 293 //d7a_fs_flush(req->fid);
Jeej 25:aac250164497 294 //d7a_fs_msg((uint8_t*)&buf, OP_SIZE_RETSTAT, KAL_COM_FLOW_FS_RESP);
Jeej 25:aac250164497 295 }
Jeej 25:aac250164497 296 else if (req->cmd == FS_OP_CREATE)
Jeej 25:aac250164497 297 {
Jeej 25:aac250164497 298 //d7a_fs_create(req->fid,(d7a_fs_properties_t*)&pkt->buffer[OP_SIZE_CREATE]);
Jeej 25:aac250164497 299 //d7a_fs_msg((uint8_t*)&buf, OP_SIZE_RETSTAT, KAL_COM_FLOW_FS_RESP);
Jeej 25:aac250164497 300 }
Jeej 26:9f0b9833cac6 301 else
Jeej 26:9f0b9833cac6 302 {
Jeej 26:9f0b9833cac6 303 ASSERT(false, "FS: Unknown cmd %d\r\n", req->cmd);
Jeej 26:9f0b9833cac6 304 }
Jeej 25:aac250164497 305 break;
Jeej 25:aac250164497 306 // ---------------------------------------------------------------------------
Jeej 25:aac250164497 307 // Response to our commands
Jeej 25:aac250164497 308 // ---------------------------------------------------------------------------
Jeej 25:aac250164497 309 case KAL_COM_FLOW_FS_RESP:
Jeej 25:aac250164497 310 d7a_fs_com_resp_t* resp = (d7a_fs_com_resp_t*)pkt->buffer;
Jeej 26:9f0b9833cac6 311 DPRINT("Rfs resp - cmd:%d status:%d bytes:%d\n", resp->cmd, resp->status, resp->length);
Jeej 26:9f0b9833cac6 312 ASSERT(g_fs_ctx.com.req.cmd != FS_OP_NULL, "FS: Unexpected FS_RESP\n");
Jeej 25:aac250164497 313 if (g_fs_ctx.com.req.cmd != FS_OP_STAT &&
Jeej 25:aac250164497 314 g_fs_ctx.com.req.cmd != FS_OP_DSTAT )
Jeej 25:aac250164497 315 {
Jeej 25:aac250164497 316 // No pity for errors here, handled-ones should be avoided at
Jeej 25:aac250164497 317 // upper level, the others diserve to assert anyway.
Jeej 26:9f0b9833cac6 318 ASSERT(resp->status == FS_STAT_OK, "FS: Peer error:%d\n", resp->status);
Jeej 25:aac250164497 319
Jeej 25:aac250164497 320 // Fill read buffer
Jeej 25:aac250164497 321 if (resp->cmd == FS_OP_RETDATA)
Jeej 25:aac250164497 322 {
Jeej 25:aac250164497 323 memcpy(g_fs_ctx.com.data, &resp->data[0], resp->length);
Jeej 25:aac250164497 324 }
Jeej 25:aac250164497 325 else if (resp->cmd == FS_OP_RETSTAT)
Jeej 25:aac250164497 326 {
Jeej 25:aac250164497 327 if (g_fs_ctx.com.req.cmd == FS_OP_WR)
Jeej 25:aac250164497 328 {
Jeej 25:aac250164497 329 // We did a successful WR, update size if needed
Jeej 25:aac250164497 330 // TODO:This is not really enforcing header coherency. It will do the
Jeej 25:aac250164497 331 // job for Hosted NVM storage, provided the Host doesn't use the file for
Jeej 25:aac250164497 332 // writing.
Jeej 25:aac250164497 333 d7a_fs_header_t hdr;
Jeej 25:aac250164497 334 d7a_fs_hdr(g_fs_ctx.com.req.fid, &hdr);
Jeej 25:aac250164497 335 if (resp->length != hdr.bf.length)
Jeej 25:aac250164497 336 {
Jeej 25:aac250164497 337 //d7a_fs_set_properties(g_fs_ctx.com.req.fid, KAL_FS_PROP_SIZE, resp->length);
Jeej 25:aac250164497 338 }
Jeej 25:aac250164497 339 }
Jeej 25:aac250164497 340 }
Jeej 25:aac250164497 341 }
Jeej 25:aac250164497 342 else // FS_OP_STAT/DSTAT
Jeej 25:aac250164497 343 {
Jeej 25:aac250164497 344 if (g_fs_ctx.com.req.cmd == FS_OP_STAT)
Jeej 25:aac250164497 345 {
Jeej 25:aac250164497 346 d7a_fs_header_t hdr;
Jeej 25:aac250164497 347 d7a_fs_hdr(g_fs_ctx.com.req.fid, &hdr);
Jeej 25:aac250164497 348 // Try to keep HOST-files coherency as much as we can:
Jeej 25:aac250164497 349 // STAT returns the full header so we can update all fields.
Jeej 25:aac250164497 350 if (hdr.byte.type == HOST)
Jeej 25:aac250164497 351 {
Jeej 25:aac250164497 352 d7a_fs_properties_t* props = (d7a_fs_properties_t*)&resp->data[0];
Jeej 25:aac250164497 353 // XXX d7a_fs_set_properties_p is for now keeping our file remote,
Jeej 25:aac250164497 354 // as it doesn't change addr,type,mirror etc.
Jeej 25:aac250164497 355 //d7a_fs_set_properties(hdr, (uint32_t)props);
Jeej 25:aac250164497 356 }
Jeej 25:aac250164497 357 }
Jeej 25:aac250164497 358 // TODO: for now only keep length info for upper layer. (normal for a STAT)
Jeej 26:9f0b9833cac6 359 if (g_fs_ctx.com.data != NULL)
Jeej 26:9f0b9833cac6 360 {
Jeej 26:9f0b9833cac6 361 *(uint32_t*)g_fs_ctx.com.data = resp->length;
Jeej 26:9f0b9833cac6 362 }
Jeej 25:aac250164497 363 status = resp->status;
Jeej 25:aac250164497 364 }
Jeej 25:aac250164497 365 // Free to serve a new request
Jeej 25:aac250164497 366 g_fs_ctx.com.req.cmd = FS_OP_NULL;
Jeej 25:aac250164497 367 // Inform requester
Jeej 26:9f0b9833cac6 368 g_fs_ctx.fs_done.put((void*)status);
Jeej 25:aac250164497 369 break;
Jeej 25:aac250164497 370 default:
Jeej 25:aac250164497 371 EPRINT("FS Unknown Flow ID 0x%02X\r\n", pkt->id);
Jeej 25:aac250164497 372 break;
Jeej 25:aac250164497 373 }
Jeej 25:aac250164497 374 FREE(pkt);
Jeej 25:aac250164497 375 }
Jeej 25:aac250164497 376 }