Skip to content

Commit 6ac17a6

Browse files
committed
Implement epoch time data types
1 parent 53d27b4 commit 6ac17a6

File tree

8 files changed

+1166
-64
lines changed

8 files changed

+1166
-64
lines changed

Generator/ClusterGenerator.cs

Lines changed: 111 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,7 @@ private static void WriteStruct(clusterCommand command, bool toServer, TextWrite
263263
to = toVal;
264264
break;
265265
case "between":
266+
case "countBetween":
266267
case "lengthBetween":
267268
if (long.TryParse(field.constraint.to, out long parsedTo))
268269
to = parsedTo;
@@ -285,6 +286,7 @@ private static void WriteStruct(clusterCommand command, bool toServer, TextWrite
285286

286287
private static void WriteStructType(bool optional, bool nullable, string type, string? entryType, int id, long? from, long? to, string name, Cluster cluster, TextWriter writer)
287288
{
289+
bool unsigned = false;
288290
string totalIndent = " ";
289291
if (optional)
290292
{
@@ -378,11 +380,8 @@ private static void WriteStructType(bool optional, bool nullable, string type, s
378380
writer.Write($", {to.Value}");
379381
else if (from != null && from != 0)
380382
writer.Write(", byte.MaxValue");
381-
if (from != null && from != 0)
382-
writer.WriteLine($", {from.Value});");
383-
else
384-
writer.WriteLine(");");
385-
return;
383+
unsigned = true;
384+
break;
386385
case "uint16":
387386
case "map16":
388387
case "enum16":
@@ -396,15 +395,11 @@ private static void WriteStructType(bool optional, bool nullable, string type, s
396395
writer.Write($", {to.Value}");
397396
else if (from != null && from != 0)
398397
writer.Write(", ushort.MaxValue");
399-
if (from != null && from != 0)
400-
writer.WriteLine($", {from.Value});");
401-
else
402-
writer.WriteLine(");");
403-
return;
398+
unsigned = true;
399+
break;
404400
case "uint24":
405401
case "uint32":
406402
case "map32":
407-
case "epoch-s":
408403
case "cluster-id":
409404
case "attrib-id":
410405
case "field-id":
@@ -417,36 +412,77 @@ private static void WriteStructType(bool optional, bool nullable, string type, s
417412
writer.Write($", {to.Value}");
418413
else if (from != null && from != 0)
419414
writer.Write(", uint.MaxValue");
420-
if (from != null && from != 0)
421-
writer.WriteLine($", {from.Value});");
415+
unsigned = true;
416+
break;
417+
case "epoch-s":
418+
includes.Add("MatterDotNet.Util");
419+
if (nullable && !optional)
420+
writer.Write($"{totalIndent}if (!{name}.HasValue)\n{totalIndent} writer.WriteNull({id});\n{totalIndent}else\n ");
421+
writer.Write($"{totalIndent}writer.WriteUInt({id}, TimeUtil.ToEpochSeconds({name}");
422+
if (nullable && !optional)
423+
writer.Write("!.Value)");
422424
else
423-
writer.WriteLine(");");
424-
return;
425+
writer.Write(")");
426+
if (to != null)
427+
writer.Write($", {to.Value}");
428+
else if (from != null && from != 0)
429+
writer.Write(", uint.MaxValue");
430+
unsigned = true;
431+
break;
425432
case "elapsed-s":
426-
writer.Write($"{totalIndent}writer.WriteUInt({id}, {name}.TotalSeconds");
433+
if (nullable && !optional)
434+
writer.Write($"{totalIndent}if (!{name}.HasValue)\n{totalIndent} writer.WriteNull({id});\n{totalIndent}else\n ");
435+
writer.Write($"{totalIndent}writer.WriteUInt({id}, {name}");
436+
if (nullable && !optional)
437+
writer.Write("!.Value.TotalSeconds");
438+
else
439+
writer.Write(".TotalSeconds");
427440
if (to != null)
428441
writer.Write($", {to.Value}");
429442
else if (from != null && from != 0)
430443
writer.Write(", uint.MaxValue");
431-
if (from != null && from != 0)
432-
writer.WriteLine($", {from.Value});");
444+
unsigned = true;
445+
break;
446+
case "epoch-us":
447+
includes.Add("MatterDotNet.Util");
448+
if (nullable && !optional)
449+
writer.Write($"{totalIndent}if (!{name}.HasValue)\n{totalIndent} writer.WriteNull({id});\n{totalIndent}else\n ");
450+
writer.Write($"{totalIndent}writer.WriteULong({id}, TimeUtil.ToEpochUS({name}");
451+
if (nullable && !optional)
452+
writer.Write("!.Value)");
433453
else
434-
writer.WriteLine(");");
435-
return;
454+
writer.Write(")");
455+
if (to != null)
456+
writer.Write($", {to.Value}");
457+
else if (from != null && from != 0)
458+
writer.Write(", ulong.MaxValue");
459+
unsigned = true;
460+
break;
436461
case "ref_DataTypeSystemTimeUs":
437462
case "ref_DataTypeSystemTimeMs":
438-
writer.Write($"{totalIndent}writer.WriteULong({id}, {name}{(type == "ref_DataTypeSystemTimeMs" ? ".TotalMilliseconds" : ".TotalMicroseconds")}");
463+
if (nullable && !optional)
464+
writer.Write($"{totalIndent}if (!{name}.HasValue)\n{totalIndent} writer.WriteNull({id});\n{totalIndent}else\n ");
465+
writer.Write($"{totalIndent}writer.WriteULong({id}, {name}");
466+
if (nullable && !optional)
467+
writer.Write("!.Value");
468+
if (type == "ref_DataTypeSystemTimeMs")
469+
writer.Write(".TotalMilliseconds");
470+
else
471+
writer.Write(".TotalMicroseconds");
439472
if (to != null)
440473
writer.Write($", {to.Value}");
441474
else if (from != null && from != 0)
442475
writer.Write(", ulong.MaxValue");
443-
if (from != null && from != 0)
444-
writer.WriteLine($", {from.Value});");
445-
else
446-
writer.WriteLine(");");
447-
return;
476+
unsigned = true;
477+
break;
448478
case "ref_DataTypePosixMs":
449-
writer.Write($"{totalIndent}writer.WriteULong({id}, {name}.ToUnixTimeMilliseconds()");
479+
if (nullable && !optional)
480+
writer.Write($"{totalIndent}if (!{name}.HasValue)\n{totalIndent} writer.WriteNull({id});\n{totalIndent}else\n ");
481+
writer.Write($"{totalIndent}writer.WriteULong({id}, {name}");
482+
if (nullable && !optional)
483+
writer.Write("!.Value.ToUnixTimeMilliseconds()");
484+
else
485+
writer.Write(".ToUnixTimeMilliseconds()");
450486
if (to != null)
451487
writer.Write($", {to.Value}");
452488
else if (from != null && from != 0)
@@ -457,7 +493,6 @@ private static void WriteStructType(bool optional, bool nullable, string type, s
457493
case "uint56":
458494
case "uint64":
459495
case "map64":
460-
case "epoch-us":
461496
case "fabric-id":
462497
case "node-id":
463498
case "EUI64":
@@ -486,9 +521,13 @@ private static void WriteStructType(bool optional, bool nullable, string type, s
486521
case "ref_IpAdr":
487522
case "ref_Ipv4Adr":
488523
case "ref_Ipv6Adr":
524+
if (nullable && !optional)
525+
writer.Write($"{totalIndent}if ({name} == null)\n{totalIndent} writer.WriteNull({id});\n{totalIndent}else\n ");
489526
writer.WriteLine($"{totalIndent}writer.WriteBytes({id}, {name}.GetAddressBytes());");
490527
return;
491528
case "Hardware Address":
529+
if (nullable && !optional)
530+
writer.Write($"{totalIndent}if ({name} == null)\n{totalIndent} writer.WriteNull({id});\n{totalIndent}else\n ");
492531
writer.WriteLine($"{totalIndent}writer.WriteBytes({id}, {name}.GetAddressBytes());");
493532
return;
494533
case "devtype-id":
@@ -513,10 +552,14 @@ private static void WriteStructType(bool optional, bool nullable, string type, s
513552
if (HasEnum(cluster, type) || HasBitmap(cluster, type))
514553
writer.WriteLine($"{totalIndent}writer.WriteUShort({id}, {(optional || nullable ? "(ushort?)" : "(ushort)")}{name});");
515554
else
555+
{
556+
if (nullable && !optional)
557+
writer.Write($"{totalIndent}if ({name} == null)\n{totalIndent} writer.WriteNull({id});\n{totalIndent}else\n ");
516558
writer.WriteLine($"{totalIndent}{name}.Serialize(writer, {id});");
559+
}
517560
return;
518561
}
519-
if (from != null)
562+
if (from != null && (!unsigned || from != 0))
520563
writer.WriteLine($", {from.Value});");
521564
else
522565
writer.WriteLine(");");
@@ -532,7 +575,8 @@ private static void WriteFieldReader(bool optional, bool nullable, string type,
532575
else
533576
writer.Write($"{totalIndent}{name} = ");
534577
}
535-
bool extraClose = (id == "-1" || id == "i");
578+
bool extraOutsideClose = (id == "-1" || id == "i");
579+
bool extraInsideClose = false;
536580
switch (type)
537581
{
538582
case "array":
@@ -594,7 +638,6 @@ private static void WriteFieldReader(bool optional, bool nullable, string type,
594638
case "uint24":
595639
case "uint32":
596640
case "map32":
597-
case "epoch-s":
598641
case "cluster-id":
599642
case "attrib-id":
600643
case "field-id":
@@ -609,7 +652,6 @@ private static void WriteFieldReader(bool optional, bool nullable, string type,
609652
case "uint56":
610653
case "uint64":
611654
case "map64":
612-
case "epoch-us":
613655
case "fabric-id":
614656
case "node-id":
615657
case "EUI64":
@@ -635,21 +677,31 @@ private static void WriteFieldReader(bool optional, bool nullable, string type,
635677
case "Hardware Address":
636678
writer.WriteLine($"new PhysicalAddress(reader.GetBytes({id}, {(optional ? "true" : "false")}, 8, 6{(id == "-1" || id == "i" ? ")!))" : ")!)")};");
637679
return;
680+
case "epoch-s":
681+
includes.Add("MatterDotNet.Util");
682+
writer.Write($"TimeUtil.FromEpochSeconds(reader.GetUInt({id}");
683+
extraInsideClose = true;
684+
break;
638685
case "elapsed-s":
639-
writer.WriteLine($"TimeSpan.FromSeconds(reader.GetUInt({id}");
640-
extraClose = true;
686+
writer.Write($"TimeSpan.FromSeconds(reader.GetUInt({id}");
687+
extraInsideClose = true;
688+
break;
689+
case "epoch-us":
690+
includes.Add("MatterDotNet.Util");
691+
writer.Write($"TimeUtil.FromEpochUS(reader.GetULong({id}");
692+
extraInsideClose = true;
641693
break;
642694
case "ref_DataTypeSystemTimeUs":
643-
writer.WriteLine($"TimeSpan.FromMicroseconds(reader.GetULong({id}");
644-
extraClose = true;
695+
writer.Write($"TimeSpan.FromMicroseconds(reader.GetULong({id}");
696+
extraInsideClose = true;
645697
break;
646698
case "ref_DataTypeSystemTimeMs":
647-
writer.WriteLine($"TimeSpan.FromMilliseconds(reader.GetULong({id}");
648-
extraClose = true;
699+
writer.Write($"TimeSpan.FromMilliseconds(reader.GetULong({id}");
700+
extraInsideClose = true;
649701
break;
650702
case "ref_DataTypePosixMs":
651-
writer.WriteLine($"DateTimeOffset.FromUnixTimeMilliseconds(reader.GetULong({id}");
652-
extraClose = true;
703+
writer.Write($"DateTimeOffset.FromUnixTimeMilliseconds(reader.GetULong({id}");
704+
extraInsideClose = true;
653705
break;
654706
case "devtype-id":
655707
writer.Write($"(DeviceTypeEnum)reader.GetUInt({id}");
@@ -716,14 +768,20 @@ private static void WriteFieldReader(bool optional, bool nullable, string type,
716768
}
717769
return;
718770
}
719-
if (optional)
771+
if (extraInsideClose && (optional || nullable))
772+
{
773+
extraOutsideClose = true;
774+
extraInsideClose = false;
775+
}
776+
if (extraInsideClose)
777+
writer.Write(")");
778+
if (optional || nullable)
720779
writer.Write(", true)");
721780
else
722781
writer.Write(")!.Value");
723-
if (extraClose)
724-
writer.WriteLine(");");
725-
else
726-
writer.WriteLine(';');
782+
if (extraOutsideClose)
783+
writer.Write(")");
784+
writer.WriteLine(';');
727785
}
728786

729787
private static bool HasEnum(Cluster cluster, string name)
@@ -1192,7 +1250,6 @@ private static void WriteType(string type, string? entryType, TextWriter writer)
11921250
case "uint24":
11931251
case "uint32":
11941252
case "map32":
1195-
case "epoch-s":
11961253
case "cluster-id":
11971254
case "attrib-id":
11981255
case "field-id":
@@ -1210,12 +1267,16 @@ private static void WriteType(string type, string? entryType, TextWriter writer)
12101267
case "ref_DataTypePosixMs":
12111268
writer.Write("DateTimeOffset");
12121269
break;
1270+
case "epoch-s":
1271+
case "epoch-us":
1272+
includes.Add("MatterDotNet.Util");
1273+
writer.Write("DateTime");
1274+
break;
12131275
case "uint40":
12141276
case "uint48":
12151277
case "uint56":
12161278
case "uint64":
12171279
case "map64":
1218-
case "epoch-us":
12191280
case "fabric-id":
12201281
case "node-id":
12211282
case "EUI64":
@@ -1310,8 +1371,9 @@ private static string SanitizeDefault(string value, string? type = null, string?
13101371
return value.Split(' ')[0];
13111372
if (value.StartsWith('"'))
13121373
return value;
1313-
else
1314-
return value.ToLowerInvariant();
1374+
if (value == "0" && (type == "epoch-s" || type == "epoch-us"))
1375+
return "TimeUtil.EPOCH";
1376+
return value.ToLowerInvariant();
13151377
}
13161378

13171379
private static bool DefaultValid(string value)

0 commit comments

Comments
 (0)