6 #include "state_data.h"
9 csp_state_data_saver::csp_state_data_saver(FILEIO *_fio)
14 csp_state_data_saver::~csp_state_data_saver()
18 size_t csp_state_data_saver::save_string_data(const _TCHAR *p, uint32_t *sumseed, int maxlen, bool *__stat)
21 if(__stat != NULL) *__stat = false;
22 if(p == NULL) return -1;
26 locallen = strnlen(p, maxlen);
28 if(locallen < 0) return locallen;
29 locallen += 1; // Include "\0";
31 *sumseed = calc_crc32(*sumseed, (uint8_t *)p, locallen * sizeof(char));
34 for(cp = 0; cp < locallen; cp++) {
35 int _t = (int)(p[cp]);
36 int res = fio->Fputc(_t);
37 if((_t == '\0') || (_t == 0x00)){
39 if(__stat != NULL) *__stat = true;
41 } else if(_t == EOF) {
42 return (size_t)EOF; // ERROR
48 size_t csp_state_data_saver::load_string_data(_TCHAR *p, uint32_t *sumseed, int maxlen, bool *__stat)
52 if(__stat != NULL) *__stat = false;
53 if(p == NULL) return -1;
54 if(maxlen <= 0) return -1;
55 memset(p, 0x00, sizeof(_TCHAR) * maxlen);
56 for(cp = 0; cp < maxlen; cp++) {
57 int _t = fio->Fgetc();
58 if((_t == '\0') || (_t == 0x00)){
61 if(__stat != NULL) *__stat = true;
63 } else if(_t == EOF) {
66 if(__stat != NULL) *__stat = false;
68 } else if((cp + 1) >= maxlen) {
70 if(__stat != NULL) *__stat = true;
82 *sumseed = calc_crc32(*sumseed, (uint8_t *)p, _nlen * sizeof(_TCHAR));
86 // ALL OF BYNARY VALUES SHOULD BE SAVED BY BIG ENDIAN
87 int csp_state_data_saver::save_and_change_byteorder_be(uint32_t *sum, void *val, int bytes, int rep)
89 //int swapoffset = bytes;
92 uint8_t *srcp = (uint8_t *)val;
94 if((bytes <= 0) || (rep < 1)) return 0;
95 if(val == NULL) return 0;
96 buf = (uint8_t *)malloc(bytes); // swap buffer
97 if(buf == NULL) return 0;
98 for(members = 0; members < rep; members++) {
99 #if defined(__LITTLE_ENDIAN__)
101 for(int j = (bytes - 1); j >= 0; j--) {
106 memcpy(buf, srcp, bytes);
108 if(fio->Fwrite(buf, bytes, 1) != 1) {
112 *sum = calc_crc32(*sum, buf, bytes);
119 int csp_state_data_saver::load_and_change_byteorder_be(uint32_t *sum, void *val, int bytes, int rep)
121 //int swapoffset = bytes;
124 uint8_t *srcp = (uint8_t *)val;
126 if((bytes <= 0) || (rep < 1)) return 0;
127 if(val == NULL) return 0;
128 buf = (uint8_t *)malloc(bytes); // swap buffer
129 if(buf == NULL) return 0;
130 for(members = 0; members < rep; members++) {
131 if(fio->Fread(buf, bytes, 1) != 1) {
135 *sum = calc_crc32(*sum, buf, bytes);
136 #if defined(__LITTLE_ENDIAN__)
138 for(int j = (bytes - 1); j >= 0; j--) {
143 memcpy(srcp, buf, bytes);
151 void csp_state_data_saver::put_byte(uint8_t val, uint32_t *sumseed, bool *__stat)
155 if(fio->IsOpened()) {
157 if(sumseed != NULL) {
158 *sumseed = calc_crc32(*sumseed, &val, 1);
160 if(__stat != NULL) *__stat = true;
164 if(__stat != NULL) *__stat = false;
168 uint8_t csp_state_data_saver::get_byte(uint32_t *sumseed, bool *__stat)
171 if(fio->IsOpened()) {
172 uint8_t val = fio->FgetUint8();
173 if(sumseed != NULL) {
174 *sumseed = calc_crc32(*sumseed, &val, 1);
176 if(__stat != NULL) *__stat = true;
180 if(__stat != NULL) *__stat = false;
184 void csp_state_data_saver::put_bool(bool val, uint32_t *sumseed, bool *__stat)
187 tv = (val == false) ? 0x00 : 0x01;
189 if(fio->IsOpened()) {
191 if(sumseed != NULL) {
192 *sumseed = calc_crc32(*sumseed, &tv, 1);
194 if(__stat != NULL) *__stat = true;
198 if(__stat != NULL) *__stat = false;
202 bool csp_state_data_saver::get_bool(uint32_t *sumseed, bool *__stat)
205 if(fio->IsOpened()) {
206 uint8_t val = fio->FgetUint8();
207 if(val != 0x00) val = 0x01;
208 if(sumseed != NULL) {
209 *sumseed = calc_crc32(*sumseed, &val, 1);
211 if(__stat != NULL) *__stat = true;
212 return (val == 0x00) ? false : true;
215 if(__stat != NULL) *__stat = false;
219 void csp_state_data_saver::put_word(uint16_t val, uint32_t *sumseed, bool *__stat)
222 if(fio->IsOpened()) {
223 fio->FputUint16_BE(val);
224 if(sumseed != NULL) {
228 tval.write_2bytes_be_to(buf);
229 *sumseed = calc_crc32(*sumseed, buf, 2);
231 if(__stat != NULL) *__stat = true;
235 if(__stat != NULL) *__stat = false;
239 uint16_t csp_state_data_saver::get_word(uint32_t *sumseed, bool *__stat)
242 if(fio->IsOpened()) {
243 uint16_t val = fio->FgetUint16_BE();
244 if(__stat != NULL) *__stat = true;
245 if(sumseed != NULL) {
249 tval.write_2bytes_be_to(buf);
250 *sumseed = calc_crc32(*sumseed, buf, 2);
255 if(__stat != NULL) *__stat = false;
259 void csp_state_data_saver::put_dword(uint32_t val, uint32_t *sumseed, bool *__stat)
263 if(fio->IsOpened()) {
264 fio->FputUint32_BE(val);
265 if(__stat != NULL) *__stat = true;
266 if(sumseed != NULL) {
270 tval.write_4bytes_be_to(buf);
271 *sumseed = calc_crc32(*sumseed, buf, 4);
276 if(__stat != NULL) *__stat = false;
280 uint32_t csp_state_data_saver::get_dword(uint32_t *sumseed, bool *__stat)
283 if(fio->IsOpened()) {
284 uint32_t val = fio->FgetUint32_BE();
285 if(__stat != NULL) *__stat = true;
286 if(sumseed != NULL) {
290 tval.write_4bytes_be_to(buf);
291 *sumseed = calc_crc32(*sumseed, buf, 4);
296 if(__stat != NULL) *__stat = false;
300 void csp_state_data_saver::put_qword(uint64_t val, uint32_t *sumseed, bool *__stat)
304 if(fio->IsOpened()) {
305 fio->FputUint64_BE(val);
306 if(__stat != NULL) *__stat = true;
307 if(sumseed != NULL) {
311 tval.write_8bytes_be_to(buf);
312 *sumseed = calc_crc32(*sumseed, buf, 8);
317 if(__stat != NULL) *__stat = false;
321 uint64_t csp_state_data_saver::get_qword(uint32_t *sumseed, bool *__stat)
324 if(fio->IsOpened()) {
325 uint64_t val = fio->FgetUint64_BE();
326 if(__stat != NULL) *__stat = true;
327 if(sumseed != NULL) {
331 tval.write_8bytes_be_to(buf);
332 *sumseed = calc_crc32(*sumseed, buf, 8);
337 if(__stat != NULL) *__stat = false;
341 void csp_state_data_saver::put_int8(int8_t val, uint32_t *sumseed, bool *__stat)
345 if(fio->IsOpened()) {
347 if(__stat != NULL) *__stat = true;
348 if(sumseed != NULL) {
349 *sumseed = calc_crc32(*sumseed, &val, 1);
354 if(__stat != NULL) *__stat = false;
358 int8_t csp_state_data_saver::get_int8(uint32_t *sumseed, bool *__stat)
361 if(fio->IsOpened()) {
362 int8_t val = fio->FgetInt8();
363 if(__stat != NULL) *__stat = true;
364 if(sumseed != NULL) {
365 *sumseed = calc_crc32(*sumseed, &val, 1);
370 if(__stat != NULL) *__stat = false;
374 void csp_state_data_saver::put_int16(int16_t val, uint32_t *sumseed, bool *__stat)
378 if(fio->IsOpened()) {
379 fio->FputInt16_BE(val);
380 if(__stat != NULL) *__stat = true;
381 if(sumseed != NULL) {
385 tval.write_2bytes_be_to(buf);
386 *sumseed = calc_crc32(*sumseed, buf, 2);
391 if(__stat != NULL) *__stat = false;
395 int16_t csp_state_data_saver::get_int16(uint32_t *sumseed, bool *__stat)
398 if(fio->IsOpened()) {
399 int16_t val = fio->FgetInt16_BE();
400 if(__stat != NULL) *__stat = true;
401 if(sumseed != NULL) {
405 tval.write_2bytes_be_to(buf);
406 *sumseed = calc_crc32(*sumseed, buf, 2);
411 if(__stat != NULL) *__stat = false;
415 void csp_state_data_saver::put_int32(int32_t val, uint32_t *sumseed, bool *__stat)
419 if(fio->IsOpened()) {
420 fio->FputInt32_BE(val);
421 if(__stat != NULL) *__stat = true;
422 if(sumseed != NULL) {
426 tval.write_4bytes_be_to(buf);
427 *sumseed = calc_crc32(*sumseed, buf, 4);
432 if(__stat != NULL) *__stat = false;
436 int32_t csp_state_data_saver::get_int32(uint32_t *sumseed, bool *__stat)
439 if(fio->IsOpened()) {
440 int32_t val = fio->FgetInt32_BE();
441 if(__stat != NULL) *__stat = true;
442 if(sumseed != NULL) {
446 tval.write_4bytes_be_to(buf);
447 *sumseed = calc_crc32(*sumseed, buf, 4);
452 if(__stat != NULL) *__stat = false;
456 void csp_state_data_saver::put_int64(int64_t val, uint32_t *sumseed, bool *__stat)
460 if(fio->IsOpened()) {
461 fio->FputInt64_BE(val);
462 if(__stat != NULL) *__stat = true;
463 if(sumseed != NULL) {
467 tval.write_8bytes_be_to(buf);
468 *sumseed = calc_crc32(*sumseed, buf, 8);
473 if(__stat != NULL) *__stat = false;
477 int64_t csp_state_data_saver::get_int64(uint32_t *sumseed, bool *__stat)
480 if(fio->IsOpened()) {
481 int64_t val = fio->FgetInt64_BE();
482 if(__stat != NULL) *__stat = true;
483 if(sumseed != NULL) {
487 tval.write_8bytes_be_to(buf);
488 *sumseed = calc_crc32(*sumseed, buf, 8);
493 if(__stat != NULL) *__stat = false;
498 * For floating values, internal format is differnt by ARCHTECTURE, OS, COMPILER etc.
499 * So, saving / loading those values by ascii, not binary.
500 * -- 20180520 K.Ohta.
504 float csp_state_data_saver::get_float(uint32_t *sumseed, bool *__stat)
508 char tmps[1024]; // OK?
510 size_t _nlen = sizeof(tmps) / sizeof(char);
513 memset(tmps, 0x00, sizeof(tmps));
514 donelen = load_string_data(tmps, sumseed, _nlen - 1);
515 if((donelen <= 0) || (donelen >= _nlen)) { //
516 if(__stat != NULL) *__stat = false;
519 _s = std::string(tmps);
521 _v = std::stof(_s, &_sp);
522 } catch(const std::invalid_argument& e) {
523 if(__stat != NULL) *__stat = false;
525 } catch(const std::out_of_range& e) {
526 if(__stat != NULL) *__stat = false;
529 if(__stat != NULL) *__stat = true;
530 if(sumseed != NULL) {
531 *sumseed = calc_crc32(*sumseed, tmps, donelen);
535 if(__stat != NULL) *__stat = true;
539 void csp_state_data_saver::put_float(float val, uint32_t *sumseed, bool *__stat)
542 char tmps[1024]; // OK?
544 int _nlen = sizeof(tmps) / sizeof(char);
547 memset(tmps, 0x00, sizeof(tmps));
548 _s = std::to_string(_v);
549 _s.copy(tmps, _nlen - 1);
550 size_t rlen = strnlen(tmps, _nlen);
551 if((rlen <= 0) || (rlen >= _nlen)) { //
552 if(__stat != NULL) *__stat = false;
555 donelen = save_string_data(tmps, sumseed, rlen);
556 if((donelen <= 0) || (donelen != (rlen + 1))) {
557 if(__stat != NULL) *__stat = false;
560 if(sumseed != NULL) {
561 *sumseed = calc_crc32(*sumseed, tmps, donelen);
563 if(__stat != NULL) *__stat = true;
566 if(__stat != NULL) *__stat = false;
570 double csp_state_data_saver::get_double(uint32_t *sumseed, bool *__stat)
573 char tmps[1024]; // OK?
575 size_t _nlen = sizeof(tmps) / sizeof(char);
579 memset(tmps, 0x00, sizeof(tmps));
580 donelen = load_string_data(tmps, sumseed, _nlen - 1);
581 if((donelen <= 0) || (donelen >= _nlen)) { //
582 if(__stat != NULL) *__stat = false;
585 _s = std::string(tmps);
587 _v = std::stod(_s, &_sp);
588 } catch(const std::invalid_argument& e) {
589 if(__stat != NULL) *__stat = false;
591 } catch(const std::out_of_range& e) {
592 if(__stat != NULL) *__stat = false;
595 if(__stat != NULL) *__stat = true;
596 if(sumseed != NULL) {
597 *sumseed = calc_crc32(*sumseed, tmps, donelen);
601 if(__stat != NULL) *__stat = true;
605 void csp_state_data_saver::put_double(double val, uint32_t *sumseed, bool *__stat)
608 char tmps[1024]; // OK?
610 int _nlen = sizeof(tmps) / sizeof(char);
613 memset(tmps, 0x00, sizeof(tmps));
614 _s = std::to_string(_v);
615 _s.copy(tmps, _nlen - 1);
616 size_t rlen = strnlen(tmps, _nlen);
617 if((rlen <= 0) || (rlen >= _nlen)) { //
618 if(__stat != NULL) *__stat = false;
621 donelen = save_string_data(tmps, sumseed, rlen);
622 if((donelen <= 0) || (donelen != (rlen + 1))) {
623 if(__stat != NULL) *__stat = false;
626 if(sumseed != NULL) {
627 *sumseed = calc_crc32(*sumseed, tmps, donelen);
629 if(__stat != NULL) *__stat = true;
632 if(__stat != NULL) *__stat = false;
636 long double csp_state_data_saver::get_long_double(uint32_t *sumseed, bool *__stat)
640 char tmps[1024]; // OK?
642 size_t _nlen = sizeof(tmps) / sizeof(char);
645 memset(tmps, 0x00, sizeof(tmps));
646 donelen = load_string_data(tmps, sumseed, _nlen - 1);
647 if((donelen <= 0) || (donelen >= _nlen)) { //
648 if(__stat != NULL) *__stat = false;
651 _s = std::string(tmps);
653 _v = std::stold(_s, &_sp);
654 } catch(const std::invalid_argument& e) {
655 if(__stat != NULL) *__stat = false;
657 } catch(const std::out_of_range& e) {
658 if(__stat != NULL) *__stat = false;
661 if(__stat != NULL) *__stat = true;
662 if(sumseed != NULL) {
663 *sumseed = calc_crc32(*sumseed, tmps, donelen);
667 if(__stat != NULL) *__stat = true;
671 void csp_state_data_saver::put_long_double(long double val, uint32_t *sumseed, bool *__stat)
674 char tmps[1024]; // OK?
675 long double _v = val;
676 int _nlen = sizeof(tmps) / sizeof(char);
679 memset(tmps, 0x00, sizeof(tmps));
680 _s = std::to_string(_v);
681 _s.copy(tmps, _nlen - 1);
682 size_t rlen = strnlen(tmps, _nlen);
683 if((rlen <= 0) || (rlen >= _nlen)) { //
684 if(__stat != NULL) *__stat = false;
687 donelen = save_string_data(tmps, sumseed, rlen);
688 if((donelen <= 0) || (donelen != (rlen + 1))) {
689 if(__stat != NULL) *__stat = false;
692 if(sumseed != NULL) {
693 *sumseed = calc_crc32(*sumseed, tmps, donelen);
695 if(__stat != NULL) *__stat = true;
698 if(__stat != NULL) *__stat = false;
702 size_t csp_state_data_saver::get_byte_array(uint8_t *p, size_t len, size_t repeat, uint32_t *sumseed, bool *__stat)
706 if((len <= 0) || (repeat <= 0) || (p == NULL)) {
709 if(fio == NULL) _nstat = false;
711 donelen = fio->Fread(p, len, repeat);
712 if(donelen != repeat) {
716 int calcsize = len * donelen;
717 if((calcsize > 0) && (sumseed != NULL)) {
718 *sumseed = calc_crc32(*sumseed, p, calcsize);
723 if(__stat != NULL) *__stat = _nstat;
725 return len * donelen; // RETURN BYTES;
731 size_t csp_state_data_saver::put_byte_array(uint8_t *p, size_t len, size_t repeat, uint32_t *sumseed, bool *__stat)
735 if((len <= 0) || (repeat <= 0) || (p == NULL)) {
738 if(fio == NULL) _nstat = false;
740 donelen = fio->Fwrite(p, len, repeat);
741 if(donelen != repeat) {
745 int calcsize = len * donelen;
746 if((calcsize > 0) && (sumseed != NULL)) {
747 *sumseed = calc_crc32(*sumseed, p, calcsize);
752 if(__stat != NULL) *__stat = _nstat;
754 return len * donelen; // RETURN BYTES;
761 void csp_state_data_saver::put_pair32(pair_t val, uint32_t *sumseed, bool *__stat)
765 if(fio->IsOpened()) {
767 val.write_4bytes_be_to(buf);
768 size_t memb = fio->Fwrite(buf, 1, 4);
770 if(__stat != NULL) *__stat = false;
773 if(__stat != NULL) *__stat = true;
774 if(sumseed != NULL) {
775 *sumseed = calc_crc32(*sumseed, buf, 4);
780 if(__stat != NULL) *__stat = false;
784 pair_t csp_state_data_saver::get_pair32(uint32_t *sumseed, bool *__stat)
789 if(fio->IsOpened()) {
791 size_t memb = fio->Fread(buf, 1, 4);
793 if(__stat != NULL) *__stat = false;
796 val.read_4bytes_be_from(buf);
797 if(__stat != NULL) *__stat = true;
798 if(sumseed != NULL) {
799 *sumseed = calc_crc32(*sumseed, buf, 4);
804 if(__stat != NULL) *__stat = false;
808 pair64_sav_t csp_state_data_saver::get_pair64(uint32_t *sumseed, bool *__stat)
813 if(fio->IsOpened()) {
815 size_t memb = fio->Fread(buf, 1, 8);
817 if(__stat != NULL) *__stat = false;
820 val.read_8bytes_be_from(buf);
821 if(__stat != NULL) *__stat = true;
822 if(sumseed != NULL) {
823 *sumseed = calc_crc32(*sumseed, buf, 8);
828 if(__stat != NULL) *__stat = false;
832 void csp_state_data_saver::put_pair64(pair64_sav_t val, uint32_t *sumseed, bool *__stat)
835 if(fio->IsOpened()) {
837 val.write_8bytes_be_to(buf);
838 size_t memb = fio->Fwrite(buf, 1, 8);
840 if(__stat != NULL) *__stat = false;
843 if(__stat != NULL) *__stat = true;
844 if(sumseed != NULL) {
845 *sumseed = calc_crc32(*sumseed, buf, 8);
850 if(__stat != NULL) *__stat = false;
854 csp_state_utils::csp_state_utils(int _version, int device_id, const _TCHAR *classname, CSP_Logger* p_logger)
860 this_device_id = device_id;
861 this_device_id_bak = this_device_id;
864 memset(__classname, 0x00, sizeof(__classname));
865 memset(__classname_bak, 0x00, sizeof(__classname_bak));
866 memset(magic, 0x00, sizeof(magic));
867 memset(magic_bak, 0x00, sizeof(magic_bak));
869 strncpy(magic, _T("CSP_SAVE"), 16 - 1);
870 strncpy(magic_bak, magic, 16 - 1);
872 if(classname != NULL) {
873 strncpy(__classname, classname, sizeof(__classname) - 1);
875 strncpy(__classname, "Unknown Class", sizeof(__classname) - 1);
877 strncpy(__classname_bak, __classname, sizeof(__classname_bak) - 1);
879 class_version = _version;
880 class_version_bak = _version;
882 internal_version = 1;
883 internal_version_bak = internal_version;
884 out_debug_log("NEW SAVE STATE: NAME=%s DEVID=%d VER=%d", classname, device_id, _version);
886 add_entry_tchar(_T("HEADER"), magic_bak, strlen(magic_bak) + 1);
887 add_entry_tchar(_T("CLASSNAME"), __classname_bak, strlen(__classname_bak) + 1);
888 add_entry(_T("DEVICE_ID"), &this_device_id_bak);
889 add_entry(_T("STAVE_VER"), &class_version_bak);
890 add_entry(_T("INTERNAL_VER"), &internal_version_bak);
895 csp_state_utils::~csp_state_utils()
901 * With MinGW and DLL linker, not able top find extern symbols.
905 #include "csp_logger.h"
907 void csp_state_utils::out_debug_log(const char *fmt, ...)
909 if(logger == NULL) return;
910 // Temporally disabled 20180618
911 //#if !defined(__MINGW32__) && !defined(__MINGW64__)
915 vsnprintf(strbuf, 8192, fmt, ap);
916 logger->debug_log(CSP_LOG_DEBUG, CSP_LOG_TYPE_VM_STATE, strbuf);
921 std::list<std::string> csp_state_utils::get_entries_list(void)
924 std::list<std::string> _rlist;
925 std::string _tname, _vname;
928 for(auto p = listptr.begin(); p != listptr.end(); ++p) {
931 _vname = _T("NAME:");
932 switch((*p).type_id) {
933 case csp_saver_entry_float:
934 _tname = _T("TYPE: float");
936 case csp_saver_entry_double:
937 _tname = _T("TYPE: double");
939 case csp_saver_entry_long_double:
940 _tname = _T("TYPE: long double");
942 case csp_saver_entry_pair:
943 _tname = _T("TYPE: pair_t");
945 case csp_saver_entry_int:
946 _tname = _T("TYPE: int");
948 case csp_saver_entry_uint8:
949 _tname = _T("TYPE: uint8_t");
951 case csp_saver_entry_int8:
952 _tname = _T("TYPE: int8_t");
954 case csp_saver_entry_uint16:
955 _tname = _T("TYPE: uint16_t");
957 case csp_saver_entry_int16:
958 _tname = _T("TYPE: int16_t");
960 case csp_saver_entry_uint32:
961 _tname = _T("TYPE: uint32_t");
963 case csp_saver_entry_int32:
964 _tname = _T("TYPE: int32_t");
966 case csp_saver_entry_uint64:
967 _tname = _T("TYPE: uint64_t");
969 case csp_saver_entry_int64:
970 _tname = _T("TYPE: int64_t");
972 case csp_saver_entry_bool:
973 _tname = _T("TYPE: bool");
975 case csp_saver_entry_tchar:
976 _tname = _T("TYPE: _TCHAR");
978 case csp_saver_entry_any:
979 _tname = _T("TYPE: ANY");
982 _tname = _T("TYPE: ANY(UNKNOWN)");
985 _vname = _vname + (*p).name;
986 _rlist.push_back(_vname);
987 _rlist.push_back(_tname);
992 uint32_t csp_state_utils::get_crc_value(void)
996 void csp_state_utils::get_class_name(_TCHAR *buf, int len)
998 strncpy(buf, __classname_bak, ((size_t)len >= sizeof(__classname_bak)) ? (sizeof(__classname_bak) - 1) : len);
1002 void csp_state_utils::add_entry_fifo(const _TCHAR *__name, FIFO **p, int _len, int __num)
1005 std::string _name = std::string(__name);
1006 if(__num >= 0) _name = _name + std::string("_#[") +std::to_string(__num) + std::string("]");
1008 _l.type_id = csp_saver_entry_any;
1012 _l.datalenptr = NULL;
1013 _l.local_num = __num;
1014 _l.assume_byte = false;
1015 _l.type_id = csp_saver_entry_fifo;
1016 out_debug_log("ADD ENTRY: NAME=%s TYPE=FIFO len=%d atomlen=%d", _name.c_str(), _len, _l.atomlen);
1017 listptr.push_back(_l);
1020 void csp_state_utils::add_entry_cur_time_t(const _TCHAR *__name, cur_time_t *p, int _len, int __num)
1023 std::string _name = std::string(__name);
1024 if(__num >= 0) _name = _name + std::string("_#[") +std::to_string(__num) + std::string("]");
1026 _l.type_id = csp_saver_entry_any;
1030 _l.datalenptr = NULL;
1031 _l.local_num = __num;
1032 _l.assume_byte = false;
1033 _l.type_id = csp_saver_entry_cur_time_t;
1034 out_debug_log("ADD ENTRY: NAME=%s TYPE=CUR_TIME_T len=%d atomlen=%d", _name.c_str(), _len, _l.atomlen);
1035 listptr.push_back(_l);
1038 void csp_state_utils::add_entry_tchar(const _TCHAR *__name, _TCHAR *p, int _len, int __num, bool is_const)
1041 std::string _name = std::string(__name);
1042 if(__num >= 0) _name = _name + std::string("_#[") +std::to_string(__num) + std::string("]");
1044 if(p == NULL) return;
1046 _l.type_id = csp_saver_entry_tchar;
1048 _l.atomlen = sizeof(_TCHAR);
1050 _l.local_num = __num;
1051 _l.assume_byte = true;
1053 if(is_const) _l.type_id = _l.type_id | csp_saver_entry_const;
1055 out_debug_log("ADD ENTRY: NAME=%s TYPE=_TCHAR* VAL=%s len=%d atomlen=%d HEAD=%08x", __name, p, _len, _l.atomlen, p);
1056 listptr.push_back(_l);
1059 bool csp_state_utils::save_state(FILEIO *__fio, uint32_t *pcrc)
1061 const uint8_t initdata[4] = {0xff, 0xff, 0xff, 0xff};
1062 const uint8_t taildata[4] = {0x00, 0x00, 0x00, 0x00};
1065 class_version_bak = class_version;
1066 this_device_id_bak = this_device_id;
1067 memset(__classname_bak, 0x00, sizeof(__classname_bak));
1068 strncpy(__classname_bak, __classname, sizeof(__classname) - 1);
1071 crc_value = 0xffffffff;
1076 crc_value = calc_crc32(crc_value, initdata, 4);
1078 out_debug_log("SAVE STATE: NAME=%s DEVID=%d VER=%d", __classname, this_device_id, class_version);
1080 fio = new csp_state_data_saver(__fio);
1082 bool need_mfree = false;
1083 for(auto p = listptr.begin(); p != listptr.end(); ++p) {
1085 void *_ppshadow = NULL;
1086 int _tid = (*p).type_id;
1087 int _asize = (*p).atomlen;
1088 int _len = (*p).len;
1091 if((_tid & csp_saver_entry_const) != 0) {
1092 _ppshadow = (*p).ptr;
1093 if((*p).assume_byte) {
1095 memcpy(pp, _ppshadow, _len);
1097 pp = malloc(_len * _asize);
1098 memcpy(pp, _ppshadow, _len * _asize);
1100 _tid = _tid & 0xffff;
1102 if(((*p).assume_byte)) {
1104 _len = _len / _asize;
1107 } else if((_tid & csp_saver_entry_vararray) != 0) {
1108 if((*p).datalenptr != NULL) {
1109 _len = *((*p).datalenptr);
1114 _tid = _tid & ((int)~csp_saver_entry_vararray);
1115 void **xp = (void **)((*p).ptr);
1122 fio->put_int32(_len, &crc_value, &_stat);
1123 out_debug_log("SAVE VARARRAY p=%08x len=%d atom=%d CRC=%08x",pp, _len, _asize, crc_value);
1124 if(((*p).assume_byte) && (_asize > 1)) {
1125 _len = _len / _asize;
1130 if((pp != NULL) && (_len > 0)) {
1132 case csp_saver_entry_float:
1135 float *px = (float *)pp;
1136 for(int i = 0; i < _len; i++) {
1137 fio->put_float(px[i], &crc_value, &_stat);
1146 case csp_saver_entry_double:
1149 double *px = (double *)pp;
1150 for(int i = 0; i < _len; i++) {
1151 fio->put_double(px[i], &crc_value, &_stat);
1160 case csp_saver_entry_long_double:
1163 long double *px = (long double *)pp;
1164 for(int i = 0; i < _len; i++) {
1165 fio->put_long_double(px[i], &crc_value, &_stat);
1174 case csp_saver_entry_pair:
1177 pair_t *px = (pair_t *)pp;
1178 for(int i = 0; i < _len; i++) {
1179 fio->put_pair32(px[i], &crc_value, &_stat);
1188 case csp_saver_entry_int:
1191 int *px = (int *)pp;
1192 for(int i = 0; i < _len; i++) {
1193 fio->put_int32(px[i], &crc_value, &_stat);
1202 case csp_saver_entry_uint8:
1205 uint8_t *px = (uint8_t *)pp;
1207 size_t _n = __fio->Fwrite(px, _len, 1);
1214 crc_value = calc_crc32(crc_value, px, _len);
1217 fio->put_byte(*px, &crc_value, &_stat);
1226 case csp_saver_entry_int8:
1229 int8_t *px = (int8_t *)pp;
1231 size_t _n = __fio->Fwrite(px, _len, 1);
1238 crc_value = calc_crc32(crc_value, (uint8_t *)px, _len);
1241 fio->put_int8(*px, &crc_value, &_stat);
1250 case csp_saver_entry_uint16:
1253 uint16_t *px = (uint16_t *)pp;
1254 for(int i = 0; i < _len; i++) {
1255 fio->put_word(px[i], &crc_value, &_stat);
1264 case csp_saver_entry_int16:
1267 int16_t *px = (int16_t *)pp;
1268 for(int i = 0; i < _len; i++) {
1269 fio->put_int16(px[i], &crc_value, &_stat);
1278 case csp_saver_entry_uint32:
1281 uint32_t *px = (uint32_t *)pp;
1282 for(int i = 0; i < _len; i++) {
1283 fio->put_dword(px[i], &crc_value, &_stat);
1292 case csp_saver_entry_int32:
1295 int32_t *px = (int32_t *)pp;
1296 for(int i = 0; i < _len; i++) {
1297 fio->put_int32(px[i], &crc_value, &_stat);
1306 case csp_saver_entry_uint64:
1309 uint64_t *px = (uint64_t *)pp;
1310 for(int i = 0; i < _len; i++) {
1311 fio->put_qword(px[i], &crc_value, &_stat);
1320 case csp_saver_entry_int64:
1323 int64_t *px = (int64_t *)pp;
1324 for(int i = 0; i < _len; i++) {
1325 fio->put_int64(px[i], &crc_value, &_stat);
1334 case csp_saver_entry_bool:
1337 bool *px = (bool *)pp;
1338 for(int i = 0; i < _len ; i++) {
1339 fio->put_bool(px[i], &crc_value, &_stat);
1348 case csp_saver_entry_tchar:
1350 retval = fio->save_string_data((const _TCHAR *)pp, &crc_value, _len, &_stat);
1351 if(!_stat) retval = -1;
1354 case csp_saver_entry_any:
1356 retval = fio->put_byte_array((uint8_t *)pp, _asize, _len, &crc_value, &_stat);
1357 if(!_stat) retval = -1;
1360 case csp_saver_entry_fifo:
1362 FIFO **fp = (FIFO **)pp;
1363 for(int i = 0; i < _len; i++) {
1364 fp[i]->save_state_helper(fio, &crc_value, &_stat);
1369 case csp_saver_entry_cur_time_t:
1371 cur_time_t *fp = (cur_time_t *)pp;
1372 for(int i = 0; i < _len; i++) {
1373 fp[i].save_state_helper(fio, &crc_value, &_stat);
1382 if((retval <= 0) || (!_stat)) {
1384 if(pp != NULL) free(pp);
1391 //out_debug_log("CRC=%08x", crc_value);
1393 if(pp != NULL) free(pp);
1401 crc_value = calc_crc32(crc_value, taildata, 4);
1402 __fio->FputUint32_BE(crc_value);
1403 out_debug_log("CRC: VAL=%08x", crc_value);
1404 if(pcrc != NULL) *pcrc = crc_value;
1408 bool csp_state_utils::load_state(FILEIO *__fio, uint32_t *pcrc)
1410 const uint8_t initdata[4] = {0xff, 0xff, 0xff, 0xff};
1411 const uint8_t taildata[4] = {0x00, 0x00, 0x00, 0x00};
1414 //class_version_bak = class_version;
1415 //this_device_id_bak = this_device_id;
1416 memset(__classname_bak, 0x00, sizeof(__classname_bak));
1417 //strncpy(__classname_bak, __classname, sizeof(__classname));
1419 crc_value = 0xffffffff;
1423 crc_value = calc_crc32(crc_value, initdata, 4);
1425 fio = new csp_state_data_saver(__fio);
1426 out_debug_log("LOAD STATE: NAME=%s DEVID=%d VER=%d", __classname, this_device_id, class_version);
1428 bool need_mfree = false;
1429 for(auto p = listptr.begin(); p != listptr.end(); ++p) {
1431 int _tid = (*p).type_id;
1432 int _asize = (*p).atomlen;
1433 int _len = (*p).len;
1434 std::string _name = (*p).name;
1437 if((_tid & csp_saver_entry_const) != 0) {
1438 //_ppshadow = (*p).ptr;
1439 if((*p).assume_byte) {
1441 //memcpy(pp, _ppshadow, _len);
1443 pp = malloc(_len * _asize);
1444 //memcpy(pp, _ppshadow, _len * asize);
1446 _tid = _tid & 0xffff;
1448 if(((*p).assume_byte)) {
1450 _len = _len / _asize;
1453 } else if((_tid & csp_saver_entry_vararray) != 0) {
1454 _len = fio->get_int32(&crc_value, &_stat);
1455 void **xp = (void **)((*p).ptr);
1461 if(((*p).assume_byte)) {
1464 *xp = malloc(_asize * _len);
1466 if(*xp == NULL) _len = 0;
1468 if((*p).datalenptr != NULL) {
1469 *((*p).datalenptr) = _len;
1472 _tid = _tid & ((int)~csp_saver_entry_vararray);
1473 if(((*p).assume_byte)) {
1475 _len = _len / _asize;
1478 out_debug_log("LOAD VARARRAY p=%08x len=%d atom=%d CRC=%08x",pp, _len, _asize, crc_value);
1482 if((pp != NULL) && (_len > 0)) {
1484 case csp_saver_entry_float:
1487 float *px = (float *)pp;
1488 for(int i = 0; i < _len; i++) {
1489 px[i] = fio->get_float(&crc_value, &_stat);
1497 out_debug_log("NAME=%s FLOAT: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), retval, (_stat) ? 1 : 0, pp);
1499 case csp_saver_entry_double:
1502 double *px = (double *)pp;
1503 for(int i = 0; i < _len; i++) {
1504 px[i] = fio->get_double(&crc_value, &_stat);
1512 out_debug_log("NAME=%s DOUBLE: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), retval, (_stat) ? 1 : 0, pp);
1514 case csp_saver_entry_long_double:
1517 long double *px = (long double *)pp;
1518 for(int i = 0; i < _len; i++) {
1519 px[i] = fio->get_long_double(&crc_value, &_stat);
1527 out_debug_log("NAME=%s LONG DOUBLE: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), retval, (_stat) ? 1 : 0, pp);
1529 case csp_saver_entry_pair:
1532 pair_t *px = (pair_t *)pp;
1533 for(int i = 0; i < _len; i++) {
1534 px[i] = fio->get_pair32(&crc_value, &_stat);
1542 out_debug_log("NAME=%s PAIR_T: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), retval, (_stat) ? 1 : 0,pp);
1544 case csp_saver_entry_int:
1547 int *px = (int *)pp;
1548 for(int i = 0; i < _len; i++) {
1549 px[i] = fio->get_int32(&crc_value, &_stat);
1557 out_debug_log("NAME=%s INT: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), retval, (_stat) ? 1 : 0, pp);
1559 case csp_saver_entry_uint8:
1562 uint8_t *px = (uint8_t *)pp;
1563 if((_len > 1) && (px != NULL)) {
1564 size_t _n = __fio->Fread(px, _len, 1);
1571 crc_value = calc_crc32(crc_value, px, _len);
1574 *px = fio->get_byte(&crc_value, &_stat);
1582 out_debug_log("NAME=%s UINT8: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), retval, (_stat) ? 1 : 0, pp);
1584 case csp_saver_entry_int8:
1587 int8_t *px = (int8_t *)pp;
1588 if((_len > 1) && (px != NULL)) {
1589 size_t _n = __fio->Fread(px, _len, 1);
1596 crc_value = calc_crc32(crc_value, px, _len);
1599 *px = fio->get_int8(&crc_value, &_stat);
1607 out_debug_log("NAME=%s INT8: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), retval, (_stat) ? 1 : 0, pp);
1609 case csp_saver_entry_uint16:
1612 uint16_t *px = (uint16_t *)pp;
1613 for(int i = 0; i < _len; i++) {
1614 px[i] = fio->get_word(&crc_value, &_stat);
1622 out_debug_log("NAMEE=%s UINT16: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), retval, (_stat) ? 1 : 0, pp);
1624 case csp_saver_entry_int16:
1627 int16_t *px = (int16_t *)pp;
1628 for(int i = 0; i < _len; i++) {
1629 px[i] = fio->get_int16(&crc_value, &_stat);
1637 out_debug_log("NAME=%s INT16: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), retval, (_stat) ? 1 : 0, pp);
1639 case csp_saver_entry_uint32:
1642 uint32_t *px = (uint32_t *)pp;
1643 for(int i = 0; i < _len; i++) {
1644 px[i] = fio->get_dword(&crc_value, &_stat);
1652 out_debug_log("NAME=%s UINT32: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), retval, (_stat) ? 1 : 0, pp);
1654 case csp_saver_entry_int32:
1657 int32_t *px = (int32_t *)pp;
1658 for(int i = 0; i < _len; i++) {
1659 px[i] = fio->get_int32(&crc_value, &_stat);
1667 out_debug_log("NAME=%s INT32: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), retval, (_stat) ? 1 : 0, pp);
1669 case csp_saver_entry_uint64:
1672 uint64_t *px = (uint64_t *)pp;
1673 for(int i = 0; i < _len; i++) {
1674 px[i] = fio->get_qword(&crc_value, &_stat);
1683 out_debug_log("NAME=%s UINT64: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), retval, (_stat) ? 1 : 0, pp);
1685 case csp_saver_entry_int64:
1688 int64_t *px = (int64_t *)pp;
1689 for(int i = 0; i < _len; i++) {
1690 px[i] = fio->get_int64(&crc_value, &_stat);
1698 out_debug_log("NAME=%s INT64: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), retval, (_stat) ? 1 : 0, pp);
1700 case csp_saver_entry_bool:
1703 bool *px = (bool *)pp;
1704 for(int i = 0; i < _len; i++) {
1705 px[i] = fio->get_bool(&crc_value, &_stat);
1713 out_debug_log("NAME=%s BOOL: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), retval, (_stat) ? 1 : 0, pp);
1715 case csp_saver_entry_tchar:
1717 retval = fio->load_string_data((const _TCHAR *)pp, &crc_value, _len, &_stat);
1718 out_debug_log("NAME=%s STR: LEN=%d STAT=%d S=%s", _name.c_str(), retval, (_stat) ? 1 : 0, (_TCHAR *)pp);
1719 if(!_stat) retval = -1;
1722 case csp_saver_entry_any:
1724 retval = fio->get_byte_array((uint8_t *)pp, _asize, _len, &crc_value, &_stat);
1725 if(!_stat) retval = -1;
1726 out_debug_log("NAME=%s BYTE-ARRAY: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), retval, (_stat) ? 1 : 0, pp);
1729 case csp_saver_entry_fifo:
1731 FIFO **fp = (FIFO **)pp;
1733 for(int i = 0; i < _len; i++) {
1734 _s = fp[i]->load_state_helper(fio, &crc_value, &_stat);
1741 if(_s) retval = _len;
1744 case csp_saver_entry_cur_time_t:
1746 cur_time_t *fp = (cur_time_t *)pp;
1748 for(int i = 0; i < _len; i++) {
1749 _s = fp[i].load_state_helper(fio, &crc_value, &_stat);
1756 if(_s) retval = _len;
1761 out_debug_log("NAME=%s UNKNOWN TID=%d: LEN=%d STAT=%d HEAD=%08x", _name.c_str(), _tid, retval, (_stat) ? 1 : 0, pp);
1764 if((retval <= 0) || (!_stat)) {
1766 if(pp != NULL) free(pp);
1772 out_debug_log("CRC=%08x", crc_value);
1774 if(memcmp(pp, (*p).ptr , _len * _asize) != 0) {
1786 crc_value = calc_crc32(crc_value, taildata, 4);
1787 if(pcrc != NULL) *pcrc = crc_value;
1789 uint32_t cmpval = __fio->FgetUint32_BE();
1790 if(cmpval != crc_value) {
1791 out_debug_log("CRC_ERROR: VAL=%08x / %08x", cmpval, crc_value);
1795 if(this_device_id != this_device_id_bak) {
1796 out_debug_log("WRONG device_id %d", this_device_id_bak);
1799 if(class_version != class_version_bak) {
1800 out_debug_log("WRONG crass_version %d", class_version_bak);
1803 if(strncmp(__classname, __classname_bak, sizeof(__classname)) != 0) {
1804 out_debug_log("WRONG CRASS NAME %s", __classname_bak);
1807 out_debug_log("OK CRC=%08x", crc_value);