Skip to content

Commit 4430188

Browse files
committed
Support JSON in Android ChipTool
1 parent 6a41891 commit 4430188

File tree

11 files changed

+320
-193
lines changed

11 files changed

+320
-193
lines changed

examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/BasicClientFragment.kt

+10-7
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,14 @@ import chip.devicecontroller.model.AttributeWriteRequest
1717
import chip.devicecontroller.model.ChipAttributePath
1818
import chip.devicecontroller.model.ChipEventPath
1919
import chip.devicecontroller.model.NodeState
20+
import chip.jsontlv.toAny
21+
import chip.tlv.AnonymousTag
22+
import chip.tlv.TlvReader
23+
import chip.tlv.TlvWriter
2024
import com.google.chip.chiptool.ChipClient
2125
import com.google.chip.chiptool.GenericChipDeviceListener
2226
import com.google.chip.chiptool.R
2327
import com.google.chip.chiptool.databinding.BasicClientFragmentBinding
24-
import com.google.chip.chiptool.util.TlvParseUtil
2528
import java.util.Optional
2629
import kotlinx.coroutines.CoroutineScope
2730
import kotlinx.coroutines.launch
@@ -55,7 +58,7 @@ class BasicClientFragment : Fragment() {
5558
// TODO : Need to be implement poj-to-tlv
5659
sendWriteAttribute(
5760
BasicInformation.Attribute.NodeLabel,
58-
TlvParseUtil.encode(binding.nodeLabelEd.text.toString())
61+
TlvWriter().put(AnonymousTag, binding.nodeLabelEd.text.toString()).getEncoded()
5962
)
6063
binding.nodeLabelEd.onEditorAction(EditorInfo.IME_ACTION_DONE)
6164
}
@@ -65,7 +68,7 @@ class BasicClientFragment : Fragment() {
6568
// TODO : Need to be implement poj-to-tlv
6669
sendWriteAttribute(
6770
BasicInformation.Attribute.Location,
68-
TlvParseUtil.encode(binding.locationEd.text.toString())
71+
TlvWriter().put(AnonymousTag, binding.locationEd.text.toString()).getEncoded()
6972
)
7073
binding.locationEd.onEditorAction(EditorInfo.IME_ACTION_DONE)
7174
}
@@ -75,7 +78,7 @@ class BasicClientFragment : Fragment() {
7578
// TODO : Need to be implement poj-to-tlv
7679
sendWriteAttribute(
7780
BasicInformation.Attribute.LocalConfigDisabled,
78-
TlvParseUtil.encode(isChecked)
81+
TlvWriter().put(AnonymousTag, isChecked).getEncoded()
7982
)
8083
}
8184
}
@@ -150,13 +153,13 @@ class BasicClientFragment : Fragment() {
150153
}
151154

152155
override fun onReport(nodeState: NodeState?) {
153-
val value =
156+
val tlv =
154157
nodeState
155158
?.getEndpointState(endpointId)
156159
?.getClusterState(clusterId)
157160
?.getAttributeState(attributeId)
158-
?.value
159-
?: "null"
161+
?.tlv
162+
val value = tlv?.let { TlvReader(it).toAny() }
160163
Log.i(TAG, "[Read Success] $attributeName: $value")
161164
showMessage("[Read Success] $attributeName: $value")
162165
}

examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/MultiAdminClientFragment.kt

+5-3
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ import chip.devicecontroller.model.ChipAttributePath
1616
import chip.devicecontroller.model.ChipEventPath
1717
import chip.devicecontroller.model.InvokeElement
1818
import chip.devicecontroller.model.NodeState
19+
import chip.jsontlv.toAny
1920
import chip.tlv.AnonymousTag
21+
import chip.tlv.TlvReader
2022
import chip.tlv.TlvWriter
2123
import com.google.chip.chiptool.ChipClient
2224
import com.google.chip.chiptool.GenericChipDeviceListener
@@ -209,13 +211,13 @@ class MultiAdminClientFragment : Fragment() {
209211
deviceController.readAttributePath(
210212
object : ReportCallback {
211213
override fun onReport(nodeState: NodeState?) {
212-
val value =
214+
val tlv =
213215
nodeState
214216
?.getEndpointState(endpointId)
215217
?.getClusterState(clusterId)
216218
?.getAttributeState(attributeId)
217-
?.value
218-
?: "null"
219+
?.tlv
220+
val value = tlv?.let { TlvReader(it).toAny() }
219221
Log.i(TAG, "read $attributeName: $value")
220222
showMessage("read $attributeName: $value")
221223
}

examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/OnOffClientFragment.kt

+6-5
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,15 @@ import chip.devicecontroller.model.ChipAttributePath
2222
import chip.devicecontroller.model.ChipEventPath
2323
import chip.devicecontroller.model.InvokeElement
2424
import chip.devicecontroller.model.NodeState
25+
import chip.jsontlv.toAny
2526
import chip.tlv.AnonymousTag
2627
import chip.tlv.ContextSpecificTag
28+
import chip.tlv.TlvReader
2729
import chip.tlv.TlvWriter
2830
import com.google.chip.chiptool.ChipClient
2931
import com.google.chip.chiptool.GenericChipDeviceListener
3032
import com.google.chip.chiptool.R
3133
import com.google.chip.chiptool.databinding.OnOffClientFragmentBinding
32-
import com.google.chip.chiptool.util.TlvParseUtil
3334
import java.text.SimpleDateFormat
3435
import java.util.Calendar
3536
import java.util.Locale
@@ -116,13 +117,13 @@ class OnOffClientFragment : Fragment() {
116117
}
117118

118119
override fun onReport(nodeState: NodeState?) {
119-
val value =
120+
val tlv =
120121
nodeState
121122
?.getEndpointState(endpointId)
122123
?.getClusterState(clusterId)
123124
?.getAttributeState(attributeId)
124-
?.value
125-
?: "null"
125+
?.tlv
126+
val value = tlv?.let { TlvReader(it).toAny() }
126127
Log.v(TAG, "On/Off attribute value: $value")
127128
showMessage("On/Off attribute value: $value")
128129
}
@@ -201,7 +202,7 @@ class OnOffClientFragment : Fragment() {
201202
?.tlv
202203
?: return
203204
// TODO : Need to be implement poj-to-tlv
204-
val value = TlvParseUtil.decodeBoolean(tlv)
205+
val value = TlvReader(tlv).getBool(AnonymousTag)
205206
val formatter = SimpleDateFormat("HH:mm:ss", Locale.getDefault())
206207
val time = formatter.format(Calendar.getInstance(Locale.getDefault()).time)
207208
val message = "Subscribed on/off value at $time: ${if (value) "ON" else "OFF"}"

examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/OpCredClientFragment.kt

+5-33
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,17 @@ import android.view.ViewGroup
88
import androidx.fragment.app.Fragment
99
import androidx.lifecycle.lifecycleScope
1010
import chip.devicecontroller.ChipDeviceController
11-
import chip.devicecontroller.ChipStructs
12-
import chip.devicecontroller.ChipTLVValueDecoder
1311
import chip.devicecontroller.ClusterIDMapping.OperationalCredentials
1412
import chip.devicecontroller.InvokeCallback
1513
import chip.devicecontroller.ReportCallback
1614
import chip.devicecontroller.model.ChipAttributePath
1715
import chip.devicecontroller.model.ChipEventPath
1816
import chip.devicecontroller.model.InvokeElement
1917
import chip.devicecontroller.model.NodeState
18+
import chip.jsontlv.toAny
2019
import chip.tlv.AnonymousTag
2120
import chip.tlv.ContextSpecificTag
21+
import chip.tlv.TlvReader
2222
import chip.tlv.TlvWriter
2323
import com.google.chip.chiptool.ChipClient
2424
import com.google.chip.chiptool.GenericChipDeviceListener
@@ -115,44 +115,16 @@ class OpCredClientFragment : Fragment() {
115115
}
116116

117117
override fun onReport(nodeState: NodeState?) {
118-
val value =
119-
nodeState
120-
?.getEndpointState(endpointId)
121-
?.getClusterState(clusterId)
122-
?.getAttributeState(attributeId)
123-
?.value
124-
?: "null"
125118
val tlv =
126119
nodeState
127120
?.getEndpointState(endpointId)
128121
?.getClusterState(clusterId)
129122
?.getAttributeState(attributeId)
130123
?.tlv
131124

132-
if (tlv == null) {
133-
Log.i(TAG, "OpCred $attributeName value: $value")
134-
showMessage("OpCred $attributeName value: $value")
135-
return
136-
}
137-
138-
val attributePath = ChipAttributePath.newInstance(endpointId, clusterId, attributeId)
139-
when (attribute) {
140-
OperationalCredentials.Attribute.Fabrics -> {
141-
val ret =
142-
ChipTLVValueDecoder.decodeAttributeValue<
143-
List<ChipStructs.OperationalCredentialsClusterFabricDescriptorStruct>
144-
>(
145-
attributePath,
146-
tlv
147-
)
148-
Log.i(TAG, "OpCred $attributeName value: $value")
149-
showMessage(ret.toString())
150-
}
151-
else -> {
152-
Log.i(TAG, "OpCred $attributeName value: $value")
153-
showMessage("OpCred $attributeName value: $value")
154-
}
155-
}
125+
val value = tlv?.let { TlvReader(it).toAny() }
126+
Log.i(TAG, "OpCred $attributeName value: $value")
127+
showMessage("OpCred $attributeName value: $value")
156128
}
157129
},
158130
devicePtr,

examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/SensorClientFragment.kt

+3-2
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,12 @@ import chip.devicecontroller.ReportCallback
1717
import chip.devicecontroller.model.ChipAttributePath
1818
import chip.devicecontroller.model.ChipEventPath
1919
import chip.devicecontroller.model.NodeState
20+
import chip.tlv.AnonymousTag
21+
import chip.tlv.TlvReader
2022
import com.google.chip.chiptool.ChipClient
2123
import com.google.chip.chiptool.R
2224
import com.google.chip.chiptool.databinding.SensorClientFragmentBinding
2325
import com.google.chip.chiptool.util.DeviceIdUtil
24-
import com.google.chip.chiptool.util.TlvParseUtil
2526
import com.jjoe64.graphview.LabelFormatter
2627
import com.jjoe64.graphview.Viewport
2728
import com.jjoe64.graphview.series.DataPoint
@@ -224,7 +225,7 @@ class SensorClientFragment : Fragment() {
224225
// TODO : Need to be implement poj-to-tlv
225226
val value =
226227
try {
227-
TlvParseUtil.decodeInt(tlv)
228+
TlvReader(tlv).getInt(AnonymousTag)
228229
} catch (ex: Exception) {
229230
showMessage(R.string.sensor_client_read_error_text, "value is null")
230231
return

examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/WildcardFragment.kt

+40-44
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import chip.devicecontroller.model.ChipEventPath
2727
import chip.devicecontroller.model.ChipPathId
2828
import chip.devicecontroller.model.InvokeElement
2929
import chip.devicecontroller.model.NodeState
30+
import chip.jsontlv.putJsonString
3031
import chip.tlv.AnonymousTag
3132
import chip.tlv.ContextSpecificTag
3233
import chip.tlv.TlvReader
@@ -305,19 +306,6 @@ class WildcardFragment : Fragment() {
305306
val endpointId = getChipPathIdForText(binding.endpointIdEd.text.toString())
306307
val clusterId = getChipPathIdForText(binding.clusterIdEd.text.toString())
307308
val attributeId = getChipPathIdForText(binding.attributeIdEd.text.toString())
308-
val tlvWriter = TlvWriter()
309-
val values = writeValue.split(",")
310-
311-
if (values.size > 1) tlvWriter.startArray(AnonymousTag)
312-
for (value in values) {
313-
try {
314-
TLV_MAP[writeValueType]?.generate(tlvWriter, value.trim())
315-
} catch (ex: Exception) {
316-
Log.e(TAG, "Invalid Data Type", ex)
317-
return
318-
}
319-
}
320-
if (values.size > 1) tlvWriter.endArray()
321309

322310
val version =
323311
if (dataVersion == null) {
@@ -326,14 +314,35 @@ class WildcardFragment : Fragment() {
326314
Optional.of(dataVersion)
327315
}
328316

329-
val writeRequest =
330-
AttributeWriteRequest.newInstance(
331-
endpointId,
332-
clusterId,
333-
attributeId,
334-
tlvWriter.getEncoded(),
335-
version
336-
)
317+
lateinit var writeRequest: AttributeWriteRequest
318+
319+
if (writeValueType == "json") {
320+
writeRequest = AttributeWriteRequest.newInstance(endpointId, clusterId, attributeId, writeValue, version)
321+
} else {
322+
val tlvWriter = TlvWriter()
323+
val values = writeValue.split(",")
324+
325+
if (values.size > 1) tlvWriter.startArray(AnonymousTag)
326+
for (value in values) {
327+
try {
328+
TLV_MAP[writeValueType]?.generate(tlvWriter, value.trim())
329+
} catch (ex: Exception) {
330+
Log.e(TAG, "Invalid Data Type", ex)
331+
return
332+
}
333+
}
334+
if (values.size > 1) tlvWriter.endArray()
335+
336+
writeRequest =
337+
AttributeWriteRequest.newInstance(
338+
endpointId,
339+
clusterId,
340+
attributeId,
341+
tlvWriter.getEncoded(),
342+
version
343+
)
344+
}
345+
337346
deviceController.write(
338347
writeAttributeCallback,
339348
ChipClient.getConnectedDevicePointer(requireContext(), addressUpdateFragment.deviceId),
@@ -343,35 +352,16 @@ class WildcardFragment : Fragment() {
343352
)
344353
}
345354

346-
private suspend fun invoke(invokeField: String, timedRequestTimeoutMs: Int, imTimeoutMs: Int) {
355+
private suspend fun invoke(invokeJson: String, timedRequestTimeoutMs: Int, imTimeoutMs: Int) {
347356
val endpointId = getChipPathIdForText(binding.endpointIdEd.text.toString())
348357
val clusterId = getChipPathIdForText(binding.clusterIdEd.text.toString())
349358
val commandId = getChipPathIdForText(binding.commandIdEd.text.toString())
350359

351-
val tlvWriter = TlvWriter()
352-
val fields =
353-
if (invokeField.isEmpty()) {
354-
listOf()
355-
} else {
356-
invokeField.split(",")
357-
}
358-
var count = 0
359-
tlvWriter.startStructure(AnonymousTag)
360-
for (field in fields) {
361-
try {
362-
val type = field.split(":")[0]
363-
val value = field.split(":")[1]
364-
365-
Log.d(TAG, "value : $type - $value")
366-
TLV_MAP[type]?.generate(tlvWriter, value.trim(), ContextSpecificTag(count++))
367-
} catch (ex: Exception) {
368-
Log.e(TAG, "Invalid value", ex)
369-
return
370-
}
360+
val jsonString = invokeJson.ifEmpty {
361+
"{}"
371362
}
372-
tlvWriter.endStructure()
373363
val invokeElement =
374-
InvokeElement.newInstance(endpointId, clusterId, commandId, tlvWriter.getEncoded(), null)
364+
InvokeElement.newInstance(endpointId, clusterId, commandId, null, jsonString)
375365
deviceController.invoke(
376366
invokeCallback,
377367
ChipClient.getConnectedDevicePointer(requireContext(), addressUpdateFragment.deviceId),
@@ -652,6 +642,12 @@ class WildcardFragment : Fragment() {
652642

653643
private val TLV_MAP =
654644
mapOf(
645+
"json" to
646+
object : TlvWriterInterface {
647+
override fun generate(writer: TlvWriter, value: String, tag: chip.tlv.Tag) {
648+
writer.putJsonString(tag, value)
649+
}
650+
},
655651
"UnsignedInt" to
656652
object : TlvWriterInterface {
657653
override fun generate(writer: TlvWriter, value: String, tag: chip.tlv.Tag) {

0 commit comments

Comments
 (0)